var Oidc = /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 0); /******/ }) /************************************************************************/ /******/ ({ /***/ "./index.js": /*!******************!*\ !*** ./index.js ***! \******************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _Log = __webpack_require__(/*! ./src/Log.js */ "./src/Log.js"); var _OidcClient = __webpack_require__(/*! ./src/OidcClient.js */ "./src/OidcClient.js"); var _OidcClientSettings = __webpack_require__(/*! ./src/OidcClientSettings.js */ "./src/OidcClientSettings.js"); var _WebStorageStateStore = __webpack_require__(/*! ./src/WebStorageStateStore.js */ "./src/WebStorageStateStore.js"); var _InMemoryWebStorage = __webpack_require__(/*! ./src/InMemoryWebStorage.js */ "./src/InMemoryWebStorage.js"); var _UserManager = __webpack_require__(/*! ./src/UserManager.js */ "./src/UserManager.js"); var _AccessTokenEvents = __webpack_require__(/*! ./src/AccessTokenEvents.js */ "./src/AccessTokenEvents.js"); var _MetadataService = __webpack_require__(/*! ./src/MetadataService.js */ "./src/MetadataService.js"); var _CordovaPopupNavigator = __webpack_require__(/*! ./src/CordovaPopupNavigator.js */ "./src/CordovaPopupNavigator.js"); var _CordovaIFrameNavigator = __webpack_require__(/*! ./src/CordovaIFrameNavigator.js */ "./src/CordovaIFrameNavigator.js"); var _CheckSessionIFrame = __webpack_require__(/*! ./src/CheckSessionIFrame.js */ "./src/CheckSessionIFrame.js"); var _TokenRevocationClient = __webpack_require__(/*! ./src/TokenRevocationClient.js */ "./src/TokenRevocationClient.js"); var _SessionMonitor = __webpack_require__(/*! ./src/SessionMonitor.js */ "./src/SessionMonitor.js"); var _Global = __webpack_require__(/*! ./src/Global.js */ "./src/Global.js"); var _User = __webpack_require__(/*! ./src/User.js */ "./src/User.js"); var _version = __webpack_require__(/*! ./version.js */ "./version.js"); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. exports.default = { Version: _version.Version, Log: _Log.Log, OidcClient: _OidcClient.OidcClient, OidcClientSettings: _OidcClientSettings.OidcClientSettings, WebStorageStateStore: _WebStorageStateStore.WebStorageStateStore, InMemoryWebStorage: _InMemoryWebStorage.InMemoryWebStorage, UserManager: _UserManager.UserManager, AccessTokenEvents: _AccessTokenEvents.AccessTokenEvents, MetadataService: _MetadataService.MetadataService, CordovaPopupNavigator: _CordovaPopupNavigator.CordovaPopupNavigator, CordovaIFrameNavigator: _CordovaIFrameNavigator.CordovaIFrameNavigator, CheckSessionIFrame: _CheckSessionIFrame.CheckSessionIFrame, TokenRevocationClient: _TokenRevocationClient.TokenRevocationClient, SessionMonitor: _SessionMonitor.SessionMonitor, Global: _Global.Global, User: _User.User }; module.exports = exports['default']; /***/ }), /***/ "./jsrsasign/dist/jsrsasign.js": /*!*************************************!*\ !*** ./jsrsasign/dist/jsrsasign.js ***! \*************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(Buffer) { Object.defineProperty(exports, "__esModule", { value: true }); var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; /* * jsrsasign(all) 8.0.12 (2018-04-22) (c) 2010-2018 Kenji Urushima | kjur.github.com/jsrsasign/license */ var navigator = {}; navigator.userAgent = false; var window = {}; /*! Copyright (c) 2011, Yahoo! Inc. All rights reserved. Code licensed under the BSD License: http://developer.yahoo.com/yui/license.html version: 2.9.0 */ if (YAHOO === undefined) { var YAHOO = {}; }YAHOO.lang = { extend: function extend(g, h, f) { if (!h || !g) { throw new Error("YAHOO.lang.extend failed, please check that all dependencies are included."); }var d = function d() {};d.prototype = h.prototype;g.prototype = new d();g.prototype.constructor = g;g.superclass = h.prototype;if (h.prototype.constructor == Object.prototype.constructor) { h.prototype.constructor = h; }if (f) { var b;for (b in f) { g.prototype[b] = f[b]; }var e = function e() {}, c = ["toString", "valueOf"];try { if (/MSIE/.test(navigator.userAgent)) { e = function e(j, i) { for (b = 0; b < c.length; b = b + 1) { var l = c[b], k = i[l];if (typeof k === "function" && k != Object.prototype[l]) { j[l] = k; } } }; } } catch (a) {}e(g.prototype, f); } } }; /*! CryptoJS v3.1.2 core-fix.js * code.google.com/p/crypto-js * (c) 2009-2013 by Jeff Mott. All rights reserved. * code.google.com/p/crypto-js/wiki/License * THIS IS FIX of 'core.js' to fix Hmac issue. * https://code.google.com/p/crypto-js/issues/detail?id=84 * https://crypto-js.googlecode.com/svn-history/r667/branches/3.x/src/core.js */ var CryptoJS = CryptoJS || function (e, g) { var a = {};var b = a.lib = {};var j = b.Base = function () { function n() {}return { extend: function extend(p) { n.prototype = this;var o = new n();if (p) { o.mixIn(p); }if (!o.hasOwnProperty("init")) { o.init = function () { o.$super.init.apply(this, arguments); }; }o.init.prototype = o;o.$super = this;return o; }, create: function create() { var o = this.extend();o.init.apply(o, arguments);return o; }, init: function init() {}, mixIn: function mixIn(p) { for (var o in p) { if (p.hasOwnProperty(o)) { this[o] = p[o]; } }if (p.hasOwnProperty("toString")) { this.toString = p.toString; } }, clone: function clone() { return this.init.prototype.extend(this); } }; }();var l = b.WordArray = j.extend({ init: function init(o, n) { o = this.words = o || [];if (n != g) { this.sigBytes = n; } else { this.sigBytes = o.length * 4; } }, toString: function toString(n) { return (n || h).stringify(this); }, concat: function concat(t) { var q = this.words;var p = t.words;var n = this.sigBytes;var s = t.sigBytes;this.clamp();if (n % 4) { for (var r = 0; r < s; r++) { var o = p[r >>> 2] >>> 24 - r % 4 * 8 & 255;q[n + r >>> 2] |= o << 24 - (n + r) % 4 * 8; } } else { for (var r = 0; r < s; r += 4) { q[n + r >>> 2] = p[r >>> 2]; } }this.sigBytes += s;return this; }, clamp: function clamp() { var o = this.words;var n = this.sigBytes;o[n >>> 2] &= 4294967295 << 32 - n % 4 * 8;o.length = e.ceil(n / 4); }, clone: function clone() { var n = j.clone.call(this);n.words = this.words.slice(0);return n; }, random: function random(p) { var o = [];for (var n = 0; n < p; n += 4) { o.push(e.random() * 4294967296 | 0); }return new l.init(o, p); } });var m = a.enc = {};var h = m.Hex = { stringify: function stringify(p) { var r = p.words;var o = p.sigBytes;var q = [];for (var n = 0; n < o; n++) { var s = r[n >>> 2] >>> 24 - n % 4 * 8 & 255;q.push((s >>> 4).toString(16));q.push((s & 15).toString(16)); }return q.join(""); }, parse: function parse(p) { var n = p.length;var q = [];for (var o = 0; o < n; o += 2) { q[o >>> 3] |= parseInt(p.substr(o, 2), 16) << 24 - o % 8 * 4; }return new l.init(q, n / 2); } };var d = m.Latin1 = { stringify: function stringify(q) { var r = q.words;var p = q.sigBytes;var n = [];for (var o = 0; o < p; o++) { var s = r[o >>> 2] >>> 24 - o % 4 * 8 & 255;n.push(String.fromCharCode(s)); }return n.join(""); }, parse: function parse(p) { var n = p.length;var q = [];for (var o = 0; o < n; o++) { q[o >>> 2] |= (p.charCodeAt(o) & 255) << 24 - o % 4 * 8; }return new l.init(q, n); } };var c = m.Utf8 = { stringify: function stringify(n) { try { return decodeURIComponent(escape(d.stringify(n))); } catch (o) { throw new Error("Malformed UTF-8 data"); } }, parse: function parse(n) { return d.parse(unescape(encodeURIComponent(n))); } };var i = b.BufferedBlockAlgorithm = j.extend({ reset: function reset() { this._data = new l.init();this._nDataBytes = 0; }, _append: function _append(n) { if (typeof n == "string") { n = c.parse(n); }this._data.concat(n);this._nDataBytes += n.sigBytes; }, _process: function _process(w) { var q = this._data;var x = q.words;var n = q.sigBytes;var t = this.blockSize;var v = t * 4;var u = n / v;if (w) { u = e.ceil(u); } else { u = e.max((u | 0) - this._minBufferSize, 0); }var s = u * t;var r = e.min(s * 4, n);if (s) { for (var p = 0; p < s; p += t) { this._doProcessBlock(x, p); }var o = x.splice(0, s);q.sigBytes -= r; }return new l.init(o, r); }, clone: function clone() { var n = j.clone.call(this);n._data = this._data.clone();return n; }, _minBufferSize: 0 });var f = b.Hasher = i.extend({ cfg: j.extend(), init: function init(n) { this.cfg = this.cfg.extend(n);this.reset(); }, reset: function reset() { i.reset.call(this);this._doReset(); }, update: function update(n) { this._append(n);this._process();return this; }, finalize: function finalize(n) { if (n) { this._append(n); }var o = this._doFinalize();return o; }, blockSize: 512 / 32, _createHelper: function _createHelper(n) { return function (p, o) { return new n.init(o).finalize(p); }; }, _createHmacHelper: function _createHmacHelper(n) { return function (p, o) { return new k.HMAC.init(n, o).finalize(p); }; } });var k = a.algo = {};return a; }(Math); /* CryptoJS v3.1.2 x64-core-min.js code.google.com/p/crypto-js (c) 2009-2013 by Jeff Mott. All rights reserved. code.google.com/p/crypto-js/wiki/License */ (function (g) { var a = CryptoJS, f = a.lib, e = f.Base, h = f.WordArray, a = a.x64 = {};a.Word = e.extend({ init: function init(b, c) { this.high = b;this.low = c; } });a.WordArray = e.extend({ init: function init(b, c) { b = this.words = b || [];this.sigBytes = c != g ? c : 8 * b.length; }, toX32: function toX32() { for (var b = this.words, c = b.length, a = [], d = 0; d < c; d++) { var e = b[d];a.push(e.high);a.push(e.low); }return h.create(a, this.sigBytes); }, clone: function clone() { for (var b = e.clone.call(this), c = b.words = this.words.slice(0), a = c.length, d = 0; d < a; d++) { c[d] = c[d].clone(); }return b; } }); })(); /* CryptoJS v3.1.2 enc-base64.js code.google.com/p/crypto-js (c) 2009-2013 by Jeff Mott. All rights reserved. code.google.com/p/crypto-js/wiki/License */ (function () { var h = CryptoJS, j = h.lib.WordArray;h.enc.Base64 = { stringify: function stringify(b) { var e = b.words, f = b.sigBytes, c = this._map;b.clamp();b = [];for (var a = 0; a < f; a += 3) { for (var d = (e[a >>> 2] >>> 24 - 8 * (a % 4) & 255) << 16 | (e[a + 1 >>> 2] >>> 24 - 8 * ((a + 1) % 4) & 255) << 8 | e[a + 2 >>> 2] >>> 24 - 8 * ((a + 2) % 4) & 255, g = 0; 4 > g && a + 0.75 * g < f; g++) { b.push(c.charAt(d >>> 6 * (3 - g) & 63)); } }if (e = c.charAt(64)) for (; b.length % 4;) { b.push(e); }return b.join(""); }, parse: function parse(b) { var e = b.length, f = this._map, c = f.charAt(64);c && (c = b.indexOf(c), -1 != c && (e = c));for (var c = [], a = 0, d = 0; d < e; d++) { if (d % 4) { var g = f.indexOf(b.charAt(d - 1)) << 2 * (d % 4), h = f.indexOf(b.charAt(d)) >>> 6 - 2 * (d % 4);c[a >>> 2] |= (g | h) << 24 - 8 * (a % 4);a++; } }return j.create(c, a); }, _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" }; })(); /* CryptoJS v3.1.2 sha256-min.js code.google.com/p/crypto-js (c) 2009-2013 by Jeff Mott. All rights reserved. code.google.com/p/crypto-js/wiki/License */ (function (k) { for (var g = CryptoJS, h = g.lib, v = h.WordArray, j = h.Hasher, h = g.algo, s = [], t = [], u = function u(q) { return 4294967296 * (q - (q | 0)) | 0; }, l = 2, b = 0; 64 > b;) { var d;a: { d = l;for (var w = k.sqrt(d), r = 2; r <= w; r++) { if (!(d % r)) { d = !1;break a; } }d = !0; }d && (8 > b && (s[b] = u(k.pow(l, 0.5))), t[b] = u(k.pow(l, 1 / 3)), b++);l++; }var n = [], h = h.SHA256 = j.extend({ _doReset: function _doReset() { this._hash = new v.init(s.slice(0)); }, _doProcessBlock: function _doProcessBlock(q, h) { for (var a = this._hash.words, c = a[0], d = a[1], b = a[2], k = a[3], f = a[4], g = a[5], j = a[6], l = a[7], e = 0; 64 > e; e++) { if (16 > e) n[e] = q[h + e] | 0;else { var m = n[e - 15], p = n[e - 2];n[e] = ((m << 25 | m >>> 7) ^ (m << 14 | m >>> 18) ^ m >>> 3) + n[e - 7] + ((p << 15 | p >>> 17) ^ (p << 13 | p >>> 19) ^ p >>> 10) + n[e - 16]; }m = l + ((f << 26 | f >>> 6) ^ (f << 21 | f >>> 11) ^ (f << 7 | f >>> 25)) + (f & g ^ ~f & j) + t[e] + n[e];p = ((c << 30 | c >>> 2) ^ (c << 19 | c >>> 13) ^ (c << 10 | c >>> 22)) + (c & d ^ c & b ^ d & b);l = j;j = g;g = f;f = k + m | 0;k = b;b = d;d = c;c = m + p | 0; }a[0] = a[0] + c | 0;a[1] = a[1] + d | 0;a[2] = a[2] + b | 0;a[3] = a[3] + k | 0;a[4] = a[4] + f | 0;a[5] = a[5] + g | 0;a[6] = a[6] + j | 0;a[7] = a[7] + l | 0; }, _doFinalize: function _doFinalize() { var d = this._data, b = d.words, a = 8 * this._nDataBytes, c = 8 * d.sigBytes; b[c >>> 5] |= 128 << 24 - c % 32;b[(c + 64 >>> 9 << 4) + 14] = k.floor(a / 4294967296);b[(c + 64 >>> 9 << 4) + 15] = a;d.sigBytes = 4 * b.length;this._process();return this._hash; }, clone: function clone() { var b = j.clone.call(this);b._hash = this._hash.clone();return b; } });g.SHA256 = j._createHelper(h);g.HmacSHA256 = j._createHmacHelper(h); })(Math); /* CryptoJS v3.1.2 sha512-min.js code.google.com/p/crypto-js (c) 2009-2013 by Jeff Mott. All rights reserved. code.google.com/p/crypto-js/wiki/License */ (function () { function a() { return d.create.apply(d, arguments); }for (var n = CryptoJS, r = n.lib.Hasher, e = n.x64, d = e.Word, T = e.WordArray, e = n.algo, ea = [a(1116352408, 3609767458), a(1899447441, 602891725), a(3049323471, 3964484399), a(3921009573, 2173295548), a(961987163, 4081628472), a(1508970993, 3053834265), a(2453635748, 2937671579), a(2870763221, 3664609560), a(3624381080, 2734883394), a(310598401, 1164996542), a(607225278, 1323610764), a(1426881987, 3590304994), a(1925078388, 4068182383), a(2162078206, 991336113), a(2614888103, 633803317), a(3248222580, 3479774868), a(3835390401, 2666613458), a(4022224774, 944711139), a(264347078, 2341262773), a(604807628, 2007800933), a(770255983, 1495990901), a(1249150122, 1856431235), a(1555081692, 3175218132), a(1996064986, 2198950837), a(2554220882, 3999719339), a(2821834349, 766784016), a(2952996808, 2566594879), a(3210313671, 3203337956), a(3336571891, 1034457026), a(3584528711, 2466948901), a(113926993, 3758326383), a(338241895, 168717936), a(666307205, 1188179964), a(773529912, 1546045734), a(1294757372, 1522805485), a(1396182291, 2643833823), a(1695183700, 2343527390), a(1986661051, 1014477480), a(2177026350, 1206759142), a(2456956037, 344077627), a(2730485921, 1290863460), a(2820302411, 3158454273), a(3259730800, 3505952657), a(3345764771, 106217008), a(3516065817, 3606008344), a(3600352804, 1432725776), a(4094571909, 1467031594), a(275423344, 851169720), a(430227734, 3100823752), a(506948616, 1363258195), a(659060556, 3750685593), a(883997877, 3785050280), a(958139571, 3318307427), a(1322822218, 3812723403), a(1537002063, 2003034995), a(1747873779, 3602036899), a(1955562222, 1575990012), a(2024104815, 1125592928), a(2227730452, 2716904306), a(2361852424, 442776044), a(2428436474, 593698344), a(2756734187, 3733110249), a(3204031479, 2999351573), a(3329325298, 3815920427), a(3391569614, 3928383900), a(3515267271, 566280711), a(3940187606, 3454069534), a(4118630271, 4000239992), a(116418474, 1914138554), a(174292421, 2731055270), a(289380356, 3203993006), a(460393269, 320620315), a(685471733, 587496836), a(852142971, 1086792851), a(1017036298, 365543100), a(1126000580, 2618297676), a(1288033470, 3409855158), a(1501505948, 4234509866), a(1607167915, 987167468), a(1816402316, 1246189591)], v = [], w = 0; 80 > w; w++) { v[w] = a(); }e = e.SHA512 = r.extend({ _doReset: function _doReset() { this._hash = new T.init([new d.init(1779033703, 4089235720), new d.init(3144134277, 2227873595), new d.init(1013904242, 4271175723), new d.init(2773480762, 1595750129), new d.init(1359893119, 2917565137), new d.init(2600822924, 725511199), new d.init(528734635, 4215389547), new d.init(1541459225, 327033209)]); }, _doProcessBlock: function _doProcessBlock(a, d) { for (var f = this._hash.words, F = f[0], e = f[1], n = f[2], r = f[3], G = f[4], H = f[5], I = f[6], f = f[7], w = F.high, J = F.low, X = e.high, K = e.low, Y = n.high, L = n.low, Z = r.high, M = r.low, $ = G.high, N = G.low, aa = H.high, O = H.low, ba = I.high, P = I.low, ca = f.high, Q = f.low, k = w, g = J, z = X, x = K, A = Y, y = L, U = Z, B = M, l = $, h = N, R = aa, C = O, S = ba, D = P, V = ca, E = Q, m = 0; 80 > m; m++) { var s = v[m];if (16 > m) var j = s.high = a[d + 2 * m] | 0, b = s.low = a[d + 2 * m + 1] | 0;else { var j = v[m - 15], b = j.high, p = j.low, j = (b >>> 1 | p << 31) ^ (b >>> 8 | p << 24) ^ b >>> 7, p = (p >>> 1 | b << 31) ^ (p >>> 8 | b << 24) ^ (p >>> 7 | b << 25), u = v[m - 2], b = u.high, c = u.low, u = (b >>> 19 | c << 13) ^ (b << 3 | c >>> 29) ^ b >>> 6, c = (c >>> 19 | b << 13) ^ (c << 3 | b >>> 29) ^ (c >>> 6 | b << 26), b = v[m - 7], W = b.high, t = v[m - 16], q = t.high, t = t.low, b = p + b.low, j = j + W + (b >>> 0 < p >>> 0 ? 1 : 0), b = b + c, j = j + u + (b >>> 0 < c >>> 0 ? 1 : 0), b = b + t, j = j + q + (b >>> 0 < t >>> 0 ? 1 : 0);s.high = j;s.low = b; }var W = l & R ^ ~l & S, t = h & C ^ ~h & D, s = k & z ^ k & A ^ z & A, T = g & x ^ g & y ^ x & y, p = (k >>> 28 | g << 4) ^ (k << 30 | g >>> 2) ^ (k << 25 | g >>> 7), u = (g >>> 28 | k << 4) ^ (g << 30 | k >>> 2) ^ (g << 25 | k >>> 7), c = ea[m], fa = c.high, da = c.low, c = E + ((h >>> 14 | l << 18) ^ (h >>> 18 | l << 14) ^ (h << 23 | l >>> 9)), q = V + ((l >>> 14 | h << 18) ^ (l >>> 18 | h << 14) ^ (l << 23 | h >>> 9)) + (c >>> 0 < E >>> 0 ? 1 : 0), c = c + t, q = q + W + (c >>> 0 < t >>> 0 ? 1 : 0), c = c + da, q = q + fa + (c >>> 0 < da >>> 0 ? 1 : 0), c = c + b, q = q + j + (c >>> 0 < b >>> 0 ? 1 : 0), b = u + T, s = p + s + (b >>> 0 < u >>> 0 ? 1 : 0), V = S, E = D, S = R, D = C, R = l, C = h, h = B + c | 0, l = U + q + (h >>> 0 < B >>> 0 ? 1 : 0) | 0, U = A, B = y, A = z, y = x, z = k, x = g, g = c + b | 0, k = q + s + (g >>> 0 < c >>> 0 ? 1 : 0) | 0; }J = F.low = J + g;F.high = w + k + (J >>> 0 < g >>> 0 ? 1 : 0);K = e.low = K + x;e.high = X + z + (K >>> 0 < x >>> 0 ? 1 : 0);L = n.low = L + y;n.high = Y + A + (L >>> 0 < y >>> 0 ? 1 : 0);M = r.low = M + B;r.high = Z + U + (M >>> 0 < B >>> 0 ? 1 : 0);N = G.low = N + h;G.high = $ + l + (N >>> 0 < h >>> 0 ? 1 : 0);O = H.low = O + C;H.high = aa + R + (O >>> 0 < C >>> 0 ? 1 : 0);P = I.low = P + D; I.high = ba + S + (P >>> 0 < D >>> 0 ? 1 : 0);Q = f.low = Q + E;f.high = ca + V + (Q >>> 0 < E >>> 0 ? 1 : 0); }, _doFinalize: function _doFinalize() { var a = this._data, d = a.words, f = 8 * this._nDataBytes, e = 8 * a.sigBytes;d[e >>> 5] |= 128 << 24 - e % 32;d[(e + 128 >>> 10 << 5) + 30] = Math.floor(f / 4294967296);d[(e + 128 >>> 10 << 5) + 31] = f;a.sigBytes = 4 * d.length;this._process();return this._hash.toX32(); }, clone: function clone() { var a = r.clone.call(this);a._hash = this._hash.clone();return a; }, blockSize: 32 });n.SHA512 = r._createHelper(e);n.HmacSHA512 = r._createHmacHelper(e); })(); /* CryptoJS v3.1.2 sha384-min.js code.google.com/p/crypto-js (c) 2009-2013 by Jeff Mott. All rights reserved. code.google.com/p/crypto-js/wiki/License */ (function () { var c = CryptoJS, a = c.x64, b = a.Word, e = a.WordArray, a = c.algo, d = a.SHA512, a = a.SHA384 = d.extend({ _doReset: function _doReset() { this._hash = new e.init([new b.init(3418070365, 3238371032), new b.init(1654270250, 914150663), new b.init(2438529370, 812702999), new b.init(355462360, 4144912697), new b.init(1731405415, 4290775857), new b.init(2394180231, 1750603025), new b.init(3675008525, 1694076839), new b.init(1203062813, 3204075428)]); }, _doFinalize: function _doFinalize() { var a = d._doFinalize.call(this);a.sigBytes -= 16;return a; } });c.SHA384 = d._createHelper(a);c.HmacSHA384 = d._createHmacHelper(a); })(); /*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/ */ var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var b64pad = "=";function hex2b64(d) { var b;var e;var a = "";for (b = 0; b + 3 <= d.length; b += 3) { e = parseInt(d.substring(b, b + 3), 16);a += b64map.charAt(e >> 6) + b64map.charAt(e & 63); }if (b + 1 == d.length) { e = parseInt(d.substring(b, b + 1), 16);a += b64map.charAt(e << 2); } else { if (b + 2 == d.length) { e = parseInt(d.substring(b, b + 2), 16);a += b64map.charAt(e >> 2) + b64map.charAt((e & 3) << 4); } }if (b64pad) { while ((a.length & 3) > 0) { a += b64pad; } }return a; }function b64tohex(f) { var d = "";var e;var b = 0;var c;var a;for (e = 0; e < f.length; ++e) { if (f.charAt(e) == b64pad) { break; }a = b64map.indexOf(f.charAt(e));if (a < 0) { continue; }if (b == 0) { d += int2char(a >> 2);c = a & 3;b = 1; } else { if (b == 1) { d += int2char(c << 2 | a >> 4);c = a & 15;b = 2; } else { if (b == 2) { d += int2char(c);d += int2char(a >> 2);c = a & 3;b = 3; } else { d += int2char(c << 2 | a >> 4);d += int2char(a & 15);b = 0; } } } }if (b == 1) { d += int2char(c << 2); }return d; }function b64toBA(e) { var d = b64tohex(e);var c;var b = new Array();for (c = 0; 2 * c < d.length; ++c) { b[c] = parseInt(d.substring(2 * c, 2 * c + 2), 16); }return b; }; /*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/ */ var dbits;var canary = 244837814094590;var j_lm = (canary & 16777215) == 15715070;function BigInteger(e, d, f) { if (e != null) { if ("number" == typeof e) { this.fromNumber(e, d, f); } else { if (d == null && "string" != typeof e) { this.fromString(e, 256); } else { this.fromString(e, d); } } } }function nbi() { return new BigInteger(null); }function am1(f, a, b, e, h, g) { while (--g >= 0) { var d = a * this[f++] + b[e] + h;h = Math.floor(d / 67108864);b[e++] = d & 67108863; }return h; }function am2(f, q, r, e, o, a) { var k = q & 32767, p = q >> 15;while (--a >= 0) { var d = this[f] & 32767;var g = this[f++] >> 15;var b = p * d + g * k;d = k * d + ((b & 32767) << 15) + r[e] + (o & 1073741823);o = (d >>> 30) + (b >>> 15) + p * g + (o >>> 30);r[e++] = d & 1073741823; }return o; }function am3(f, q, r, e, o, a) { var k = q & 16383, p = q >> 14;while (--a >= 0) { var d = this[f] & 16383;var g = this[f++] >> 14;var b = p * d + g * k;d = k * d + ((b & 16383) << 14) + r[e] + o;o = (d >> 28) + (b >> 14) + p * g;r[e++] = d & 268435455; }return o; }if (j_lm && navigator.appName == "Microsoft Internet Explorer") { BigInteger.prototype.am = am2;dbits = 30; } else { if (j_lm && navigator.appName != "Netscape") { BigInteger.prototype.am = am1;dbits = 26; } else { BigInteger.prototype.am = am3;dbits = 28; } }BigInteger.prototype.DB = dbits;BigInteger.prototype.DM = (1 << dbits) - 1;BigInteger.prototype.DV = 1 << dbits;var BI_FP = 52;BigInteger.prototype.FV = Math.pow(2, BI_FP);BigInteger.prototype.F1 = BI_FP - dbits;BigInteger.prototype.F2 = 2 * dbits - BI_FP;var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";var BI_RC = new Array();var rr, vv;rr = "0".charCodeAt(0);for (vv = 0; vv <= 9; ++vv) { BI_RC[rr++] = vv; }rr = "a".charCodeAt(0);for (vv = 10; vv < 36; ++vv) { BI_RC[rr++] = vv; }rr = "A".charCodeAt(0);for (vv = 10; vv < 36; ++vv) { BI_RC[rr++] = vv; }function int2char(a) { return BI_RM.charAt(a); }function intAt(b, a) { var d = BI_RC[b.charCodeAt(a)];return d == null ? -1 : d; }function bnpCopyTo(b) { for (var a = this.t - 1; a >= 0; --a) { b[a] = this[a]; }b.t = this.t;b.s = this.s; }function bnpFromInt(a) { this.t = 1;this.s = a < 0 ? -1 : 0;if (a > 0) { this[0] = a; } else { if (a < -1) { this[0] = a + this.DV; } else { this.t = 0; } } }function nbv(a) { var b = nbi();b.fromInt(a);return b; }function bnpFromString(h, c) { var e;if (c == 16) { e = 4; } else { if (c == 8) { e = 3; } else { if (c == 256) { e = 8; } else { if (c == 2) { e = 1; } else { if (c == 32) { e = 5; } else { if (c == 4) { e = 2; } else { this.fromRadix(h, c);return; } } } } } }this.t = 0;this.s = 0;var g = h.length, d = false, f = 0;while (--g >= 0) { var a = e == 8 ? h[g] & 255 : intAt(h, g);if (a < 0) { if (h.charAt(g) == "-") { d = true; }continue; }d = false;if (f == 0) { this[this.t++] = a; } else { if (f + e > this.DB) { this[this.t - 1] |= (a & (1 << this.DB - f) - 1) << f;this[this.t++] = a >> this.DB - f; } else { this[this.t - 1] |= a << f; } }f += e;if (f >= this.DB) { f -= this.DB; } }if (e == 8 && (h[0] & 128) != 0) { this.s = -1;if (f > 0) { this[this.t - 1] |= (1 << this.DB - f) - 1 << f; } }this.clamp();if (d) { BigInteger.ZERO.subTo(this, this); } }function bnpClamp() { var a = this.s & this.DM;while (this.t > 0 && this[this.t - 1] == a) { --this.t; } }function bnToString(c) { if (this.s < 0) { return "-" + this.negate().toString(c); }var e;if (c == 16) { e = 4; } else { if (c == 8) { e = 3; } else { if (c == 2) { e = 1; } else { if (c == 32) { e = 5; } else { if (c == 4) { e = 2; } else { return this.toRadix(c); } } } } }var g = (1 << e) - 1, l, a = false, h = "", f = this.t;var j = this.DB - f * this.DB % e;if (f-- > 0) { if (j < this.DB && (l = this[f] >> j) > 0) { a = true;h = int2char(l); }while (f >= 0) { if (j < e) { l = (this[f] & (1 << j) - 1) << e - j;l |= this[--f] >> (j += this.DB - e); } else { l = this[f] >> (j -= e) & g;if (j <= 0) { j += this.DB;--f; } }if (l > 0) { a = true; }if (a) { h += int2char(l); } } }return a ? h : "0"; }function bnNegate() { var a = nbi();BigInteger.ZERO.subTo(this, a);return a; }function bnAbs() { return this.s < 0 ? this.negate() : this; }function bnCompareTo(b) { var d = this.s - b.s;if (d != 0) { return d; }var c = this.t;d = c - b.t;if (d != 0) { return this.s < 0 ? -d : d; }while (--c >= 0) { if ((d = this[c] - b[c]) != 0) { return d; } }return 0; }function nbits(a) { var c = 1, b;if ((b = a >>> 16) != 0) { a = b;c += 16; }if ((b = a >> 8) != 0) { a = b;c += 8; }if ((b = a >> 4) != 0) { a = b;c += 4; }if ((b = a >> 2) != 0) { a = b;c += 2; }if ((b = a >> 1) != 0) { a = b;c += 1; }return c; }function bnBitLength() { if (this.t <= 0) { return 0; }return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ this.s & this.DM); }function bnpDLShiftTo(c, b) { var a;for (a = this.t - 1; a >= 0; --a) { b[a + c] = this[a]; }for (a = c - 1; a >= 0; --a) { b[a] = 0; }b.t = this.t + c;b.s = this.s; }function bnpDRShiftTo(c, b) { for (var a = c; a < this.t; ++a) { b[a - c] = this[a]; }b.t = Math.max(this.t - c, 0);b.s = this.s; }function bnpLShiftTo(j, e) { var b = j % this.DB;var a = this.DB - b;var g = (1 << a) - 1;var f = Math.floor(j / this.DB), h = this.s << b & this.DM, d;for (d = this.t - 1; d >= 0; --d) { e[d + f + 1] = this[d] >> a | h;h = (this[d] & g) << b; }for (d = f - 1; d >= 0; --d) { e[d] = 0; }e[f] = h;e.t = this.t + f + 1;e.s = this.s;e.clamp(); }function bnpRShiftTo(g, d) { d.s = this.s;var e = Math.floor(g / this.DB);if (e >= this.t) { d.t = 0;return; }var b = g % this.DB;var a = this.DB - b;var f = (1 << b) - 1;d[0] = this[e] >> b;for (var c = e + 1; c < this.t; ++c) { d[c - e - 1] |= (this[c] & f) << a;d[c - e] = this[c] >> b; }if (b > 0) { d[this.t - e - 1] |= (this.s & f) << a; }d.t = this.t - e;d.clamp(); }function bnpSubTo(d, f) { var e = 0, g = 0, b = Math.min(d.t, this.t);while (e < b) { g += this[e] - d[e];f[e++] = g & this.DM;g >>= this.DB; }if (d.t < this.t) { g -= d.s;while (e < this.t) { g += this[e];f[e++] = g & this.DM;g >>= this.DB; }g += this.s; } else { g += this.s;while (e < d.t) { g -= d[e];f[e++] = g & this.DM;g >>= this.DB; }g -= d.s; }f.s = g < 0 ? -1 : 0;if (g < -1) { f[e++] = this.DV + g; } else { if (g > 0) { f[e++] = g; } }f.t = e;f.clamp(); }function bnpMultiplyTo(c, e) { var b = this.abs(), f = c.abs();var d = b.t;e.t = d + f.t;while (--d >= 0) { e[d] = 0; }for (d = 0; d < f.t; ++d) { e[d + b.t] = b.am(0, f[d], e, d, 0, b.t); }e.s = 0;e.clamp();if (this.s != c.s) { BigInteger.ZERO.subTo(e, e); } }function bnpSquareTo(d) { var a = this.abs();var b = d.t = 2 * a.t;while (--b >= 0) { d[b] = 0; }for (b = 0; b < a.t - 1; ++b) { var e = a.am(b, a[b], d, 2 * b, 0, 1);if ((d[b + a.t] += a.am(b + 1, 2 * a[b], d, 2 * b + 1, e, a.t - b - 1)) >= a.DV) { d[b + a.t] -= a.DV;d[b + a.t + 1] = 1; } }if (d.t > 0) { d[d.t - 1] += a.am(b, a[b], d, 2 * b, 0, 1); }d.s = 0;d.clamp(); }function bnpDivRemTo(n, h, g) { var w = n.abs();if (w.t <= 0) { return; }var k = this.abs();if (k.t < w.t) { if (h != null) { h.fromInt(0); }if (g != null) { this.copyTo(g); }return; }if (g == null) { g = nbi(); }var d = nbi(), a = this.s, l = n.s;var v = this.DB - nbits(w[w.t - 1]);if (v > 0) { w.lShiftTo(v, d);k.lShiftTo(v, g); } else { w.copyTo(d);k.copyTo(g); }var p = d.t;var b = d[p - 1];if (b == 0) { return; }var o = b * (1 << this.F1) + (p > 1 ? d[p - 2] >> this.F2 : 0);var A = this.FV / o, z = (1 << this.F1) / o, x = 1 << this.F2;var u = g.t, s = u - p, f = h == null ? nbi() : h;d.dlShiftTo(s, f);if (g.compareTo(f) >= 0) { g[g.t++] = 1;g.subTo(f, g); }BigInteger.ONE.dlShiftTo(p, f);f.subTo(d, d);while (d.t < p) { d[d.t++] = 0; }while (--s >= 0) { var c = g[--u] == b ? this.DM : Math.floor(g[u] * A + (g[u - 1] + x) * z);if ((g[u] += d.am(0, c, g, s, 0, p)) < c) { d.dlShiftTo(s, f);g.subTo(f, g);while (g[u] < --c) { g.subTo(f, g); } } }if (h != null) { g.drShiftTo(p, h);if (a != l) { BigInteger.ZERO.subTo(h, h); } }g.t = p;g.clamp();if (v > 0) { g.rShiftTo(v, g); }if (a < 0) { BigInteger.ZERO.subTo(g, g); } }function bnMod(b) { var c = nbi();this.abs().divRemTo(b, null, c);if (this.s < 0 && c.compareTo(BigInteger.ZERO) > 0) { b.subTo(c, c); }return c; }function Classic(a) { this.m = a; }function cConvert(a) { if (a.s < 0 || a.compareTo(this.m) >= 0) { return a.mod(this.m); } else { return a; } }function cRevert(a) { return a; }function cReduce(a) { a.divRemTo(this.m, null, a); }function cMulTo(a, c, b) { a.multiplyTo(c, b);this.reduce(b); }function cSqrTo(a, b) { a.squareTo(b);this.reduce(b); }Classic.prototype.convert = cConvert;Classic.prototype.revert = cRevert;Classic.prototype.reduce = cReduce;Classic.prototype.mulTo = cMulTo;Classic.prototype.sqrTo = cSqrTo;function bnpInvDigit() { if (this.t < 1) { return 0; }var a = this[0];if ((a & 1) == 0) { return 0; }var b = a & 3;b = b * (2 - (a & 15) * b) & 15;b = b * (2 - (a & 255) * b) & 255;b = b * (2 - ((a & 65535) * b & 65535)) & 65535;b = b * (2 - a * b % this.DV) % this.DV;return b > 0 ? this.DV - b : -b; }function Montgomery(a) { this.m = a;this.mp = a.invDigit();this.mpl = this.mp & 32767;this.mph = this.mp >> 15;this.um = (1 << a.DB - 15) - 1;this.mt2 = 2 * a.t; }function montConvert(a) { var b = nbi();a.abs().dlShiftTo(this.m.t, b);b.divRemTo(this.m, null, b);if (a.s < 0 && b.compareTo(BigInteger.ZERO) > 0) { this.m.subTo(b, b); }return b; }function montRevert(a) { var b = nbi();a.copyTo(b);this.reduce(b);return b; }function montReduce(a) { while (a.t <= this.mt2) { a[a.t++] = 0; }for (var c = 0; c < this.m.t; ++c) { var b = a[c] & 32767;var d = b * this.mpl + ((b * this.mph + (a[c] >> 15) * this.mpl & this.um) << 15) & a.DM;b = c + this.m.t;a[b] += this.m.am(0, d, a, c, 0, this.m.t);while (a[b] >= a.DV) { a[b] -= a.DV;a[++b]++; } }a.clamp();a.drShiftTo(this.m.t, a);if (a.compareTo(this.m) >= 0) { a.subTo(this.m, a); } }function montSqrTo(a, b) { a.squareTo(b);this.reduce(b); }function montMulTo(a, c, b) { a.multiplyTo(c, b);this.reduce(b); }Montgomery.prototype.convert = montConvert;Montgomery.prototype.revert = montRevert;Montgomery.prototype.reduce = montReduce;Montgomery.prototype.mulTo = montMulTo;Montgomery.prototype.sqrTo = montSqrTo;function bnpIsEven() { return (this.t > 0 ? this[0] & 1 : this.s) == 0; }function bnpExp(h, j) { if (h > 4294967295 || h < 1) { return BigInteger.ONE; }var f = nbi(), a = nbi(), d = j.convert(this), c = nbits(h) - 1;d.copyTo(f);while (--c >= 0) { j.sqrTo(f, a);if ((h & 1 << c) > 0) { j.mulTo(a, d, f); } else { var b = f;f = a;a = b; } }return j.revert(f); }function bnModPowInt(b, a) { var c;if (b < 256 || a.isEven()) { c = new Classic(a); } else { c = new Montgomery(a); }return this.exp(b, c); }BigInteger.prototype.copyTo = bnpCopyTo;BigInteger.prototype.fromInt = bnpFromInt;BigInteger.prototype.fromString = bnpFromString;BigInteger.prototype.clamp = bnpClamp;BigInteger.prototype.dlShiftTo = bnpDLShiftTo;BigInteger.prototype.drShiftTo = bnpDRShiftTo;BigInteger.prototype.lShiftTo = bnpLShiftTo;BigInteger.prototype.rShiftTo = bnpRShiftTo;BigInteger.prototype.subTo = bnpSubTo;BigInteger.prototype.multiplyTo = bnpMultiplyTo;BigInteger.prototype.squareTo = bnpSquareTo;BigInteger.prototype.divRemTo = bnpDivRemTo;BigInteger.prototype.invDigit = bnpInvDigit;BigInteger.prototype.isEven = bnpIsEven;BigInteger.prototype.exp = bnpExp;BigInteger.prototype.toString = bnToString;BigInteger.prototype.negate = bnNegate;BigInteger.prototype.abs = bnAbs;BigInteger.prototype.compareTo = bnCompareTo;BigInteger.prototype.bitLength = bnBitLength;BigInteger.prototype.mod = bnMod;BigInteger.prototype.modPowInt = bnModPowInt;BigInteger.ZERO = nbv(0);BigInteger.ONE = nbv(1); /*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/ */ function bnClone() { var a = nbi();this.copyTo(a);return a; }function bnIntValue() { if (this.s < 0) { if (this.t == 1) { return this[0] - this.DV; } else { if (this.t == 0) { return -1; } } } else { if (this.t == 1) { return this[0]; } else { if (this.t == 0) { return 0; } } }return (this[1] & (1 << 32 - this.DB) - 1) << this.DB | this[0]; }function bnByteValue() { return this.t == 0 ? this.s : this[0] << 24 >> 24; }function bnShortValue() { return this.t == 0 ? this.s : this[0] << 16 >> 16; }function bnpChunkSize(a) { return Math.floor(Math.LN2 * this.DB / Math.log(a)); }function bnSigNum() { if (this.s < 0) { return -1; } else { if (this.t <= 0 || this.t == 1 && this[0] <= 0) { return 0; } else { return 1; } } }function bnpToRadix(c) { if (c == null) { c = 10; }if (this.signum() == 0 || c < 2 || c > 36) { return "0"; }var f = this.chunkSize(c);var e = Math.pow(c, f);var i = nbv(e), j = nbi(), h = nbi(), g = "";this.divRemTo(i, j, h);while (j.signum() > 0) { g = (e + h.intValue()).toString(c).substr(1) + g;j.divRemTo(i, j, h); }return h.intValue().toString(c) + g; }function bnpFromRadix(m, h) { this.fromInt(0);if (h == null) { h = 10; }var f = this.chunkSize(h);var g = Math.pow(h, f), e = false, a = 0, l = 0;for (var c = 0; c < m.length; ++c) { var k = intAt(m, c);if (k < 0) { if (m.charAt(c) == "-" && this.signum() == 0) { e = true; }continue; }l = h * l + k;if (++a >= f) { this.dMultiply(g);this.dAddOffset(l, 0);a = 0;l = 0; } }if (a > 0) { this.dMultiply(Math.pow(h, a));this.dAddOffset(l, 0); }if (e) { BigInteger.ZERO.subTo(this, this); } }function bnpFromNumber(f, e, h) { if ("number" == typeof e) { if (f < 2) { this.fromInt(1); } else { this.fromNumber(f, h);if (!this.testBit(f - 1)) { this.bitwiseTo(BigInteger.ONE.shiftLeft(f - 1), op_or, this); }if (this.isEven()) { this.dAddOffset(1, 0); }while (!this.isProbablePrime(e)) { this.dAddOffset(2, 0);if (this.bitLength() > f) { this.subTo(BigInteger.ONE.shiftLeft(f - 1), this); } } } } else { var d = new Array(), g = f & 7;d.length = (f >> 3) + 1;e.nextBytes(d);if (g > 0) { d[0] &= (1 << g) - 1; } else { d[0] = 0; }this.fromString(d, 256); } }function bnToByteArray() { var b = this.t, c = new Array();c[0] = this.s;var e = this.DB - b * this.DB % 8, f, a = 0;if (b-- > 0) { if (e < this.DB && (f = this[b] >> e) != (this.s & this.DM) >> e) { c[a++] = f | this.s << this.DB - e; }while (b >= 0) { if (e < 8) { f = (this[b] & (1 << e) - 1) << 8 - e;f |= this[--b] >> (e += this.DB - 8); } else { f = this[b] >> (e -= 8) & 255;if (e <= 0) { e += this.DB;--b; } }if ((f & 128) != 0) { f |= -256; }if (a == 0 && (this.s & 128) != (f & 128)) { ++a; }if (a > 0 || f != this.s) { c[a++] = f; } } }return c; }function bnEquals(b) { return this.compareTo(b) == 0; }function bnMin(b) { return this.compareTo(b) < 0 ? this : b; }function bnMax(b) { return this.compareTo(b) > 0 ? this : b; }function bnpBitwiseTo(c, h, e) { var d, g, b = Math.min(c.t, this.t);for (d = 0; d < b; ++d) { e[d] = h(this[d], c[d]); }if (c.t < this.t) { g = c.s & this.DM;for (d = b; d < this.t; ++d) { e[d] = h(this[d], g); }e.t = this.t; } else { g = this.s & this.DM;for (d = b; d < c.t; ++d) { e[d] = h(g, c[d]); }e.t = c.t; }e.s = h(this.s, c.s);e.clamp(); }function op_and(a, b) { return a & b; }function bnAnd(b) { var c = nbi();this.bitwiseTo(b, op_and, c);return c; }function op_or(a, b) { return a | b; }function bnOr(b) { var c = nbi();this.bitwiseTo(b, op_or, c);return c; }function op_xor(a, b) { return a ^ b; }function bnXor(b) { var c = nbi();this.bitwiseTo(b, op_xor, c);return c; }function op_andnot(a, b) { return a & ~b; }function bnAndNot(b) { var c = nbi();this.bitwiseTo(b, op_andnot, c);return c; }function bnNot() { var b = nbi();for (var a = 0; a < this.t; ++a) { b[a] = this.DM & ~this[a]; }b.t = this.t;b.s = ~this.s;return b; }function bnShiftLeft(b) { var a = nbi();if (b < 0) { this.rShiftTo(-b, a); } else { this.lShiftTo(b, a); }return a; }function bnShiftRight(b) { var a = nbi();if (b < 0) { this.lShiftTo(-b, a); } else { this.rShiftTo(b, a); }return a; }function lbit(a) { if (a == 0) { return -1; }var b = 0;if ((a & 65535) == 0) { a >>= 16;b += 16; }if ((a & 255) == 0) { a >>= 8;b += 8; }if ((a & 15) == 0) { a >>= 4;b += 4; }if ((a & 3) == 0) { a >>= 2;b += 2; }if ((a & 1) == 0) { ++b; }return b; }function bnGetLowestSetBit() { for (var a = 0; a < this.t; ++a) { if (this[a] != 0) { return a * this.DB + lbit(this[a]); } }if (this.s < 0) { return this.t * this.DB; }return -1; }function cbit(a) { var b = 0;while (a != 0) { a &= a - 1;++b; }return b; }function bnBitCount() { var c = 0, a = this.s & this.DM;for (var b = 0; b < this.t; ++b) { c += cbit(this[b] ^ a); }return c; }function bnTestBit(b) { var a = Math.floor(b / this.DB);if (a >= this.t) { return this.s != 0; }return (this[a] & 1 << b % this.DB) != 0; }function bnpChangeBit(c, b) { var a = BigInteger.ONE.shiftLeft(c);this.bitwiseTo(a, b, a);return a; }function bnSetBit(a) { return this.changeBit(a, op_or); }function bnClearBit(a) { return this.changeBit(a, op_andnot); }function bnFlipBit(a) { return this.changeBit(a, op_xor); }function bnpAddTo(d, f) { var e = 0, g = 0, b = Math.min(d.t, this.t);while (e < b) { g += this[e] + d[e];f[e++] = g & this.DM;g >>= this.DB; }if (d.t < this.t) { g += d.s;while (e < this.t) { g += this[e];f[e++] = g & this.DM;g >>= this.DB; }g += this.s; } else { g += this.s;while (e < d.t) { g += d[e];f[e++] = g & this.DM;g >>= this.DB; }g += d.s; }f.s = g < 0 ? -1 : 0;if (g > 0) { f[e++] = g; } else { if (g < -1) { f[e++] = this.DV + g; } }f.t = e;f.clamp(); }function bnAdd(b) { var c = nbi();this.addTo(b, c);return c; }function bnSubtract(b) { var c = nbi();this.subTo(b, c);return c; }function bnMultiply(b) { var c = nbi();this.multiplyTo(b, c);return c; }function bnSquare() { var a = nbi();this.squareTo(a);return a; }function bnDivide(b) { var c = nbi();this.divRemTo(b, c, null);return c; }function bnRemainder(b) { var c = nbi();this.divRemTo(b, null, c);return c; }function bnDivideAndRemainder(b) { var d = nbi(), c = nbi();this.divRemTo(b, d, c);return new Array(d, c); }function bnpDMultiply(a) { this[this.t] = this.am(0, a - 1, this, 0, 0, this.t);++this.t;this.clamp(); }function bnpDAddOffset(b, a) { if (b == 0) { return; }while (this.t <= a) { this[this.t++] = 0; }this[a] += b;while (this[a] >= this.DV) { this[a] -= this.DV;if (++a >= this.t) { this[this.t++] = 0; }++this[a]; } }function NullExp() {}function nNop(a) { return a; }function nMulTo(a, c, b) { a.multiplyTo(c, b); }function nSqrTo(a, b) { a.squareTo(b); }NullExp.prototype.convert = nNop;NullExp.prototype.revert = nNop;NullExp.prototype.mulTo = nMulTo;NullExp.prototype.sqrTo = nSqrTo;function bnPow(a) { return this.exp(a, new NullExp()); }function bnpMultiplyLowerTo(b, f, e) { var d = Math.min(this.t + b.t, f);e.s = 0;e.t = d;while (d > 0) { e[--d] = 0; }var c;for (c = e.t - this.t; d < c; ++d) { e[d + this.t] = this.am(0, b[d], e, d, 0, this.t); }for (c = Math.min(b.t, f); d < c; ++d) { this.am(0, b[d], e, d, 0, f - d); }e.clamp(); }function bnpMultiplyUpperTo(b, e, d) { --e;var c = d.t = this.t + b.t - e;d.s = 0;while (--c >= 0) { d[c] = 0; }for (c = Math.max(e - this.t, 0); c < b.t; ++c) { d[this.t + c - e] = this.am(e - c, b[c], d, 0, 0, this.t + c - e); }d.clamp();d.drShiftTo(1, d); }function Barrett(a) { this.r2 = nbi();this.q3 = nbi();BigInteger.ONE.dlShiftTo(2 * a.t, this.r2);this.mu = this.r2.divide(a);this.m = a; }function barrettConvert(a) { if (a.s < 0 || a.t > 2 * this.m.t) { return a.mod(this.m); } else { if (a.compareTo(this.m) < 0) { return a; } else { var b = nbi();a.copyTo(b);this.reduce(b);return b; } } }function barrettRevert(a) { return a; }function barrettReduce(a) { a.drShiftTo(this.m.t - 1, this.r2);if (a.t > this.m.t + 1) { a.t = this.m.t + 1;a.clamp(); }this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3);this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2);while (a.compareTo(this.r2) < 0) { a.dAddOffset(1, this.m.t + 1); }a.subTo(this.r2, a);while (a.compareTo(this.m) >= 0) { a.subTo(this.m, a); } }function barrettSqrTo(a, b) { a.squareTo(b);this.reduce(b); }function barrettMulTo(a, c, b) { a.multiplyTo(c, b);this.reduce(b); }Barrett.prototype.convert = barrettConvert;Barrett.prototype.revert = barrettRevert;Barrett.prototype.reduce = barrettReduce;Barrett.prototype.mulTo = barrettMulTo;Barrett.prototype.sqrTo = barrettSqrTo;function bnModPow(q, f) { var o = q.bitLength(), h, b = nbv(1), v;if (o <= 0) { return b; } else { if (o < 18) { h = 1; } else { if (o < 48) { h = 3; } else { if (o < 144) { h = 4; } else { if (o < 768) { h = 5; } else { h = 6; } } } } }if (o < 8) { v = new Classic(f); } else { if (f.isEven()) { v = new Barrett(f); } else { v = new Montgomery(f); } }var p = new Array(), d = 3, s = h - 1, a = (1 << h) - 1;p[1] = v.convert(this);if (h > 1) { var A = nbi();v.sqrTo(p[1], A);while (d <= a) { p[d] = nbi();v.mulTo(A, p[d - 2], p[d]);d += 2; } }var l = q.t - 1, x, u = true, c = nbi(), y;o = nbits(q[l]) - 1;while (l >= 0) { if (o >= s) { x = q[l] >> o - s & a; } else { x = (q[l] & (1 << o + 1) - 1) << s - o;if (l > 0) { x |= q[l - 1] >> this.DB + o - s; } }d = h;while ((x & 1) == 0) { x >>= 1;--d; }if ((o -= d) < 0) { o += this.DB;--l; }if (u) { p[x].copyTo(b);u = false; } else { while (d > 1) { v.sqrTo(b, c);v.sqrTo(c, b);d -= 2; }if (d > 0) { v.sqrTo(b, c); } else { y = b;b = c;c = y; }v.mulTo(c, p[x], b); }while (l >= 0 && (q[l] & 1 << o) == 0) { v.sqrTo(b, c);y = b;b = c;c = y;if (--o < 0) { o = this.DB - 1;--l; } } }return v.revert(b); }function bnGCD(c) { var b = this.s < 0 ? this.negate() : this.clone();var h = c.s < 0 ? c.negate() : c.clone();if (b.compareTo(h) < 0) { var e = b;b = h;h = e; }var d = b.getLowestSetBit(), f = h.getLowestSetBit();if (f < 0) { return b; }if (d < f) { f = d; }if (f > 0) { b.rShiftTo(f, b);h.rShiftTo(f, h); }while (b.signum() > 0) { if ((d = b.getLowestSetBit()) > 0) { b.rShiftTo(d, b); }if ((d = h.getLowestSetBit()) > 0) { h.rShiftTo(d, h); }if (b.compareTo(h) >= 0) { b.subTo(h, b);b.rShiftTo(1, b); } else { h.subTo(b, h);h.rShiftTo(1, h); } }if (f > 0) { h.lShiftTo(f, h); }return h; }function bnpModInt(e) { if (e <= 0) { return 0; }var c = this.DV % e, b = this.s < 0 ? e - 1 : 0;if (this.t > 0) { if (c == 0) { b = this[0] % e; } else { for (var a = this.t - 1; a >= 0; --a) { b = (c * b + this[a]) % e; } } }return b; }function bnModInverse(f) { var j = f.isEven();if (this.isEven() && j || f.signum() == 0) { return BigInteger.ZERO; }var i = f.clone(), h = this.clone();var g = nbv(1), e = nbv(0), l = nbv(0), k = nbv(1);while (i.signum() != 0) { while (i.isEven()) { i.rShiftTo(1, i);if (j) { if (!g.isEven() || !e.isEven()) { g.addTo(this, g);e.subTo(f, e); }g.rShiftTo(1, g); } else { if (!e.isEven()) { e.subTo(f, e); } }e.rShiftTo(1, e); }while (h.isEven()) { h.rShiftTo(1, h);if (j) { if (!l.isEven() || !k.isEven()) { l.addTo(this, l);k.subTo(f, k); }l.rShiftTo(1, l); } else { if (!k.isEven()) { k.subTo(f, k); } }k.rShiftTo(1, k); }if (i.compareTo(h) >= 0) { i.subTo(h, i);if (j) { g.subTo(l, g); }e.subTo(k, e); } else { h.subTo(i, h);if (j) { l.subTo(g, l); }k.subTo(e, k); } }if (h.compareTo(BigInteger.ONE) != 0) { return BigInteger.ZERO; }if (k.compareTo(f) >= 0) { return k.subtract(f); }if (k.signum() < 0) { k.addTo(f, k); } else { return k; }if (k.signum() < 0) { return k.add(f); } else { return k; } }var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997];var lplim = (1 << 26) / lowprimes[lowprimes.length - 1];function bnIsProbablePrime(e) { var d, b = this.abs();if (b.t == 1 && b[0] <= lowprimes[lowprimes.length - 1]) { for (d = 0; d < lowprimes.length; ++d) { if (b[0] == lowprimes[d]) { return true; } }return false; }if (b.isEven()) { return false; }d = 1;while (d < lowprimes.length) { var a = lowprimes[d], c = d + 1;while (c < lowprimes.length && a < lplim) { a *= lowprimes[c++]; }a = b.modInt(a);while (d < c) { if (a % lowprimes[d++] == 0) { return false; } } }return b.millerRabin(e); }function bnpMillerRabin(f) { var g = this.subtract(BigInteger.ONE);var c = g.getLowestSetBit();if (c <= 0) { return false; }var h = g.shiftRight(c);f = f + 1 >> 1;if (f > lowprimes.length) { f = lowprimes.length; }var b = nbi();for (var e = 0; e < f; ++e) { b.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]);var l = b.modPow(h, this);if (l.compareTo(BigInteger.ONE) != 0 && l.compareTo(g) != 0) { var d = 1;while (d++ < c && l.compareTo(g) != 0) { l = l.modPowInt(2, this);if (l.compareTo(BigInteger.ONE) == 0) { return false; } }if (l.compareTo(g) != 0) { return false; } } }return true; }BigInteger.prototype.chunkSize = bnpChunkSize;BigInteger.prototype.toRadix = bnpToRadix;BigInteger.prototype.fromRadix = bnpFromRadix;BigInteger.prototype.fromNumber = bnpFromNumber;BigInteger.prototype.bitwiseTo = bnpBitwiseTo;BigInteger.prototype.changeBit = bnpChangeBit;BigInteger.prototype.addTo = bnpAddTo;BigInteger.prototype.dMultiply = bnpDMultiply;BigInteger.prototype.dAddOffset = bnpDAddOffset;BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;BigInteger.prototype.modInt = bnpModInt;BigInteger.prototype.millerRabin = bnpMillerRabin;BigInteger.prototype.clone = bnClone;BigInteger.prototype.intValue = bnIntValue;BigInteger.prototype.byteValue = bnByteValue;BigInteger.prototype.shortValue = bnShortValue;BigInteger.prototype.signum = bnSigNum;BigInteger.prototype.toByteArray = bnToByteArray;BigInteger.prototype.equals = bnEquals;BigInteger.prototype.min = bnMin;BigInteger.prototype.max = bnMax;BigInteger.prototype.and = bnAnd;BigInteger.prototype.or = bnOr;BigInteger.prototype.xor = bnXor;BigInteger.prototype.andNot = bnAndNot;BigInteger.prototype.not = bnNot;BigInteger.prototype.shiftLeft = bnShiftLeft;BigInteger.prototype.shiftRight = bnShiftRight;BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;BigInteger.prototype.bitCount = bnBitCount;BigInteger.prototype.testBit = bnTestBit;BigInteger.prototype.setBit = bnSetBit;BigInteger.prototype.clearBit = bnClearBit;BigInteger.prototype.flipBit = bnFlipBit;BigInteger.prototype.add = bnAdd;BigInteger.prototype.subtract = bnSubtract;BigInteger.prototype.multiply = bnMultiply;BigInteger.prototype.divide = bnDivide;BigInteger.prototype.remainder = bnRemainder;BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;BigInteger.prototype.modPow = bnModPow;BigInteger.prototype.modInverse = bnModInverse;BigInteger.prototype.pow = bnPow;BigInteger.prototype.gcd = bnGCD;BigInteger.prototype.isProbablePrime = bnIsProbablePrime;BigInteger.prototype.square = bnSquare; /*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/ */ function Arcfour() { this.i = 0;this.j = 0;this.S = new Array(); }function ARC4init(d) { var c, a, b;for (c = 0; c < 256; ++c) { this.S[c] = c; }a = 0;for (c = 0; c < 256; ++c) { a = a + this.S[c] + d[c % d.length] & 255;b = this.S[c];this.S[c] = this.S[a];this.S[a] = b; }this.i = 0;this.j = 0; }function ARC4next() { var a;this.i = this.i + 1 & 255;this.j = this.j + this.S[this.i] & 255;a = this.S[this.i];this.S[this.i] = this.S[this.j];this.S[this.j] = a;return this.S[a + this.S[this.i] & 255]; }Arcfour.prototype.init = ARC4init;Arcfour.prototype.next = ARC4next;function prng_newstate() { return new Arcfour(); }var rng_psize = 256; /*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/ */ var rng_state;var rng_pool;var rng_pptr;function rng_seed_int(a) { rng_pool[rng_pptr++] ^= a & 255;rng_pool[rng_pptr++] ^= a >> 8 & 255;rng_pool[rng_pptr++] ^= a >> 16 & 255;rng_pool[rng_pptr++] ^= a >> 24 & 255;if (rng_pptr >= rng_psize) { rng_pptr -= rng_psize; } }function rng_seed_time() { rng_seed_int(new Date().getTime()); }if (rng_pool == null) { rng_pool = new Array();rng_pptr = 0;var t;if (window !== undefined && (window.crypto !== undefined || window.msCrypto !== undefined)) { var crypto = window.crypto || window.msCrypto;if (crypto.getRandomValues) { var ua = new Uint8Array(32);crypto.getRandomValues(ua);for (t = 0; t < 32; ++t) { rng_pool[rng_pptr++] = ua[t]; } } else { if (navigator.appName == "Netscape" && navigator.appVersion < "5") { var z = window.crypto.random(32);for (t = 0; t < z.length; ++t) { rng_pool[rng_pptr++] = z.charCodeAt(t) & 255; } } } }while (rng_pptr < rng_psize) { t = Math.floor(65536 * Math.random());rng_pool[rng_pptr++] = t >>> 8;rng_pool[rng_pptr++] = t & 255; }rng_pptr = 0;rng_seed_time(); }function rng_get_byte() { if (rng_state == null) { rng_seed_time();rng_state = prng_newstate();rng_state.init(rng_pool);for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) { rng_pool[rng_pptr] = 0; }rng_pptr = 0; }return rng_state.next(); }function rng_get_bytes(b) { var a;for (a = 0; a < b.length; ++a) { b[a] = rng_get_byte(); } }function SecureRandom() {}SecureRandom.prototype.nextBytes = rng_get_bytes; /*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/ */ function parseBigInt(b, a) { return new BigInteger(b, a); }function linebrk(c, d) { var a = "";var b = 0;while (b + d < c.length) { a += c.substring(b, b + d) + "\n";b += d; }return a + c.substring(b, c.length); }function byte2Hex(a) { if (a < 16) { return "0" + a.toString(16); } else { return a.toString(16); } }function pkcs1pad2(e, h) { if (h < e.length + 11) { throw "Message too long for RSA";return null; }var g = new Array();var d = e.length - 1;while (d >= 0 && h > 0) { var f = e.charCodeAt(d--);if (f < 128) { g[--h] = f; } else { if (f > 127 && f < 2048) { g[--h] = f & 63 | 128;g[--h] = f >> 6 | 192; } else { g[--h] = f & 63 | 128;g[--h] = f >> 6 & 63 | 128;g[--h] = f >> 12 | 224; } } }g[--h] = 0;var b = new SecureRandom();var a = new Array();while (h > 2) { a[0] = 0;while (a[0] == 0) { b.nextBytes(a); }g[--h] = a[0]; }g[--h] = 2;g[--h] = 0;return new BigInteger(g); }function oaep_mgf1_arr(c, a, e) { var b = "", d = 0;while (b.length < a) { b += e(String.fromCharCode.apply(String, c.concat([(d & 4278190080) >> 24, (d & 16711680) >> 16, (d & 65280) >> 8, d & 255])));d += 1; }return b; }function oaep_pad(q, a, f, l) { var c = KJUR.crypto.MessageDigest;var o = KJUR.crypto.Util;var b = null;if (!f) { f = "sha1"; }if (typeof f === "string") { b = c.getCanonicalAlgName(f);l = c.getHashLength(b);f = function f(i) { return hextorstr(o.hashHex(rstrtohex(i), b)); }; }if (q.length + 2 * l + 2 > a) { throw "Message too long for RSA"; }var k = "", e;for (e = 0; e < a - q.length - 2 * l - 2; e += 1) { k += "\x00"; }var h = f("") + k + "\x01" + q;var g = new Array(l);new SecureRandom().nextBytes(g);var j = oaep_mgf1_arr(g, h.length, f);var p = [];for (e = 0; e < h.length; e += 1) { p[e] = h.charCodeAt(e) ^ j.charCodeAt(e); }var m = oaep_mgf1_arr(p, g.length, f);var d = [0];for (e = 0; e < g.length; e += 1) { d[e + 1] = g[e] ^ m.charCodeAt(e); }return new BigInteger(d.concat(p)); }function RSAKey() { this.n = null;this.e = 0;this.d = null;this.p = null;this.q = null;this.dmp1 = null;this.dmq1 = null;this.coeff = null; }function RSASetPublic(b, a) { this.isPublic = true;this.isPrivate = false;if (typeof b !== "string") { this.n = b;this.e = a; } else { if (b != null && a != null && b.length > 0 && a.length > 0) { this.n = parseBigInt(b, 16);this.e = parseInt(a, 16); } else { throw "Invalid RSA public key"; } } }function RSADoPublic(a) { return a.modPowInt(this.e, this.n); }function RSAEncrypt(d) { var a = pkcs1pad2(d, this.n.bitLength() + 7 >> 3);if (a == null) { return null; }var e = this.doPublic(a);if (e == null) { return null; }var b = e.toString(16);if ((b.length & 1) == 0) { return b; } else { return "0" + b; } }function RSAEncryptOAEP(f, e, b) { var a = oaep_pad(f, this.n.bitLength() + 7 >> 3, e, b);if (a == null) { return null; }var g = this.doPublic(a);if (g == null) { return null; }var d = g.toString(16);if ((d.length & 1) == 0) { return d; } else { return "0" + d; } }RSAKey.prototype.doPublic = RSADoPublic;RSAKey.prototype.setPublic = RSASetPublic;RSAKey.prototype.encrypt = RSAEncrypt;RSAKey.prototype.encryptOAEP = RSAEncryptOAEP;RSAKey.prototype.type = "RSA"; /*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/ */ function ECFieldElementFp(b, a) { this.x = a;this.q = b; }function feFpEquals(a) { if (a == this) { return true; }return this.q.equals(a.q) && this.x.equals(a.x); }function feFpToBigInteger() { return this.x; }function feFpNegate() { return new ECFieldElementFp(this.q, this.x.negate().mod(this.q)); }function feFpAdd(a) { return new ECFieldElementFp(this.q, this.x.add(a.toBigInteger()).mod(this.q)); }function feFpSubtract(a) { return new ECFieldElementFp(this.q, this.x.subtract(a.toBigInteger()).mod(this.q)); }function feFpMultiply(a) { return new ECFieldElementFp(this.q, this.x.multiply(a.toBigInteger()).mod(this.q)); }function feFpSquare() { return new ECFieldElementFp(this.q, this.x.square().mod(this.q)); }function feFpDivide(a) { return new ECFieldElementFp(this.q, this.x.multiply(a.toBigInteger().modInverse(this.q)).mod(this.q)); }ECFieldElementFp.prototype.equals = feFpEquals;ECFieldElementFp.prototype.toBigInteger = feFpToBigInteger;ECFieldElementFp.prototype.negate = feFpNegate;ECFieldElementFp.prototype.add = feFpAdd;ECFieldElementFp.prototype.subtract = feFpSubtract;ECFieldElementFp.prototype.multiply = feFpMultiply;ECFieldElementFp.prototype.square = feFpSquare;ECFieldElementFp.prototype.divide = feFpDivide;function ECPointFp(c, a, d, b) { this.curve = c;this.x = a;this.y = d;if (b == null) { this.z = BigInteger.ONE; } else { this.z = b; }this.zinv = null; }function pointFpGetX() { if (this.zinv == null) { this.zinv = this.z.modInverse(this.curve.q); }return this.curve.fromBigInteger(this.x.toBigInteger().multiply(this.zinv).mod(this.curve.q)); }function pointFpGetY() { if (this.zinv == null) { this.zinv = this.z.modInverse(this.curve.q); }return this.curve.fromBigInteger(this.y.toBigInteger().multiply(this.zinv).mod(this.curve.q)); }function pointFpEquals(a) { if (a == this) { return true; }if (this.isInfinity()) { return a.isInfinity(); }if (a.isInfinity()) { return this.isInfinity(); }var c, b;c = a.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(a.z)).mod(this.curve.q);if (!c.equals(BigInteger.ZERO)) { return false; }b = a.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(a.z)).mod(this.curve.q);return b.equals(BigInteger.ZERO); }function pointFpIsInfinity() { if (this.x == null && this.y == null) { return true; }return this.z.equals(BigInteger.ZERO) && !this.y.toBigInteger().equals(BigInteger.ZERO); }function pointFpNegate() { return new ECPointFp(this.curve, this.x, this.y.negate(), this.z); }function pointFpAdd(l) { if (this.isInfinity()) { return l; }if (l.isInfinity()) { return this; }var p = l.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(l.z)).mod(this.curve.q);var o = l.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(l.z)).mod(this.curve.q);if (BigInteger.ZERO.equals(o)) { if (BigInteger.ZERO.equals(p)) { return this.twice(); }return this.curve.getInfinity(); }var j = new BigInteger("3");var e = this.x.toBigInteger();var n = this.y.toBigInteger();var c = l.x.toBigInteger();var k = l.y.toBigInteger();var m = o.square();var i = m.multiply(o);var d = e.multiply(m);var g = p.square().multiply(this.z);var a = g.subtract(d.shiftLeft(1)).multiply(l.z).subtract(i).multiply(o).mod(this.curve.q);var h = d.multiply(j).multiply(p).subtract(n.multiply(i)).subtract(g.multiply(p)).multiply(l.z).add(p.multiply(i)).mod(this.curve.q);var f = i.multiply(this.z).multiply(l.z).mod(this.curve.q);return new ECPointFp(this.curve, this.curve.fromBigInteger(a), this.curve.fromBigInteger(h), f); }function pointFpTwice() { if (this.isInfinity()) { return this; }if (this.y.toBigInteger().signum() == 0) { return this.curve.getInfinity(); }var g = new BigInteger("3");var c = this.x.toBigInteger();var h = this.y.toBigInteger();var e = h.multiply(this.z);var j = e.multiply(h).mod(this.curve.q);var i = this.curve.a.toBigInteger();var k = c.square().multiply(g);if (!BigInteger.ZERO.equals(i)) { k = k.add(this.z.square().multiply(i)); }k = k.mod(this.curve.q);var b = k.square().subtract(c.shiftLeft(3).multiply(j)).shiftLeft(1).multiply(e).mod(this.curve.q);var f = k.multiply(g).multiply(c).subtract(j.shiftLeft(1)).shiftLeft(2).multiply(j).subtract(k.square().multiply(k)).mod(this.curve.q);var d = e.square().multiply(e).shiftLeft(3).mod(this.curve.q);return new ECPointFp(this.curve, this.curve.fromBigInteger(b), this.curve.fromBigInteger(f), d); }function pointFpMultiply(d) { if (this.isInfinity()) { return this; }if (d.signum() == 0) { return this.curve.getInfinity(); }var m = d;var l = m.multiply(new BigInteger("3"));var b = this.negate();var j = this;var q = this.curve.q.subtract(d);var o = q.multiply(new BigInteger("3"));var c = new ECPointFp(this.curve, this.x, this.y);var a = c.negate();var g;for (g = l.bitLength() - 2; g > 0; --g) { j = j.twice();var n = l.testBit(g);var f = m.testBit(g);if (n != f) { j = j.add(n ? this : b); } }for (g = o.bitLength() - 2; g > 0; --g) { c = c.twice();var p = o.testBit(g);var r = q.testBit(g);if (p != r) { c = c.add(p ? c : a); } }return j; }function pointFpMultiplyTwo(c, a, b) { var d;if (c.bitLength() > b.bitLength()) { d = c.bitLength() - 1; } else { d = b.bitLength() - 1; }var f = this.curve.getInfinity();var e = this.add(a);while (d >= 0) { f = f.twice();if (c.testBit(d)) { if (b.testBit(d)) { f = f.add(e); } else { f = f.add(this); } } else { if (b.testBit(d)) { f = f.add(a); } }--d; }return f; }ECPointFp.prototype.getX = pointFpGetX;ECPointFp.prototype.getY = pointFpGetY;ECPointFp.prototype.equals = pointFpEquals;ECPointFp.prototype.isInfinity = pointFpIsInfinity;ECPointFp.prototype.negate = pointFpNegate;ECPointFp.prototype.add = pointFpAdd;ECPointFp.prototype.twice = pointFpTwice;ECPointFp.prototype.multiply = pointFpMultiply;ECPointFp.prototype.multiplyTwo = pointFpMultiplyTwo;function ECCurveFp(e, d, c) { this.q = e;this.a = this.fromBigInteger(d);this.b = this.fromBigInteger(c);this.infinity = new ECPointFp(this, null, null); }function curveFpGetQ() { return this.q; }function curveFpGetA() { return this.a; }function curveFpGetB() { return this.b; }function curveFpEquals(a) { if (a == this) { return true; }return this.q.equals(a.q) && this.a.equals(a.a) && this.b.equals(a.b); }function curveFpGetInfinity() { return this.infinity; }function curveFpFromBigInteger(a) { return new ECFieldElementFp(this.q, a); }function curveFpDecodePointHex(d) { switch (parseInt(d.substr(0, 2), 16)) {case 0: return this.infinity;case 2:case 3: return null;case 4:case 6:case 7: var a = (d.length - 2) / 2;var c = d.substr(2, a);var b = d.substr(a + 2, a);return new ECPointFp(this, this.fromBigInteger(new BigInteger(c, 16)), this.fromBigInteger(new BigInteger(b, 16)));default: return null;} }ECCurveFp.prototype.getQ = curveFpGetQ;ECCurveFp.prototype.getA = curveFpGetA;ECCurveFp.prototype.getB = curveFpGetB;ECCurveFp.prototype.equals = curveFpEquals;ECCurveFp.prototype.getInfinity = curveFpGetInfinity;ECCurveFp.prototype.fromBigInteger = curveFpFromBigInteger;ECCurveFp.prototype.decodePointHex = curveFpDecodePointHex; /*! (c) Stefan Thomas | https://github.com/bitcoinjs/bitcoinjs-lib */ ECFieldElementFp.prototype.getByteLength = function () { return Math.floor((this.toBigInteger().bitLength() + 7) / 8); };ECPointFp.prototype.getEncoded = function (c) { var d = function d(h, f) { var g = h.toByteArrayUnsigned();if (f < g.length) { g = g.slice(g.length - f); } else { while (f > g.length) { g.unshift(0); } }return g; };var a = this.getX().toBigInteger();var e = this.getY().toBigInteger();var b = d(a, 32);if (c) { if (e.isEven()) { b.unshift(2); } else { b.unshift(3); } } else { b.unshift(4);b = b.concat(d(e, 32)); }return b; };ECPointFp.decodeFrom = function (g, c) { var f = c[0];var e = c.length - 1;var d = c.slice(1, 1 + e / 2);var b = c.slice(1 + e / 2, 1 + e);d.unshift(0);b.unshift(0);var a = new BigInteger(d);var h = new BigInteger(b);return new ECPointFp(g, g.fromBigInteger(a), g.fromBigInteger(h)); };ECPointFp.decodeFromHex = function (g, c) { var f = c.substr(0, 2);var e = c.length - 2;var d = c.substr(2, e / 2);var b = c.substr(2 + e / 2, e / 2);var a = new BigInteger(d, 16);var h = new BigInteger(b, 16);return new ECPointFp(g, g.fromBigInteger(a), g.fromBigInteger(h)); };ECPointFp.prototype.add2D = function (c) { if (this.isInfinity()) { return c; }if (c.isInfinity()) { return this; }if (this.x.equals(c.x)) { if (this.y.equals(c.y)) { return this.twice(); }return this.curve.getInfinity(); }var g = c.x.subtract(this.x);var e = c.y.subtract(this.y);var a = e.divide(g);var d = a.square().subtract(this.x).subtract(c.x);var f = a.multiply(this.x.subtract(d)).subtract(this.y);return new ECPointFp(this.curve, d, f); };ECPointFp.prototype.twice2D = function () { if (this.isInfinity()) { return this; }if (this.y.toBigInteger().signum() == 0) { return this.curve.getInfinity(); }var b = this.curve.fromBigInteger(BigInteger.valueOf(2));var e = this.curve.fromBigInteger(BigInteger.valueOf(3));var a = this.x.square().multiply(e).add(this.curve.a).divide(this.y.multiply(b));var c = a.square().subtract(this.x.multiply(b));var d = a.multiply(this.x.subtract(c)).subtract(this.y);return new ECPointFp(this.curve, c, d); };ECPointFp.prototype.multiply2D = function (b) { if (this.isInfinity()) { return this; }if (b.signum() == 0) { return this.curve.getInfinity(); }var g = b;var f = g.multiply(new BigInteger("3"));var l = this.negate();var d = this;var c;for (c = f.bitLength() - 2; c > 0; --c) { d = d.twice();var a = f.testBit(c);var j = g.testBit(c);if (a != j) { d = d.add2D(a ? this : l); } }return d; };ECPointFp.prototype.isOnCurve = function () { var d = this.getX().toBigInteger();var i = this.getY().toBigInteger();var f = this.curve.getA().toBigInteger();var c = this.curve.getB().toBigInteger();var h = this.curve.getQ();var e = i.multiply(i).mod(h);var g = d.multiply(d).multiply(d).add(f.multiply(d)).add(c).mod(h);return e.equals(g); };ECPointFp.prototype.toString = function () { return "(" + this.getX().toBigInteger().toString() + "," + this.getY().toBigInteger().toString() + ")"; };ECPointFp.prototype.validate = function () { var c = this.curve.getQ();if (this.isInfinity()) { throw new Error("Point is at infinity."); }var a = this.getX().toBigInteger();var b = this.getY().toBigInteger();if (a.compareTo(BigInteger.ONE) < 0 || a.compareTo(c.subtract(BigInteger.ONE)) > 0) { throw new Error("x coordinate out of bounds"); }if (b.compareTo(BigInteger.ONE) < 0 || b.compareTo(c.subtract(BigInteger.ONE)) > 0) { throw new Error("y coordinate out of bounds"); }if (!this.isOnCurve()) { throw new Error("Point is not on the curve."); }if (this.multiply(c).isInfinity()) { throw new Error("Point is not a scalar multiple of G."); }return true; }; /*! Mike Samuel (c) 2009 | code.google.com/p/json-sans-eval */ var jsonParse = function () { var e = "(?:-?\\b(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b)";var j = '(?:[^\\0-\\x08\\x0a-\\x1f"\\\\]|\\\\(?:["/\\\\bfnrt]|u[0-9A-Fa-f]{4}))';var i = '(?:"' + j + '*")';var d = new RegExp("(?:false|true|null|[\\{\\}\\[\\]]|" + e + "|" + i + ")", "g");var k = new RegExp("\\\\(?:([^u])|u(.{4}))", "g");var g = { '"': '"', "/": "/", "\\": "\\", b: "\b", f: "\f", n: "\n", r: "\r", t: "\t" };function h(l, m, n) { return m ? g[m] : String.fromCharCode(parseInt(n, 16)); }var c = new String("");var a = "\\";var f = { "{": Object, "[": Array };var b = Object.hasOwnProperty;return function (u, q) { var p = u.match(d);var x;var v = p[0];var l = false;if ("{" === v) { x = {}; } else { if ("[" === v) { x = []; } else { x = [];l = true; } }var t;var r = [x];for (var o = 1 - l, m = p.length; o < m; ++o) { v = p[o];var w;switch (v.charCodeAt(0)) {default: w = r[0];w[t || w.length] = +v;t = void 0;break;case 34: v = v.substring(1, v.length - 1);if (v.indexOf(a) !== -1) { v = v.replace(k, h); }w = r[0];if (!t) { if (w instanceof Array) { t = w.length; } else { t = v || c;break; } }w[t] = v;t = void 0;break;case 91: w = r[0];r.unshift(w[t || w.length] = []);t = void 0;break;case 93: r.shift();break;case 102: w = r[0];w[t || w.length] = false;t = void 0;break;case 110: w = r[0];w[t || w.length] = null;t = void 0;break;case 116: w = r[0];w[t || w.length] = true;t = void 0;break;case 123: w = r[0];r.unshift(w[t || w.length] = {});t = void 0;break;case 125: r.shift();break;} }if (l) { if (r.length !== 1) { throw new Error(); }x = x[0]; } else { if (r.length) { throw new Error(); } }if (q) { var s = function s(C, B) { var D = C[B];if (D && (typeof D === "undefined" ? "undefined" : _typeof(D)) === "object") { var n = null;for (var z in D) { if (b.call(D, z) && D !== C) { var y = s(D, z);if (y !== void 0) { D[z] = y; } else { if (!n) { n = []; }n.push(z); } } }if (n) { for (var A = n.length; --A >= 0;) { delete D[n[A]]; } } }return q.call(C, B, D); };x = s({ "": x }, ""); }return x; }; }(); if (typeof KJUR == "undefined" || !KJUR) { exports.KJUR = KJUR = {}; }if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) { KJUR.asn1 = {}; }KJUR.asn1.ASN1Util = new function () { this.integerToByteHex = function (a) { var b = a.toString(16);if (b.length % 2 == 1) { b = "0" + b; }return b; };this.bigIntToMinTwosComplementsHex = function (j) { var f = j.toString(16);if (f.substr(0, 1) != "-") { if (f.length % 2 == 1) { f = "0" + f; } else { if (!f.match(/^[0-7]/)) { f = "00" + f; } } } else { var a = f.substr(1);var e = a.length;if (e % 2 == 1) { e += 1; } else { if (!f.match(/^[0-7]/)) { e += 2; } }var g = "";for (var d = 0; d < e; d++) { g += "f"; }var c = new BigInteger(g, 16);var b = c.xor(j).add(BigInteger.ONE);f = b.toString(16).replace(/^-/, ""); }return f; };this.getPEMStringFromHex = function (a, b) { return hextopem(a, b); };this.newObject = function (k) { var F = KJUR, o = F.asn1, v = o.ASN1Object, B = o.DERBoolean, e = o.DERInteger, t = o.DERBitString, h = o.DEROctetString, x = o.DERNull, y = o.DERObjectIdentifier, m = o.DEREnumerated, g = o.DERUTF8String, f = o.DERNumericString, A = o.DERPrintableString, w = o.DERTeletexString, q = o.DERIA5String, E = o.DERUTCTime, j = o.DERGeneralizedTime, b = o.DERVisibleString, l = o.DERBMPString, n = o.DERSequence, c = o.DERSet, s = o.DERTaggedObject, p = o.ASN1Util.newObject;if (k instanceof o.ASN1Object) { return k; }var u = Object.keys(k);if (u.length != 1) { throw new Error("key of param shall be only one."); }var H = u[0];if (":asn1:bool:int:bitstr:octstr:null:oid:enum:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:visstr:bmpstr:seq:set:tag:".indexOf(":" + H + ":") == -1) { throw new Error("undefined key: " + H); }if (H == "bool") { return new B(k[H]); }if (H == "int") { return new e(k[H]); }if (H == "bitstr") { return new t(k[H]); }if (H == "octstr") { return new h(k[H]); }if (H == "null") { return new x(k[H]); }if (H == "oid") { return new y(k[H]); }if (H == "enum") { return new m(k[H]); }if (H == "utf8str") { return new g(k[H]); }if (H == "numstr") { return new f(k[H]); }if (H == "prnstr") { return new A(k[H]); }if (H == "telstr") { return new w(k[H]); }if (H == "ia5str") { return new q(k[H]); }if (H == "utctime") { return new E(k[H]); }if (H == "gentime") { return new j(k[H]); }if (H == "visstr") { return new b(k[H]); }if (H == "bmpstr") { return new l(k[H]); }if (H == "asn1") { return new v(k[H]); }if (H == "seq") { var d = k[H];var G = [];for (var z = 0; z < d.length; z++) { var D = p(d[z]);G.push(D); }return new n({ array: G }); }if (H == "set") { var d = k[H];var G = [];for (var z = 0; z < d.length; z++) { var D = p(d[z]);G.push(D); }return new c({ array: G }); }if (H == "tag") { var C = k[H];if (Object.prototype.toString.call(C) === "[object Array]" && C.length == 3) { var r = p(C[2]);return new s({ tag: C[0], explicit: C[1], obj: r }); } else { return new s(C); } } };this.jsonToASN1HEX = function (b) { var a = this.newObject(b);return a.getEncodedHex(); }; }();KJUR.asn1.ASN1Util.oidHexToInt = function (a) { var j = "";var k = parseInt(a.substr(0, 2), 16);var d = Math.floor(k / 40);var c = k % 40;var j = d + "." + c;var e = "";for (var f = 2; f < a.length; f += 2) { var g = parseInt(a.substr(f, 2), 16);var h = ("00000000" + g.toString(2)).slice(-8);e = e + h.substr(1, 7);if (h.substr(0, 1) == "0") { var b = new BigInteger(e, 2);j = j + "." + b.toString(10);e = ""; } }return j; };KJUR.asn1.ASN1Util.oidIntToHex = function (f) { var e = function e(a) { var k = a.toString(16);if (k.length == 1) { k = "0" + k; }return k; };var d = function d(o) { var n = "";var k = new BigInteger(o, 10);var a = k.toString(2);var l = 7 - a.length % 7;if (l == 7) { l = 0; }var q = "";for (var m = 0; m < l; m++) { q += "0"; }a = q + a;for (var m = 0; m < a.length - 1; m += 7) { var p = a.substr(m, 7);if (m != a.length - 7) { p = "1" + p; }n += e(parseInt(p, 2)); }return n; };if (!f.match(/^[0-9.]+$/)) { throw "malformed oid string: " + f; }var g = "";var b = f.split(".");var j = parseInt(b[0]) * 40 + parseInt(b[1]);g += e(j);b.splice(0, 2);for (var c = 0; c < b.length; c++) { g += d(b[c]); }return g; };KJUR.asn1.ASN1Object = function (e) { var c = true;var b = null;var d = "00";var f = "00";var a = "";this.params = null;this.getLengthHexFromValue = function () { if (typeof this.hV == "undefined" || this.hV == null) { throw new Error("this.hV is null or undefined"); }if (this.hV.length % 2 == 1) { throw new Error("value hex must be even length: n=" + a.length + ",v=" + this.hV); }var j = this.hV.length / 2;var i = j.toString(16);if (i.length % 2 == 1) { i = "0" + i; }if (j < 128) { return i; } else { var h = i.length / 2;if (h > 15) { throw "ASN.1 length too long to represent by 8x: n = " + j.toString(16); }var g = 128 + h;return g.toString(16) + i; } };this.getEncodedHex = function () { if (this.hTLV == null || this.isModified) { this.hV = this.getFreshValueHex();this.hL = this.getLengthHexFromValue();this.hTLV = this.hT + this.hL + this.hV;this.isModified = false; }return this.hTLV; };this.getValueHex = function () { this.getEncodedHex();return this.hV; };this.getFreshValueHex = function () { return ""; };this.setByParam = function (g) { this.params = g; };if (e != undefined) { if (e.tlv != undefined) { this.hTLV = e.tlv;this.isModified = false; } } };KJUR.asn1.DERAbstractString = function (c) { KJUR.asn1.DERAbstractString.superclass.constructor.call(this);var b = null;var a = null;this.getString = function () { return this.s; };this.setString = function (d) { this.hTLV = null;this.isModified = true;this.s = d;this.hV = utf8tohex(this.s).toLowerCase(); };this.setStringHex = function (d) { this.hTLV = null;this.isModified = true;this.s = null;this.hV = d; };this.getFreshValueHex = function () { return this.hV; };if (typeof c != "undefined") { if (typeof c == "string") { this.setString(c); } else { if (typeof c.str != "undefined") { this.setString(c.str); } else { if (typeof c.hex != "undefined") { this.setStringHex(c.hex); } } } } };YAHOO.lang.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object);KJUR.asn1.DERAbstractTime = function (c) { KJUR.asn1.DERAbstractTime.superclass.constructor.call(this);var b = null;var a = null;this.localDateToUTC = function (g) { var e = g.getTime() + g.getTimezoneOffset() * 60000;var f = new Date(e);return f; };this.formatDate = function (m, o, e) { var g = this.zeroPadding;var n = this.localDateToUTC(m);var p = String(n.getFullYear());if (o == "utc") { p = p.substr(2, 2); }var l = g(String(n.getMonth() + 1), 2);var q = g(String(n.getDate()), 2);var h = g(String(n.getHours()), 2);var i = g(String(n.getMinutes()), 2);var j = g(String(n.getSeconds()), 2);var r = p + l + q + h + i + j;if (e === true) { var f = n.getMilliseconds();if (f != 0) { var k = g(String(f), 3);k = k.replace(/[0]+$/, "");r = r + "." + k; } }return r + "Z"; };this.zeroPadding = function (e, d) { if (e.length >= d) { return e; }return new Array(d - e.length + 1).join("0") + e; };this.getString = function () { return this.s; };this.setString = function (d) { this.hTLV = null;this.isModified = true;this.s = d;this.hV = stohex(d); };this.setByDateValue = function (h, j, e, d, f, g) { var i = new Date(Date.UTC(h, j - 1, e, d, f, g, 0));this.setByDate(i); };this.getFreshValueHex = function () { return this.hV; }; };YAHOO.lang.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object);KJUR.asn1.DERAbstractStructured = function (b) { KJUR.asn1.DERAbstractString.superclass.constructor.call(this);var a = null;this.setByASN1ObjectArray = function (c) { this.hTLV = null;this.isModified = true;this.asn1Array = c; };this.appendASN1Object = function (c) { this.hTLV = null;this.isModified = true;this.asn1Array.push(c); };this.asn1Array = new Array();if (typeof b != "undefined") { if (typeof b.array != "undefined") { this.asn1Array = b.array; } } };YAHOO.lang.extend(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object);KJUR.asn1.DERBoolean = function (a) { KJUR.asn1.DERBoolean.superclass.constructor.call(this);this.hT = "01";if (a == false) { this.hTLV = "010100"; } else { this.hTLV = "0101ff"; } };YAHOO.lang.extend(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object);KJUR.asn1.DERInteger = function (a) { KJUR.asn1.DERInteger.superclass.constructor.call(this);this.hT = "02";this.setByBigInteger = function (b) { this.hTLV = null;this.isModified = true;this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(b); };this.setByInteger = function (c) { var b = new BigInteger(String(c), 10);this.setByBigInteger(b); };this.setValueHex = function (b) { this.hV = b; };this.getFreshValueHex = function () { return this.hV; };if (typeof a != "undefined") { if (typeof a.bigint != "undefined") { this.setByBigInteger(a.bigint); } else { if (typeof a["int"] != "undefined") { this.setByInteger(a["int"]); } else { if (typeof a == "number") { this.setByInteger(a); } else { if (typeof a.hex != "undefined") { this.setValueHex(a.hex); } } } } } };YAHOO.lang.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object);KJUR.asn1.DERBitString = function (b) { if (b !== undefined && typeof b.obj !== "undefined") { var a = KJUR.asn1.ASN1Util.newObject(b.obj);b.hex = "00" + a.getEncodedHex(); }KJUR.asn1.DERBitString.superclass.constructor.call(this);this.hT = "03";this.setHexValueIncludingUnusedBits = function (c) { this.hTLV = null;this.isModified = true;this.hV = c; };this.setUnusedBitsAndHexValue = function (c, e) { if (c < 0 || 7 < c) { throw "unused bits shall be from 0 to 7: u = " + c; }var d = "0" + c;this.hTLV = null;this.isModified = true;this.hV = d + e; };this.setByBinaryString = function (e) { e = e.replace(/0+$/, "");var f = 8 - e.length % 8;if (f == 8) { f = 0; }for (var g = 0; g <= f; g++) { e += "0"; }var j = "";for (var g = 0; g < e.length - 1; g += 8) { var d = e.substr(g, 8);var c = parseInt(d, 2).toString(16);if (c.length == 1) { c = "0" + c; }j += c; }this.hTLV = null;this.isModified = true;this.hV = "0" + f + j; };this.setByBooleanArray = function (e) { var d = "";for (var c = 0; c < e.length; c++) { if (e[c] == true) { d += "1"; } else { d += "0"; } }this.setByBinaryString(d); };this.newFalseArray = function (e) { var c = new Array(e);for (var d = 0; d < e; d++) { c[d] = false; }return c; };this.getFreshValueHex = function () { return this.hV; };if (typeof b != "undefined") { if (typeof b == "string" && b.toLowerCase().match(/^[0-9a-f]+$/)) { this.setHexValueIncludingUnusedBits(b); } else { if (typeof b.hex != "undefined") { this.setHexValueIncludingUnusedBits(b.hex); } else { if (typeof b.bin != "undefined") { this.setByBinaryString(b.bin); } else { if (typeof b.array != "undefined") { this.setByBooleanArray(b.array); } } } } } };YAHOO.lang.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object);KJUR.asn1.DEROctetString = function (b) { if (b !== undefined && typeof b.obj !== "undefined") { var a = KJUR.asn1.ASN1Util.newObject(b.obj);b.hex = a.getEncodedHex(); }KJUR.asn1.DEROctetString.superclass.constructor.call(this, b);this.hT = "04"; };YAHOO.lang.extend(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString);KJUR.asn1.DERNull = function () { KJUR.asn1.DERNull.superclass.constructor.call(this);this.hT = "05";this.hTLV = "0500"; };YAHOO.lang.extend(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object);KJUR.asn1.DERObjectIdentifier = function (a) { KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this);this.hT = "06";this.setValueHex = function (b) { this.hTLV = null;this.isModified = true;this.s = null;this.hV = b; };this.setValueOidString = function (b) { var c = oidtohex(b);if (c == null) { throw new Error("malformed oid string: " + b); }this.hTLV = null;this.isModified = true;this.s = null;this.hV = c; };this.setValueName = function (c) { var b = KJUR.asn1.x509.OID.name2oid(c);if (b !== "") { this.setValueOidString(b); } else { throw new Error("DERObjectIdentifier oidName undefined: " + c); } };this.setValueNameOrOid = function (b) { if (b.match(/^[0-2].[0-9.]+$/)) { this.setValueOidString(b); } else { this.setValueName(b); } };this.getFreshValueHex = function () { return this.hV; };this.setByParam = function (b) { if (typeof b === "string") { this.setValueNameOrOid(b); } else { if (b.oid !== undefined) { this.setValueNameOrOid(b.oid); } else { if (b.name !== undefined) { this.setValueNameOrOid(b.name); } else { if (b.hex !== undefined) { this.setValueHex(b.hex); } } } } };if (a !== undefined) { this.setByParam(a); } };YAHOO.lang.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object);KJUR.asn1.DEREnumerated = function (a) { KJUR.asn1.DEREnumerated.superclass.constructor.call(this);this.hT = "0a";this.setByBigInteger = function (b) { this.hTLV = null;this.isModified = true;this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(b); };this.setByInteger = function (c) { var b = new BigInteger(String(c), 10);this.setByBigInteger(b); };this.setValueHex = function (b) { this.hV = b; };this.getFreshValueHex = function () { return this.hV; };if (typeof a != "undefined") { if (typeof a["int"] != "undefined") { this.setByInteger(a["int"]); } else { if (typeof a == "number") { this.setByInteger(a); } else { if (typeof a.hex != "undefined") { this.setValueHex(a.hex); } } } } };YAHOO.lang.extend(KJUR.asn1.DEREnumerated, KJUR.asn1.ASN1Object);KJUR.asn1.DERUTF8String = function (a) { KJUR.asn1.DERUTF8String.superclass.constructor.call(this, a);this.hT = "0c"; };YAHOO.lang.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString);KJUR.asn1.DERNumericString = function (a) { KJUR.asn1.DERNumericString.superclass.constructor.call(this, a);this.hT = "12"; };YAHOO.lang.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString);KJUR.asn1.DERPrintableString = function (a) { KJUR.asn1.DERPrintableString.superclass.constructor.call(this, a);this.hT = "13"; };YAHOO.lang.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString);KJUR.asn1.DERTeletexString = function (a) { KJUR.asn1.DERTeletexString.superclass.constructor.call(this, a);this.hT = "14"; };YAHOO.lang.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString);KJUR.asn1.DERIA5String = function (a) { KJUR.asn1.DERIA5String.superclass.constructor.call(this, a);this.hT = "16"; };YAHOO.lang.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString);KJUR.asn1.DERVisibleString = function (a) { KJUR.asn1.DERIA5String.superclass.constructor.call(this, a);this.hT = "1a"; };YAHOO.lang.extend(KJUR.asn1.DERVisibleString, KJUR.asn1.DERAbstractString);KJUR.asn1.DERBMPString = function (a) { KJUR.asn1.DERBMPString.superclass.constructor.call(this, a);this.hT = "1e"; };YAHOO.lang.extend(KJUR.asn1.DERBMPString, KJUR.asn1.DERAbstractString);KJUR.asn1.DERUTCTime = function (a) { KJUR.asn1.DERUTCTime.superclass.constructor.call(this, a);this.hT = "17";this.setByDate = function (b) { this.hTLV = null;this.isModified = true;this.date = b;this.s = this.formatDate(this.date, "utc");this.hV = stohex(this.s); };this.getFreshValueHex = function () { if (typeof this.date == "undefined" && typeof this.s == "undefined") { this.date = new Date();this.s = this.formatDate(this.date, "utc");this.hV = stohex(this.s); }return this.hV; };if (a !== undefined) { if (a.str !== undefined) { this.setString(a.str); } else { if (typeof a == "string" && a.match(/^[0-9]{12}Z$/)) { this.setString(a); } else { if (a.hex !== undefined) { this.setStringHex(a.hex); } else { if (a.date !== undefined) { this.setByDate(a.date); } } } } } };YAHOO.lang.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime);KJUR.asn1.DERGeneralizedTime = function (a) { KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, a);this.hT = "18";this.withMillis = false;this.setByDate = function (b) { this.hTLV = null;this.isModified = true;this.date = b;this.s = this.formatDate(this.date, "gen", this.withMillis);this.hV = stohex(this.s); };this.getFreshValueHex = function () { if (this.date === undefined && this.s === undefined) { this.date = new Date();this.s = this.formatDate(this.date, "gen", this.withMillis);this.hV = stohex(this.s); }return this.hV; };if (a !== undefined) { if (a.str !== undefined) { this.setString(a.str); } else { if (typeof a == "string" && a.match(/^[0-9]{14}Z$/)) { this.setString(a); } else { if (a.hex !== undefined) { this.setStringHex(a.hex); } else { if (a.date !== undefined) { this.setByDate(a.date); } } } }if (a.millis === true) { this.withMillis = true; } } };YAHOO.lang.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime);KJUR.asn1.DERSequence = function (a) { KJUR.asn1.DERSequence.superclass.constructor.call(this, a);this.hT = "30";this.getFreshValueHex = function () { var c = "";for (var b = 0; b < this.asn1Array.length; b++) { var d = this.asn1Array[b];c += d.getEncodedHex(); }this.hV = c;return this.hV; }; };YAHOO.lang.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured);KJUR.asn1.DERSet = function (a) { KJUR.asn1.DERSet.superclass.constructor.call(this, a);this.hT = "31";this.sortFlag = true;this.getFreshValueHex = function () { var b = new Array();for (var c = 0; c < this.asn1Array.length; c++) { var d = this.asn1Array[c];b.push(d.getEncodedHex()); }if (this.sortFlag == true) { b.sort(); }this.hV = b.join("");return this.hV; };if (typeof a != "undefined") { if (typeof a.sortflag != "undefined" && a.sortflag == false) { this.sortFlag = false; } } };YAHOO.lang.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured);KJUR.asn1.DERTaggedObject = function (b) { KJUR.asn1.DERTaggedObject.superclass.constructor.call(this);var a = KJUR.asn1;this.hT = "a0";this.hV = "";this.isExplicit = true;this.asn1Object = null;this.setASN1Object = function (c, d, e) { this.hT = d;this.isExplicit = c;this.asn1Object = e;if (this.isExplicit) { this.hV = this.asn1Object.getEncodedHex();this.hTLV = null;this.isModified = true; } else { this.hV = null;this.hTLV = e.getEncodedHex();this.hTLV = this.hTLV.replace(/^../, d);this.isModified = false; } };this.getFreshValueHex = function () { return this.hV; };this.setByParam = function (c) { if (c.tag != undefined) { this.hT = c.tag; }if (c.explicit != undefined) { this.isExplicit = c.explicit; }if (c.tage != undefined) { this.hT = c.tage;this.isExplicit = true; }if (c.tagi != undefined) { this.hT = c.tagi;this.isExplicit = false; }if (c.obj != undefined) { if (c.obj instanceof a.ASN1Object) { this.asn1Object = c.obj;this.setASN1Object(this.isExplicit, this.hT, this.asn1Object); } else { if (_typeof(c.obj) == "object") { this.asn1Object = a.ASN1Util.newObject(c.obj);this.setASN1Object(this.isExplicit, this.hT, this.asn1Object); } } } };if (b != undefined) { this.setByParam(b); } };YAHOO.lang.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object); var ASN1HEX = new function () {}();ASN1HEX.getLblen = function (c, a) { if (c.substr(a + 2, 1) != "8") { return 1; }var b = parseInt(c.substr(a + 3, 1));if (b == 0) { return -1; }if (0 < b && b < 10) { return b + 1; }return -2; };ASN1HEX.getL = function (c, b) { var a = ASN1HEX.getLblen(c, b);if (a < 1) { return ""; }return c.substr(b + 2, a * 2); };ASN1HEX.getVblen = function (d, a) { var c, b;c = ASN1HEX.getL(d, a);if (c == "") { return -1; }if (c.substr(0, 1) === "8") { b = new BigInteger(c.substr(2), 16); } else { b = new BigInteger(c, 16); }return b.intValue(); };ASN1HEX.getVidx = function (c, b) { var a = ASN1HEX.getLblen(c, b);if (a < 0) { return a; }return b + (a + 1) * 2; };ASN1HEX.getV = function (d, a) { var c = ASN1HEX.getVidx(d, a);var b = ASN1HEX.getVblen(d, a);return d.substr(c, b * 2); };ASN1HEX.getTLV = function (b, a) { return b.substr(a, 2) + ASN1HEX.getL(b, a) + ASN1HEX.getV(b, a); };ASN1HEX.getTLVblen = function (b, a) { return 2 + ASN1HEX.getLblen(b, a) * 2 + ASN1HEX.getVblen(b, a) * 2; };ASN1HEX.getNextSiblingIdx = function (d, a) { var c = ASN1HEX.getVidx(d, a);var b = ASN1HEX.getVblen(d, a);return c + b * 2; };ASN1HEX.getChildIdx = function (e, k) { var l = ASN1HEX;var j = [];var c, f, g;c = l.getVidx(e, k);f = l.getVblen(e, k) * 2;if (e.substr(k, 2) == "03") { c += 2;f -= 2; }g = 0;var d = c;while (g <= f) { var b = l.getTLVblen(e, d);g += b;if (g <= f) { j.push(d); }d += b;if (g >= f) { break; } }return j; };ASN1HEX.getNthChildIdx = function (d, b, e) { var c = ASN1HEX.getChildIdx(d, b);return c[e]; };ASN1HEX.getIdxbyList = function (e, d, c, i) { var g = ASN1HEX;var f, b;if (c.length == 0) { if (i !== undefined) { if (e.substr(d, 2) !== i) { return -1; } }return d; }f = c.shift();b = g.getChildIdx(e, d);if (f >= b.length) { return -1; }return g.getIdxbyList(e, b[f], c, i); };ASN1HEX.getIdxbyListEx = function (f, k, b, g) { var m = ASN1HEX;var d, l;if (b.length == 0) { if (g !== undefined) { if (f.substr(k, 2) !== g) { return -1; } }return k; }d = b.shift();l = m.getChildIdx(f, k);var j = 0;for (var e = 0; e < l.length; e++) { var c = f.substr(l[e], 2);if (typeof d == "number" && !m.isContextTag(c) && j == d || typeof d == "string" && m.isContextTag(c, d)) { return m.getIdxbyListEx(f, l[e], b, g); }if (!m.isContextTag(c)) { j++; } }return -1; };ASN1HEX.getTLVbyList = function (d, c, b, f) { var e = ASN1HEX;var a = e.getIdxbyList(d, c, b, f);if (a == -1) { return null; }if (a >= d.length) { return null; }return e.getTLV(d, a); };ASN1HEX.getTLVbyListEx = function (d, c, b, f) { var e = ASN1HEX;var a = e.getIdxbyListEx(d, c, b, f);if (a == -1) { return null; }return e.getTLV(d, a); };ASN1HEX.getVbyList = function (e, c, b, g, i) { var f = ASN1HEX;var a, d;a = f.getIdxbyList(e, c, b, g);if (a == -1) { return null; }if (a >= e.length) { return null; }d = f.getV(e, a);if (i === true) { d = d.substr(2); }return d; };ASN1HEX.getVbyListEx = function (b, e, a, d, f) { var j = ASN1HEX;var g, c, i;g = j.getIdxbyListEx(b, e, a, d);if (g == -1) { return null; }i = j.getV(b, g);if (b.substr(g, 2) == "03" && f !== false) { i = i.substr(2); }return i; };ASN1HEX.getInt = function (e, b, f) { if (f == undefined) { f = -1; }try { var c = e.substr(b, 2);if (c != "02" && c != "03") { return f; }var a = ASN1HEX.getV(e, b);if (c == "02") { return parseInt(a, 16); } else { return bitstrtoint(a); } } catch (d) { return f; } };ASN1HEX.getOID = function (c, a, d) { if (d == undefined) { d = null; }try { if (c.substr(a, 2) != "06") { return d; }var e = ASN1HEX.getV(c, a);return hextooid(e); } catch (b) { return d; } };ASN1HEX.getOIDName = function (d, a, f) { if (f == undefined) { f = null; }try { var e = ASN1HEX.getOID(d, a, f);if (e == f) { return f; }var b = KJUR.asn1.x509.OID.oid2name(e);if (b == "") { return e; }return b; } catch (c) { return f; } };ASN1HEX.getString = function (d, b, e) { if (e == undefined) { e = null; }try { var a = ASN1HEX.getV(d, b);return hextorstr(a); } catch (c) { return e; } };ASN1HEX.hextooidstr = function (e) { var h = function h(b, a) { if (b.length >= a) { return b; }return new Array(a - b.length + 1).join("0") + b; };var l = [];var o = e.substr(0, 2);var f = parseInt(o, 16);l[0] = new String(Math.floor(f / 40));l[1] = new String(f % 40);var m = e.substr(2);var k = [];for (var g = 0; g < m.length / 2; g++) { k.push(parseInt(m.substr(g * 2, 2), 16)); }var j = [];var d = "";for (var g = 0; g < k.length; g++) { if (k[g] & 128) { d = d + h((k[g] & 127).toString(2), 7); } else { d = d + h((k[g] & 127).toString(2), 7);j.push(new String(parseInt(d, 2)));d = ""; } }var n = l.join(".");if (j.length > 0) { n = n + "." + j.join("."); }return n; };ASN1HEX.dump = function (t, c, l, g) { var p = ASN1HEX;var j = p.getV;var y = p.dump;var w = p.getChildIdx;var e = t;if (t instanceof KJUR.asn1.ASN1Object) { e = t.getEncodedHex(); }var q = function q(A, i) { if (A.length <= i * 2) { return A; } else { var v = A.substr(0, i) + "..(total " + A.length / 2 + "bytes).." + A.substr(A.length - i, i);return v; } };if (c === undefined) { c = { ommit_long_octet: 32 }; }if (l === undefined) { l = 0; }if (g === undefined) { g = ""; }var x = c.ommit_long_octet;var z = e.substr(l, 2);if (z == "01") { var h = j(e, l);if (h == "00") { return g + "BOOLEAN FALSE\n"; } else { return g + "BOOLEAN TRUE\n"; } }if (z == "02") { var h = j(e, l);return g + "INTEGER " + q(h, x) + "\n"; }if (z == "03") { var h = j(e, l);if (p.isASN1HEX(h.substr(2))) { var k = g + "BITSTRING, encapsulates\n";k = k + y(h.substr(2), c, 0, g + " ");return k; } else { return g + "BITSTRING " + q(h, x) + "\n"; } }if (z == "04") { var h = j(e, l);if (p.isASN1HEX(h)) { var k = g + "OCTETSTRING, encapsulates\n";k = k + y(h, c, 0, g + " ");return k; } else { return g + "OCTETSTRING " + q(h, x) + "\n"; } }if (z == "05") { return g + "NULL\n"; }if (z == "06") { var m = j(e, l);var b = KJUR.asn1.ASN1Util.oidHexToInt(m);var o = KJUR.asn1.x509.OID.oid2name(b);var a = b.replace(/\./g, " ");if (o != "") { return g + "ObjectIdentifier " + o + " (" + a + ")\n"; } else { return g + "ObjectIdentifier (" + a + ")\n"; } }if (z == "0a") { return g + "ENUMERATED " + parseInt(j(e, l)) + "\n"; }if (z == "0c") { return g + "UTF8String '" + hextoutf8(j(e, l)) + "'\n"; }if (z == "13") { return g + "PrintableString '" + hextoutf8(j(e, l)) + "'\n"; }if (z == "14") { return g + "TeletexString '" + hextoutf8(j(e, l)) + "'\n"; }if (z == "16") { return g + "IA5String '" + hextoutf8(j(e, l)) + "'\n"; }if (z == "17") { return g + "UTCTime " + hextoutf8(j(e, l)) + "\n"; }if (z == "18") { return g + "GeneralizedTime " + hextoutf8(j(e, l)) + "\n"; }if (z == "1a") { return g + "VisualString '" + hextoutf8(j(e, l)) + "'\n"; }if (z == "1e") { return g + "BMPString '" + hextoutf8(j(e, l)) + "'\n"; }if (z == "30") { if (e.substr(l, 4) == "3000") { return g + "SEQUENCE {}\n"; }var k = g + "SEQUENCE\n";var d = w(e, l);var f = c;if ((d.length == 2 || d.length == 3) && e.substr(d[0], 2) == "06" && e.substr(d[d.length - 1], 2) == "04") { var o = p.oidname(j(e, d[0]));var r = JSON.parse(JSON.stringify(c));r.x509ExtName = o;f = r; }for (var u = 0; u < d.length; u++) { k = k + y(e, f, d[u], g + " "); }return k; }if (z == "31") { var k = g + "SET\n";var d = w(e, l);for (var u = 0; u < d.length; u++) { k = k + y(e, c, d[u], g + " "); }return k; }var z = parseInt(z, 16);if ((z & 128) != 0) { var n = z & 31;if ((z & 32) != 0) { var k = g + "[" + n + "]\n";var d = w(e, l);for (var u = 0; u < d.length; u++) { k = k + y(e, c, d[u], g + " "); }return k; } else { var h = j(e, l);if (ASN1HEX.isASN1HEX(h)) { var k = g + "[" + n + "]\n";k = k + y(h, c, 0, g + " ");return k; } else { if (h.substr(0, 8) == "68747470") { h = hextoutf8(h); } else { if (c.x509ExtName === "subjectAltName" && n == 2) { h = hextoutf8(h); } } }var k = g + "[" + n + "] " + h + "\n";return k; } }return g + "UNKNOWN(" + z + ") " + j(e, l) + "\n"; };ASN1HEX.isContextTag = function (c, b) { c = c.toLowerCase();var f, e;try { f = parseInt(c, 16); } catch (d) { return -1; }if (b === undefined) { if ((f & 192) == 128) { return true; } else { return false; } }try { var a = b.match(/^\[[0-9]+\]$/);if (a == null) { return false; }e = parseInt(b.substr(1, b.length - 1), 10);if (e > 31) { return false; }if ((f & 192) == 128 && (f & 31) == e) { return true; }return false; } catch (d) { return false; } };ASN1HEX.isASN1HEX = function (e) { var d = ASN1HEX;if (e.length % 2 == 1) { return false; }var c = d.getVblen(e, 0);var b = e.substr(0, 2);var f = d.getL(e, 0);var a = e.length - b.length - f.length;if (a == c * 2) { return true; }return false; };ASN1HEX.checkStrictDER = function (g, o, d, c, r) { var s = ASN1HEX;if (d === undefined) { if (typeof g != "string") { throw new Error("not hex string"); }g = g.toLowerCase();if (!KJUR.lang.String.isHex(g)) { throw new Error("not hex string"); }d = g.length;c = g.length / 2;if (c < 128) { r = 1; } else { r = Math.ceil(c.toString(16)) + 1; } }var k = s.getL(g, o);if (k.length > r * 2) { throw new Error("L of TLV too long: idx=" + o); }var n = s.getVblen(g, o);if (n > c) { throw new Error("value of L too long than hex: idx=" + o); }var q = s.getTLV(g, o);var f = q.length - 2 - s.getL(g, o).length;if (f !== n * 2) { throw new Error("V string length and L's value not the same:" + f + "/" + n * 2); }if (o === 0) { if (g.length != q.length) { throw new Error("total length and TLV length unmatch:" + g.length + "!=" + q.length); } }var b = g.substr(o, 2);if (b === "02") { var a = s.getVidx(g, o);if (g.substr(a, 2) == "00" && g.charCodeAt(a + 2) < 56) { throw new Error("not least zeros for DER INTEGER"); } }if (parseInt(b, 16) & 32) { var p = s.getVblen(g, o);var m = 0;var l = s.getChildIdx(g, o);for (var e = 0; e < l.length; e++) { var j = s.getTLV(g, l[e]);m += j.length;s.checkStrictDER(g, l[e], d, c, r); }if (p * 2 != m) { throw new Error("sum of children's TLV length and L unmatch: " + p * 2 + "!=" + m); } } };ASN1HEX.oidname = function (a) { var c = KJUR.asn1;if (KJUR.lang.String.isHex(a)) { a = c.ASN1Util.oidHexToInt(a); }var b = c.x509.OID.oid2name(a);if (b === "") { b = a; }return b; }; var KJUR;if (typeof KJUR == "undefined" || !KJUR) { exports.KJUR = KJUR = {}; }if (typeof KJUR.lang == "undefined" || !KJUR.lang) { KJUR.lang = {}; }KJUR.lang.String = function () {};function Base64x() {}function stoBA(d) { var b = new Array();for (var c = 0; c < d.length; c++) { b[c] = d.charCodeAt(c); }return b; }function BAtos(b) { var d = "";for (var c = 0; c < b.length; c++) { d = d + String.fromCharCode(b[c]); }return d; }function BAtohex(b) { var e = "";for (var d = 0; d < b.length; d++) { var c = b[d].toString(16);if (c.length == 1) { c = "0" + c; }e = e + c; }return e; }function stohex(a) { return BAtohex(stoBA(a)); }function stob64(a) { return hex2b64(stohex(a)); }function stob64u(a) { return b64tob64u(hex2b64(stohex(a))); }function b64utos(a) { return BAtos(b64toBA(b64utob64(a))); }function b64tob64u(a) { a = a.replace(/\=/g, "");a = a.replace(/\+/g, "-");a = a.replace(/\//g, "_");return a; }function b64utob64(a) { if (a.length % 4 == 2) { a = a + "=="; } else { if (a.length % 4 == 3) { a = a + "="; } }a = a.replace(/-/g, "+");a = a.replace(/_/g, "/");return a; }function hextob64u(a) { if (a.length % 2 == 1) { a = "0" + a; }return b64tob64u(hex2b64(a)); }function b64utohex(a) { return b64tohex(b64utob64(a)); }var utf8tob64u, b64utoutf8;if (typeof Buffer === "function") { exports.utf8tob64u = utf8tob64u = function utf8tob64u(a) { return b64tob64u(Buffer.from(a, "utf8").toString("base64")); };exports.b64utoutf8 = b64utoutf8 = function b64utoutf8(a) { return Buffer.from(b64utob64(a), "base64").toString("utf8"); }; } else { exports.utf8tob64u = utf8tob64u = function utf8tob64u(a) { return hextob64u(uricmptohex(encodeURIComponentAll(a))); };exports.b64utoutf8 = b64utoutf8 = function b64utoutf8(a) { return decodeURIComponent(hextouricmp(b64utohex(a))); }; }function utf8tob64(a) { return hex2b64(uricmptohex(encodeURIComponentAll(a))); }function b64toutf8(a) { return decodeURIComponent(hextouricmp(b64tohex(a))); }function utf8tohex(a) { return uricmptohex(encodeURIComponentAll(a)); }function hextoutf8(a) { return decodeURIComponent(hextouricmp(a)); }function hextorstr(c) { var b = "";for (var a = 0; a < c.length - 1; a += 2) { b += String.fromCharCode(parseInt(c.substr(a, 2), 16)); }return b; }function rstrtohex(c) { var a = "";for (var b = 0; b < c.length; b++) { a += ("0" + c.charCodeAt(b).toString(16)).slice(-2); }return a; }function hextob64(a) { return hex2b64(a); }function hextob64nl(b) { var a = hextob64(b);var c = a.replace(/(.{64})/g, "$1\r\n");c = c.replace(/\r\n$/, "");return c; }function b64nltohex(b) { var a = b.replace(/[^0-9A-Za-z\/+=]*/g, "");var c = b64tohex(a);return c; }function hextopem(a, b) { var c = hextob64nl(a);return "-----BEGIN " + b + "-----\r\n" + c + "\r\n-----END " + b + "-----\r\n"; }function pemtohex(a, b) { if (a.indexOf("-----BEGIN ") == -1) { throw "can't find PEM header: " + b; }if (b !== undefined) { a = a.replace(new RegExp("^[^]*-----BEGIN " + b + "-----"), "");a = a.replace(new RegExp("-----END " + b + "-----[^]*$"), ""); } else { a = a.replace(/^[^]*-----BEGIN [^-]+-----/, "");a = a.replace(/-----END [^-]+-----[^]*$/, ""); }return b64nltohex(a); }function hextoArrayBuffer(d) { if (d.length % 2 != 0) { throw "input is not even length"; }if (d.match(/^[0-9A-Fa-f]+$/) == null) { throw "input is not hexadecimal"; }var b = new ArrayBuffer(d.length / 2);var a = new DataView(b);for (var c = 0; c < d.length / 2; c++) { a.setUint8(c, parseInt(d.substr(c * 2, 2), 16)); }return b; }function ArrayBuffertohex(b) { var d = "";var a = new DataView(b);for (var c = 0; c < b.byteLength; c++) { d += ("00" + a.getUint8(c).toString(16)).slice(-2); }return d; }function zulutomsec(n) { var l, j, m, e, f, i, b, k;var a, h, g, c;c = n.match(/^(\d{2}|\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(|\.\d+)Z$/);if (c) { a = c[1];l = parseInt(a);if (a.length === 2) { if (50 <= l && l < 100) { l = 1900 + l; } else { if (0 <= l && l < 50) { l = 2000 + l; } } }j = parseInt(c[2]) - 1;m = parseInt(c[3]);e = parseInt(c[4]);f = parseInt(c[5]);i = parseInt(c[6]);b = 0;h = c[7];if (h !== "") { g = (h.substr(1) + "00").substr(0, 3);b = parseInt(g); }return Date.UTC(l, j, m, e, f, i, b); }throw "unsupported zulu format: " + n; }function zulutosec(a) { var b = zulutomsec(a);return ~~(b / 1000); }function zulutodate(a) { return new Date(zulutomsec(a)); }function datetozulu(g, e, f) { var b;var a = g.getUTCFullYear();if (e) { if (a < 1950 || 2049 < a) { throw "not proper year for UTCTime: " + a; }b = ("" + a).slice(-2); } else { b = ("000" + a).slice(-4); }b += ("0" + (g.getUTCMonth() + 1)).slice(-2);b += ("0" + g.getUTCDate()).slice(-2);b += ("0" + g.getUTCHours()).slice(-2);b += ("0" + g.getUTCMinutes()).slice(-2);b += ("0" + g.getUTCSeconds()).slice(-2);if (f) { var c = g.getUTCMilliseconds();if (c !== 0) { c = ("00" + c).slice(-3);c = c.replace(/0+$/g, "");b += "." + c; } }b += "Z";return b; }function uricmptohex(a) { return a.replace(/%/g, ""); }function hextouricmp(a) { return a.replace(/(..)/g, "%$1"); }function ipv6tohex(g) { var b = "malformed IPv6 address";if (!g.match(/^[0-9A-Fa-f:]+$/)) { throw b; }g = g.toLowerCase();var d = g.split(":").length - 1;if (d < 2) { throw b; }var e = ":".repeat(7 - d + 2);g = g.replace("::", e);var c = g.split(":");if (c.length != 8) { throw b; }for (var f = 0; f < 8; f++) { c[f] = ("0000" + c[f]).slice(-4); }return c.join(""); }function hextoipv6(e) { if (!e.match(/^[0-9A-Fa-f]{32}$/)) { throw "malformed IPv6 address octet"; }e = e.toLowerCase();var b = e.match(/.{1,4}/g);for (var d = 0; d < 8; d++) { b[d] = b[d].replace(/^0+/, "");if (b[d] == "") { b[d] = "0"; } }e = ":" + b.join(":") + ":";var c = e.match(/:(0:){2,}/g);if (c === null) { return e.slice(1, -1); }var f = "";for (var d = 0; d < c.length; d++) { if (c[d].length > f.length) { f = c[d]; } }e = e.replace(f, "::");return e.slice(1, -1); }function hextoip(b) { var d = "malformed hex value";if (!b.match(/^([0-9A-Fa-f][0-9A-Fa-f]){1,}$/)) { throw d; }if (b.length == 8) { var c;try { c = parseInt(b.substr(0, 2), 16) + "." + parseInt(b.substr(2, 2), 16) + "." + parseInt(b.substr(4, 2), 16) + "." + parseInt(b.substr(6, 2), 16);return c; } catch (a) { throw d; } } else { if (b.length == 32) { return hextoipv6(b); } else { return b; } } }function iptohex(f) { var j = "malformed IP address";f = f.toLowerCase(f);if (f.match(/^[0-9.]+$/)) { var b = f.split(".");if (b.length !== 4) { throw j; }var g = "";try { for (var e = 0; e < 4; e++) { var h = parseInt(b[e]);g += ("0" + h.toString(16)).slice(-2); }return g; } catch (c) { throw j; } } else { if (f.match(/^[0-9a-f:]+$/) && f.indexOf(":") !== -1) { return ipv6tohex(f); } else { throw j; } } }function encodeURIComponentAll(a) { var d = encodeURIComponent(a);var b = "";for (var c = 0; c < d.length; c++) { if (d[c] == "%") { b = b + d.substr(c, 3);c = c + 2; } else { b = b + "%" + stohex(d[c]); } }return b; }function newline_toUnix(a) { a = a.replace(/\r\n/mg, "\n");return a; }function newline_toDos(a) { a = a.replace(/\r\n/mg, "\n");a = a.replace(/\n/mg, "\r\n");return a; }KJUR.lang.String.isInteger = function (a) { if (a.match(/^[0-9]+$/)) { return true; } else { if (a.match(/^-[0-9]+$/)) { return true; } else { return false; } } };KJUR.lang.String.isHex = function (a) { return ishex(a); };function ishex(a) { if (a.length % 2 == 0 && (a.match(/^[0-9a-f]+$/) || a.match(/^[0-9A-F]+$/))) { return true; } else { return false; } }KJUR.lang.String.isBase64 = function (a) { a = a.replace(/\s+/g, "");if (a.match(/^[0-9A-Za-z+\/]+={0,3}$/) && a.length % 4 == 0) { return true; } else { return false; } };KJUR.lang.String.isBase64URL = function (a) { if (a.match(/[+/=]/)) { return false; }a = b64utob64(a);return KJUR.lang.String.isBase64(a); };KJUR.lang.String.isIntegerArray = function (a) { a = a.replace(/\s+/g, "");if (a.match(/^\[[0-9,]+\]$/)) { return true; } else { return false; } };KJUR.lang.String.isPrintable = function (a) { if (a.match(/^[0-9A-Za-z '()+,-./:=?]*$/) !== null) { return true; }return false; };KJUR.lang.String.isIA5 = function (a) { if (a.match(/^[\x20-\x21\x23-\x7f]*$/) !== null) { return true; }return false; };KJUR.lang.String.isMail = function (a) { if (a.match(/^[A-Za-z0-9]{1}[A-Za-z0-9_.-]*@{1}[A-Za-z0-9_.-]{1,}\.[A-Za-z0-9]{1,}$/) !== null) { return true; }return false; };function hextoposhex(a) { if (a.length % 2 == 1) { return "0" + a; }if (a.substr(0, 1) > "7") { return "00" + a; }return a; }function intarystrtohex(b) { b = b.replace(/^\s*\[\s*/, "");b = b.replace(/\s*\]\s*$/, "");b = b.replace(/\s*/g, "");try { var c = b.split(/,/).map(function (g, e, h) { var f = parseInt(g);if (f < 0 || 255 < f) { throw "integer not in range 0-255"; }var d = ("00" + f.toString(16)).slice(-2);return d; }).join("");return c; } catch (a) { throw "malformed integer array string: " + a; } }var strdiffidx = function strdiffidx(c, a) { var d = c.length;if (c.length > a.length) { d = a.length; }for (var b = 0; b < d; b++) { if (c.charCodeAt(b) != a.charCodeAt(b)) { return b; } }if (c.length != a.length) { return d; }return -1; };function oidtohex(g) { var f = function f(a) { var l = a.toString(16);if (l.length == 1) { l = "0" + l; }return l; };var e = function e(p) { var o = "";var l = parseInt(p, 10);var a = l.toString(2);var m = 7 - a.length % 7;if (m == 7) { m = 0; }var r = "";for (var n = 0; n < m; n++) { r += "0"; }a = r + a;for (var n = 0; n < a.length - 1; n += 7) { var q = a.substr(n, 7);if (n != a.length - 7) { q = "1" + q; }o += f(parseInt(q, 2)); }return o; };try { if (!g.match(/^[0-9.]+$/)) { return null; }var j = "";var b = g.split(".");var k = parseInt(b[0], 10) * 40 + parseInt(b[1], 10);j += f(k);b.splice(0, 2);for (var d = 0; d < b.length; d++) { j += e(b[d]); }return j; } catch (c) { return null; } }function hextooid(g) { if (!ishex(g)) { return null; }try { var m = [];var p = g.substr(0, 2);var e = parseInt(p, 16);m[0] = new String(Math.floor(e / 40));m[1] = new String(e % 40);var n = g.substr(2);var l = [];for (var f = 0; f < n.length / 2; f++) { l.push(parseInt(n.substr(f * 2, 2), 16)); }var k = [];var d = "";for (var f = 0; f < l.length; f++) { if (l[f] & 128) { d = d + strpad((l[f] & 127).toString(2), 7); } else { d = d + strpad((l[f] & 127).toString(2), 7);k.push(new String(parseInt(d, 2)));d = ""; } }var o = m.join(".");if (k.length > 0) { o = o + "." + k.join("."); }return o; } catch (j) { return null; } }var strpad = function strpad(c, b, a) { if (a == undefined) { a = "0"; }if (c.length >= b) { return c; }return new Array(b - c.length + 1).join(a) + c; };function bitstrtoint(e) { try { var a = e.substr(0, 2);if (a == "00") { return parseInt(e.substr(2), 16); }var b = parseInt(a, 16);var f = e.substr(2);var d = parseInt(f, 16).toString(2);if (d == "0") { d = "00000000"; }d = d.slice(0, 0 - b);return parseInt(d, 2); } catch (c) { return -1; } }function inttobitstr(e) { var c = Number(e).toString(2);var b = 8 - c.length % 8;if (b == 8) { b = 0; }c = c + strpad("", b, "0");var d = parseInt(c, 2).toString(16);if (d.length % 2 == 1) { d = "0" + d; }var a = "0" + b;return a + d; }; if (typeof KJUR == "undefined" || !KJUR) { exports.KJUR = KJUR = {}; }if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) { KJUR.crypto = {}; }KJUR.crypto.Util = new function () { this.DIGESTINFOHEAD = { sha1: "3021300906052b0e03021a05000414", sha224: "302d300d06096086480165030402040500041c", sha256: "3031300d060960864801650304020105000420", sha384: "3041300d060960864801650304020205000430", sha512: "3051300d060960864801650304020305000440", md2: "3020300c06082a864886f70d020205000410", md5: "3020300c06082a864886f70d020505000410", ripemd160: "3021300906052b2403020105000414" };this.DEFAULTPROVIDER = { md5: "cryptojs", sha1: "cryptojs", sha224: "cryptojs", sha256: "cryptojs", sha384: "cryptojs", sha512: "cryptojs", ripemd160: "cryptojs", hmacmd5: "cryptojs", hmacsha1: "cryptojs", hmacsha224: "cryptojs", hmacsha256: "cryptojs", hmacsha384: "cryptojs", hmacsha512: "cryptojs", hmacripemd160: "cryptojs", MD5withRSA: "cryptojs/jsrsa", SHA1withRSA: "cryptojs/jsrsa", SHA224withRSA: "cryptojs/jsrsa", SHA256withRSA: "cryptojs/jsrsa", SHA384withRSA: "cryptojs/jsrsa", SHA512withRSA: "cryptojs/jsrsa", RIPEMD160withRSA: "cryptojs/jsrsa", MD5withECDSA: "cryptojs/jsrsa", SHA1withECDSA: "cryptojs/jsrsa", SHA224withECDSA: "cryptojs/jsrsa", SHA256withECDSA: "cryptojs/jsrsa", SHA384withECDSA: "cryptojs/jsrsa", SHA512withECDSA: "cryptojs/jsrsa", RIPEMD160withECDSA: "cryptojs/jsrsa", SHA1withDSA: "cryptojs/jsrsa", SHA224withDSA: "cryptojs/jsrsa", SHA256withDSA: "cryptojs/jsrsa", MD5withRSAandMGF1: "cryptojs/jsrsa", SHAwithRSAandMGF1: "cryptojs/jsrsa", SHA1withRSAandMGF1: "cryptojs/jsrsa", SHA224withRSAandMGF1: "cryptojs/jsrsa", SHA256withRSAandMGF1: "cryptojs/jsrsa", SHA384withRSAandMGF1: "cryptojs/jsrsa", SHA512withRSAandMGF1: "cryptojs/jsrsa", RIPEMD160withRSAandMGF1: "cryptojs/jsrsa" };this.CRYPTOJSMESSAGEDIGESTNAME = { md5: CryptoJS.algo.MD5, sha1: CryptoJS.algo.SHA1, sha224: CryptoJS.algo.SHA224, sha256: CryptoJS.algo.SHA256, sha384: CryptoJS.algo.SHA384, sha512: CryptoJS.algo.SHA512, ripemd160: CryptoJS.algo.RIPEMD160 };this.getDigestInfoHex = function (a, b) { if (typeof this.DIGESTINFOHEAD[b] == "undefined") { throw "alg not supported in Util.DIGESTINFOHEAD: " + b; }return this.DIGESTINFOHEAD[b] + a; };this.getPaddedDigestInfoHex = function (h, a, j) { var c = this.getDigestInfoHex(h, a);var d = j / 4;if (c.length + 22 > d) { throw "key is too short for SigAlg: keylen=" + j + "," + a; }var b = "0001";var k = "00" + c;var g = "";var l = d - b.length - k.length;for (var f = 0; f < l; f += 2) { g += "ff"; }var e = b + g + k;return e; };this.hashString = function (a, c) { var b = new KJUR.crypto.MessageDigest({ alg: c });return b.digestString(a); };this.hashHex = function (b, c) { var a = new KJUR.crypto.MessageDigest({ alg: c });return a.digestHex(b); };this.sha1 = function (a) { return this.hashString(a, "sha1"); };this.sha256 = function (a) { return this.hashString(a, "sha256"); };this.sha256Hex = function (a) { return this.hashHex(a, "sha256"); };this.sha512 = function (a) { return this.hashString(a, "sha512"); };this.sha512Hex = function (a) { return this.hashHex(a, "sha512"); };this.isKey = function (a) { if (a instanceof RSAKey || a instanceof KJUR.crypto.DSA || a instanceof KJUR.crypto.ECDSA) { return true; } else { return false; } }; }();KJUR.crypto.Util.md5 = function (a) { var b = new KJUR.crypto.MessageDigest({ alg: "md5", prov: "cryptojs" });return b.digestString(a); };KJUR.crypto.Util.ripemd160 = function (a) { var b = new KJUR.crypto.MessageDigest({ alg: "ripemd160", prov: "cryptojs" });return b.digestString(a); };KJUR.crypto.Util.SECURERANDOMGEN = new SecureRandom();KJUR.crypto.Util.getRandomHexOfNbytes = function (b) { var a = new Array(b);KJUR.crypto.Util.SECURERANDOMGEN.nextBytes(a);return BAtohex(a); };KJUR.crypto.Util.getRandomBigIntegerOfNbytes = function (a) { return new BigInteger(KJUR.crypto.Util.getRandomHexOfNbytes(a), 16); };KJUR.crypto.Util.getRandomHexOfNbits = function (d) { var c = d % 8;var a = (d - c) / 8;var b = new Array(a + 1);KJUR.crypto.Util.SECURERANDOMGEN.nextBytes(b);b[0] = (255 << c & 255 ^ 255) & b[0];return BAtohex(b); };KJUR.crypto.Util.getRandomBigIntegerOfNbits = function (a) { return new BigInteger(KJUR.crypto.Util.getRandomHexOfNbits(a), 16); };KJUR.crypto.Util.getRandomBigIntegerZeroToMax = function (b) { var a = b.bitLength();while (1) { var c = KJUR.crypto.Util.getRandomBigIntegerOfNbits(a);if (b.compareTo(c) != -1) { return c; } } };KJUR.crypto.Util.getRandomBigIntegerMinToMax = function (e, b) { var c = e.compareTo(b);if (c == 1) { throw "biMin is greater than biMax"; }if (c == 0) { return e; }var a = b.subtract(e);var d = KJUR.crypto.Util.getRandomBigIntegerZeroToMax(a);return d.add(e); };KJUR.crypto.MessageDigest = function (c) { var b = null;var a = null;var d = null;this.setAlgAndProvider = function (g, f) { g = KJUR.crypto.MessageDigest.getCanonicalAlgName(g);if (g !== null && f === undefined) { f = KJUR.crypto.Util.DEFAULTPROVIDER[g]; }if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(g) != -1 && f == "cryptojs") { try { this.md = KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[g].create(); } catch (e) { throw "setAlgAndProvider hash alg set fail alg=" + g + "/" + e; }this.updateString = function (h) { this.md.update(h); };this.updateHex = function (h) { var i = CryptoJS.enc.Hex.parse(h);this.md.update(i); };this.digest = function () { var h = this.md.finalize();return h.toString(CryptoJS.enc.Hex); };this.digestString = function (h) { this.updateString(h);return this.digest(); };this.digestHex = function (h) { this.updateHex(h);return this.digest(); }; }if (":sha256:".indexOf(g) != -1 && f == "sjcl") { try { this.md = new sjcl.hash.sha256(); } catch (e) { throw "setAlgAndProvider hash alg set fail alg=" + g + "/" + e; }this.updateString = function (h) { this.md.update(h); };this.updateHex = function (i) { var h = sjcl.codec.hex.toBits(i);this.md.update(h); };this.digest = function () { var h = this.md.finalize();return sjcl.codec.hex.fromBits(h); };this.digestString = function (h) { this.updateString(h);return this.digest(); };this.digestHex = function (h) { this.updateHex(h);return this.digest(); }; } };this.updateString = function (e) { throw "updateString(str) not supported for this alg/prov: " + this.algName + "/" + this.provName; };this.updateHex = function (e) { throw "updateHex(hex) not supported for this alg/prov: " + this.algName + "/" + this.provName; };this.digest = function () { throw "digest() not supported for this alg/prov: " + this.algName + "/" + this.provName; };this.digestString = function (e) { throw "digestString(str) not supported for this alg/prov: " + this.algName + "/" + this.provName; };this.digestHex = function (e) { throw "digestHex(hex) not supported for this alg/prov: " + this.algName + "/" + this.provName; };if (c !== undefined) { if (c.alg !== undefined) { this.algName = c.alg;if (c.prov === undefined) { this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]; }this.setAlgAndProvider(this.algName, this.provName); } } };KJUR.crypto.MessageDigest.getCanonicalAlgName = function (a) { if (typeof a === "string") { a = a.toLowerCase();a = a.replace(/-/, ""); }return a; };KJUR.crypto.MessageDigest.getHashLength = function (c) { var b = KJUR.crypto.MessageDigest;var a = b.getCanonicalAlgName(c);if (b.HASHLENGTH[a] === undefined) { throw "not supported algorithm: " + c; }return b.HASHLENGTH[a]; };KJUR.crypto.MessageDigest.HASHLENGTH = { md5: 16, sha1: 20, sha224: 28, sha256: 32, sha384: 48, sha512: 64, ripemd160: 20 };KJUR.crypto.Mac = function (d) { var f = null;var c = null;var a = null;var e = null;var b = null;this.setAlgAndProvider = function (k, i) { k = k.toLowerCase();if (k == null) { k = "hmacsha1"; }k = k.toLowerCase();if (k.substr(0, 4) != "hmac") { throw "setAlgAndProvider unsupported HMAC alg: " + k; }if (i === undefined) { i = KJUR.crypto.Util.DEFAULTPROVIDER[k]; }this.algProv = k + "/" + i;var g = k.substr(4);if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(g) != -1 && i == "cryptojs") { try { var j = KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[g];this.mac = CryptoJS.algo.HMAC.create(j, this.pass); } catch (h) { throw "setAlgAndProvider hash alg set fail hashAlg=" + g + "/" + h; }this.updateString = function (l) { this.mac.update(l); };this.updateHex = function (l) { var m = CryptoJS.enc.Hex.parse(l);this.mac.update(m); };this.doFinal = function () { var l = this.mac.finalize();return l.toString(CryptoJS.enc.Hex); };this.doFinalString = function (l) { this.updateString(l);return this.doFinal(); };this.doFinalHex = function (l) { this.updateHex(l);return this.doFinal(); }; } };this.updateString = function (g) { throw "updateString(str) not supported for this alg/prov: " + this.algProv; };this.updateHex = function (g) { throw "updateHex(hex) not supported for this alg/prov: " + this.algProv; };this.doFinal = function () { throw "digest() not supported for this alg/prov: " + this.algProv; };this.doFinalString = function (g) { throw "digestString(str) not supported for this alg/prov: " + this.algProv; };this.doFinalHex = function (g) { throw "digestHex(hex) not supported for this alg/prov: " + this.algProv; };this.setPassword = function (h) { if (typeof h == "string") { var g = h;if (h.length % 2 == 1 || !h.match(/^[0-9A-Fa-f]+$/)) { g = rstrtohex(h); }this.pass = CryptoJS.enc.Hex.parse(g);return; }if ((typeof h === "undefined" ? "undefined" : _typeof(h)) != "object") { throw "KJUR.crypto.Mac unsupported password type: " + h; }var g = null;if (h.hex !== undefined) { if (h.hex.length % 2 != 0 || !h.hex.match(/^[0-9A-Fa-f]+$/)) { throw "Mac: wrong hex password: " + h.hex; }g = h.hex; }if (h.utf8 !== undefined) { g = utf8tohex(h.utf8); }if (h.rstr !== undefined) { g = rstrtohex(h.rstr); }if (h.b64 !== undefined) { g = b64tohex(h.b64); }if (h.b64u !== undefined) { g = b64utohex(h.b64u); }if (g == null) { throw "KJUR.crypto.Mac unsupported password type: " + h; }this.pass = CryptoJS.enc.Hex.parse(g); };if (d !== undefined) { if (d.pass !== undefined) { this.setPassword(d.pass); }if (d.alg !== undefined) { this.algName = d.alg;if (d.prov === undefined) { this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]; }this.setAlgAndProvider(this.algName, this.provName); } } };KJUR.crypto.Signature = function (o) { var q = null;var n = null;var r = null;var c = null;var l = null;var d = null;var k = null;var h = null;var p = null;var e = null;var b = -1;var g = null;var j = null;var a = null;var i = null;var f = null;this._setAlgNames = function () { var s = this.algName.match(/^(.+)with(.+)$/);if (s) { this.mdAlgName = s[1].toLowerCase();this.pubkeyAlgName = s[2].toLowerCase();if (this.pubkeyAlgName == "rsaandmgf1" && this.mdAlgName == "sha") { this.mdAlgName = "sha1"; } } };this._zeroPaddingOfSignature = function (x, w) { var v = "";var t = w / 4 - x.length;for (var u = 0; u < t; u++) { v = v + "0"; }return v + x; };this.setAlgAndProvider = function (u, t) { this._setAlgNames();if (t != "cryptojs/jsrsa") { throw new Error("provider not supported: " + t); }if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(this.mdAlgName) != -1) { try { this.md = new KJUR.crypto.MessageDigest({ alg: this.mdAlgName }); } catch (s) { throw new Error("setAlgAndProvider hash alg set fail alg=" + this.mdAlgName + "/" + s); }this.init = function (w, x) { var y = null;try { if (x === undefined) { y = KEYUTIL.getKey(w); } else { y = KEYUTIL.getKey(w, x); } } catch (v) { throw "init failed:" + v; }if (y.isPrivate === true) { this.prvKey = y;this.state = "SIGN"; } else { if (y.isPublic === true) { this.pubKey = y;this.state = "VERIFY"; } else { throw "init failed.:" + y; } } };this.updateString = function (v) { this.md.updateString(v); };this.updateHex = function (v) { this.md.updateHex(v); };this.sign = function () { this.sHashHex = this.md.digest();if (this.prvKey === undefined && this.ecprvhex !== undefined && this.eccurvename !== undefined && KJUR.crypto.ECDSA !== undefined) { this.prvKey = new KJUR.crypto.ECDSA({ curve: this.eccurvename, prv: this.ecprvhex }); }if (this.prvKey instanceof RSAKey && this.pubkeyAlgName === "rsaandmgf1") { this.hSign = this.prvKey.signWithMessageHashPSS(this.sHashHex, this.mdAlgName, this.pssSaltLen); } else { if (this.prvKey instanceof RSAKey && this.pubkeyAlgName === "rsa") { this.hSign = this.prvKey.signWithMessageHash(this.sHashHex, this.mdAlgName); } else { if (this.prvKey instanceof KJUR.crypto.ECDSA) { this.hSign = this.prvKey.signWithMessageHash(this.sHashHex); } else { if (this.prvKey instanceof KJUR.crypto.DSA) { this.hSign = this.prvKey.signWithMessageHash(this.sHashHex); } else { throw "Signature: unsupported private key alg: " + this.pubkeyAlgName; } } } }return this.hSign; };this.signString = function (v) { this.updateString(v);return this.sign(); };this.signHex = function (v) { this.updateHex(v);return this.sign(); };this.verify = function (v) { this.sHashHex = this.md.digest();if (this.pubKey === undefined && this.ecpubhex !== undefined && this.eccurvename !== undefined && KJUR.crypto.ECDSA !== undefined) { this.pubKey = new KJUR.crypto.ECDSA({ curve: this.eccurvename, pub: this.ecpubhex }); }if (this.pubKey instanceof RSAKey && this.pubkeyAlgName === "rsaandmgf1") { return this.pubKey.verifyWithMessageHashPSS(this.sHashHex, v, this.mdAlgName, this.pssSaltLen); } else { if (this.pubKey instanceof RSAKey && this.pubkeyAlgName === "rsa") { return this.pubKey.verifyWithMessageHash(this.sHashHex, v); } else { if (KJUR.crypto.ECDSA !== undefined && this.pubKey instanceof KJUR.crypto.ECDSA) { return this.pubKey.verifyWithMessageHash(this.sHashHex, v); } else { if (KJUR.crypto.DSA !== undefined && this.pubKey instanceof KJUR.crypto.DSA) { return this.pubKey.verifyWithMessageHash(this.sHashHex, v); } else { throw "Signature: unsupported public key alg: " + this.pubkeyAlgName; } } } } }; } };this.init = function (s, t) { throw "init(key, pass) not supported for this alg:prov=" + this.algProvName; };this.updateString = function (s) { throw "updateString(str) not supported for this alg:prov=" + this.algProvName; };this.updateHex = function (s) { throw "updateHex(hex) not supported for this alg:prov=" + this.algProvName; };this.sign = function () { throw "sign() not supported for this alg:prov=" + this.algProvName; };this.signString = function (s) { throw "digestString(str) not supported for this alg:prov=" + this.algProvName; };this.signHex = function (s) { throw "digestHex(hex) not supported for this alg:prov=" + this.algProvName; };this.verify = function (s) { throw "verify(hSigVal) not supported for this alg:prov=" + this.algProvName; };this.initParams = o;if (o !== undefined) { if (o.alg !== undefined) { this.algName = o.alg;if (o.prov === undefined) { this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]; } else { this.provName = o.prov; }this.algProvName = this.algName + ":" + this.provName;this.setAlgAndProvider(this.algName, this.provName);this._setAlgNames(); }if (o.psssaltlen !== undefined) { this.pssSaltLen = o.psssaltlen; }if (o.prvkeypem !== undefined) { if (o.prvkeypas !== undefined) { throw "both prvkeypem and prvkeypas parameters not supported"; } else { try { var q = KEYUTIL.getKey(o.prvkeypem);this.init(q); } catch (m) { throw "fatal error to load pem private key: " + m; } } } } };KJUR.crypto.Cipher = function (a) {};KJUR.crypto.Cipher.encrypt = function (e, f, d) { if (f instanceof RSAKey && f.isPublic) { var c = KJUR.crypto.Cipher.getAlgByKeyAndName(f, d);if (c === "RSA") { return f.encrypt(e); }if (c === "RSAOAEP") { return f.encryptOAEP(e, "sha1"); }var b = c.match(/^RSAOAEP(\d+)$/);if (b !== null) { return f.encryptOAEP(e, "sha" + b[1]); }throw "Cipher.encrypt: unsupported algorithm for RSAKey: " + d; } else { throw "Cipher.encrypt: unsupported key or algorithm"; } };KJUR.crypto.Cipher.decrypt = function (e, f, d) { if (f instanceof RSAKey && f.isPrivate) { var c = KJUR.crypto.Cipher.getAlgByKeyAndName(f, d);if (c === "RSA") { return f.decrypt(e); }if (c === "RSAOAEP") { return f.decryptOAEP(e, "sha1"); }var b = c.match(/^RSAOAEP(\d+)$/);if (b !== null) { return f.decryptOAEP(e, "sha" + b[1]); }throw "Cipher.decrypt: unsupported algorithm for RSAKey: " + d; } else { throw "Cipher.decrypt: unsupported key or algorithm"; } };KJUR.crypto.Cipher.getAlgByKeyAndName = function (b, a) { if (b instanceof RSAKey) { if (":RSA:RSAOAEP:RSAOAEP224:RSAOAEP256:RSAOAEP384:RSAOAEP512:".indexOf(a) != -1) { return a; }if (a === null || a === undefined) { return "RSA"; }throw "getAlgByKeyAndName: not supported algorithm name for RSAKey: " + a; }throw "getAlgByKeyAndName: not supported algorithm name: " + a; };KJUR.crypto.OID = new function () { this.oidhex2name = { "2a864886f70d010101": "rsaEncryption", "2a8648ce3d0201": "ecPublicKey", "2a8648ce380401": "dsa", "2a8648ce3d030107": "secp256r1", "2b8104001f": "secp192k1", "2b81040021": "secp224r1", "2b8104000a": "secp256k1", "2b81040023": "secp521r1", "2b81040022": "secp384r1", "2a8648ce380403": "SHA1withDSA", "608648016503040301": "SHA224withDSA", "608648016503040302": "SHA256withDSA" }; }(); if (typeof KJUR == "undefined" || !KJUR) { exports.KJUR = KJUR = {}; }if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) { KJUR.crypto = {}; }KJUR.crypto.ECDSA = function (e) { var g = "secp256r1";var p = null;var b = null;var i = null;var j = Error, f = BigInteger, h = ECPointFp, m = KJUR.crypto.ECDSA, c = KJUR.crypto.ECParameterDB, d = m.getName, q = ASN1HEX, n = q.getVbyListEx, k = q.isASN1HEX;var a = new SecureRandom();var o = null;this.type = "EC";this.isPrivate = false;this.isPublic = false;function l(x, t, w, s) { var r = Math.max(t.bitLength(), s.bitLength());var y = x.add2D(w);var v = x.curve.getInfinity();for (var u = r - 1; u >= 0; --u) { v = v.twice2D();v.z = f.ONE;if (t.testBit(u)) { if (s.testBit(u)) { v = v.add2D(y); } else { v = v.add2D(x); } } else { if (s.testBit(u)) { v = v.add2D(w); } } }return v; }this.getBigRandom = function (r) { return new f(r.bitLength(), a).mod(r.subtract(f.ONE)).add(f.ONE); };this.setNamedCurve = function (r) { this.ecparams = c.getByName(r);this.prvKeyHex = null;this.pubKeyHex = null;this.curveName = r; };this.setPrivateKeyHex = function (r) { this.isPrivate = true;this.prvKeyHex = r; };this.setPublicKeyHex = function (r) { this.isPublic = true;this.pubKeyHex = r; };this.getPublicKeyXYHex = function () { var t = this.pubKeyHex;if (t.substr(0, 2) !== "04") { throw "this method supports uncompressed format(04) only"; }var s = this.ecparams.keylen / 4;if (t.length !== 2 + s * 2) { throw "malformed public key hex length"; }var r = {};r.x = t.substr(2, s);r.y = t.substr(2 + s);return r; };this.getShortNISTPCurveName = function () { var r = this.curveName;if (r === "secp256r1" || r === "NIST P-256" || r === "P-256" || r === "prime256v1") { return "P-256"; }if (r === "secp384r1" || r === "NIST P-384" || r === "P-384") { return "P-384"; }return null; };this.generateKeyPairHex = function () { var t = this.ecparams.n;var w = this.getBigRandom(t);var u = this.ecparams.G.multiply(w);var z = u.getX().toBigInteger();var x = u.getY().toBigInteger();var r = this.ecparams.keylen / 4;var v = ("0000000000" + w.toString(16)).slice(-r);var A = ("0000000000" + z.toString(16)).slice(-r);var y = ("0000000000" + x.toString(16)).slice(-r);var s = "04" + A + y;this.setPrivateKeyHex(v);this.setPublicKeyHex(s);return { ecprvhex: v, ecpubhex: s }; };this.signWithMessageHash = function (r) { return this.signHex(r, this.prvKeyHex); };this.signHex = function (x, u) { var A = new f(u, 16);var v = this.ecparams.n;var z = new f(x.substring(0, this.ecparams.keylen / 4), 16);do { var w = this.getBigRandom(v);var B = this.ecparams.G;var y = B.multiply(w);var t = y.getX().toBigInteger().mod(v); } while (t.compareTo(f.ZERO) <= 0);var C = w.modInverse(v).multiply(z.add(A.multiply(t))).mod(v);return m.biRSSigToASN1Sig(t, C); };this.sign = function (w, B) { var z = B;var u = this.ecparams.n;var y = f.fromByteArrayUnsigned(w);do { var v = this.getBigRandom(u);var A = this.ecparams.G;var x = A.multiply(v);var t = x.getX().toBigInteger().mod(u); } while (t.compareTo(BigInteger.ZERO) <= 0);var C = v.modInverse(u).multiply(y.add(z.multiply(t))).mod(u);return this.serializeSig(t, C); };this.verifyWithMessageHash = function (s, r) { return this.verifyHex(s, r, this.pubKeyHex); };this.verifyHex = function (v, y, u) { try { var t, B;var w = m.parseSigHex(y);t = w.r;B = w.s;var x = h.decodeFromHex(this.ecparams.curve, u);var z = new f(v.substring(0, this.ecparams.keylen / 4), 16);return this.verifyRaw(z, t, B, x); } catch (A) { return false; } };this.verify = function (z, A, u) { var w, t;if (Bitcoin.Util.isArray(A)) { var y = this.parseSig(A);w = y.r;t = y.s; } else { if ("object" === (typeof A === "undefined" ? "undefined" : _typeof(A)) && A.r && A.s) { w = A.r;t = A.s; } else { throw "Invalid value for signature"; } }var v;if (u instanceof ECPointFp) { v = u; } else { if (Bitcoin.Util.isArray(u)) { v = h.decodeFrom(this.ecparams.curve, u); } else { throw "Invalid format for pubkey value, must be byte array or ECPointFp"; } }var x = f.fromByteArrayUnsigned(z);return this.verifyRaw(x, w, t, v); };this.verifyRaw = function (z, t, E, y) { var x = this.ecparams.n;var D = this.ecparams.G;if (t.compareTo(f.ONE) < 0 || t.compareTo(x) >= 0) { return false; }if (E.compareTo(f.ONE) < 0 || E.compareTo(x) >= 0) { return false; }var A = E.modInverse(x);var w = z.multiply(A).mod(x);var u = t.multiply(A).mod(x);var B = D.multiply(w).add(y.multiply(u));var C = B.getX().toBigInteger().mod(x);return C.equals(t); };this.serializeSig = function (v, u) { var w = v.toByteArraySigned();var t = u.toByteArraySigned();var x = [];x.push(2);x.push(w.length);x = x.concat(w);x.push(2);x.push(t.length);x = x.concat(t);x.unshift(x.length);x.unshift(48);return x; };this.parseSig = function (y) { var x;if (y[0] != 48) { throw new Error("Signature not a valid DERSequence"); }x = 2;if (y[x] != 2) { throw new Error("First element in signature must be a DERInteger"); }var w = y.slice(x + 2, x + 2 + y[x + 1]);x += 2 + y[x + 1];if (y[x] != 2) { throw new Error("Second element in signature must be a DERInteger"); }var t = y.slice(x + 2, x + 2 + y[x + 1]);x += 2 + y[x + 1];var v = f.fromByteArrayUnsigned(w);var u = f.fromByteArrayUnsigned(t);return { r: v, s: u }; };this.parseSigCompact = function (w) { if (w.length !== 65) { throw "Signature has the wrong length"; }var t = w[0] - 27;if (t < 0 || t > 7) { throw "Invalid signature type"; }var x = this.ecparams.n;var v = f.fromByteArrayUnsigned(w.slice(1, 33)).mod(x);var u = f.fromByteArrayUnsigned(w.slice(33, 65)).mod(x);return { r: v, s: u, i: t }; };this.readPKCS5PrvKeyHex = function (u) { if (k(u) === false) { throw new Error("not ASN.1 hex string"); }var r, t, v;try { r = n(u, 0, ["[0]", 0], "06");t = n(u, 0, [1], "04");try { v = n(u, 0, ["[1]", 0], "03"); } catch (s) {} } catch (s) { throw new Error("malformed PKCS#1/5 plain ECC private key"); }this.curveName = d(r);if (this.curveName === undefined) { throw "unsupported curve name"; }this.setNamedCurve(this.curveName);this.setPublicKeyHex(v);this.setPrivateKeyHex(t);this.isPublic = false; };this.readPKCS8PrvKeyHex = function (v) { if (k(v) === false) { throw new j("not ASN.1 hex string"); }var t, r, u, w;try { t = n(v, 0, [1, 0], "06");r = n(v, 0, [1, 1], "06");u = n(v, 0, [2, 0, 1], "04");try { w = n(v, 0, [2, 0, "[1]", 0], "03"); } catch (s) {} } catch (s) { throw new j("malformed PKCS#8 plain ECC private key"); }this.curveName = d(r);if (this.curveName === undefined) { throw new j("unsupported curve name"); }this.setNamedCurve(this.curveName);this.setPublicKeyHex(w);this.setPrivateKeyHex(u);this.isPublic = false; };this.readPKCS8PubKeyHex = function (u) { if (k(u) === false) { throw new j("not ASN.1 hex string"); }var t, r, v;try { t = n(u, 0, [0, 0], "06");r = n(u, 0, [0, 1], "06");v = n(u, 0, [1], "03"); } catch (s) { throw new j("malformed PKCS#8 ECC public key"); }this.curveName = d(r);if (this.curveName === null) { throw new j("unsupported curve name"); }this.setNamedCurve(this.curveName);this.setPublicKeyHex(v); };this.readCertPubKeyHex = function (t, v) { if (k(t) === false) { throw new j("not ASN.1 hex string"); }var r, u;try { r = n(t, 0, [0, 5, 0, 1], "06");u = n(t, 0, [0, 5, 1], "03"); } catch (s) { throw new j("malformed X.509 certificate ECC public key"); }this.curveName = d(r);if (this.curveName === null) { throw new j("unsupported curve name"); }this.setNamedCurve(this.curveName);this.setPublicKeyHex(u); };if (e !== undefined) { if (e.curve !== undefined) { this.curveName = e.curve; } }if (this.curveName === undefined) { this.curveName = g; }this.setNamedCurve(this.curveName);if (e !== undefined) { if (e.prv !== undefined) { this.setPrivateKeyHex(e.prv); }if (e.pub !== undefined) { this.setPublicKeyHex(e.pub); } } };KJUR.crypto.ECDSA.parseSigHex = function (a) { var b = KJUR.crypto.ECDSA.parseSigHexInHexRS(a);var d = new BigInteger(b.r, 16);var c = new BigInteger(b.s, 16);return { r: d, s: c }; };KJUR.crypto.ECDSA.parseSigHexInHexRS = function (f) { var j = ASN1HEX, i = j.getChildIdx, g = j.getV;j.checkStrictDER(f, 0);if (f.substr(0, 2) != "30") { throw new Error("signature is not a ASN.1 sequence"); }var h = i(f, 0);if (h.length != 2) { throw new Error("signature shall have two elements"); }var e = h[0];var d = h[1];if (f.substr(e, 2) != "02") { throw new Error("1st item not ASN.1 integer"); }if (f.substr(d, 2) != "02") { throw new Error("2nd item not ASN.1 integer"); }var c = g(f, e);var b = g(f, d);return { r: c, s: b }; };KJUR.crypto.ECDSA.asn1SigToConcatSig = function (c) { var d = KJUR.crypto.ECDSA.parseSigHexInHexRS(c);var b = d.r;var a = d.s;if (b.substr(0, 2) == "00" && b.length % 32 == 2) { b = b.substr(2); }if (a.substr(0, 2) == "00" && a.length % 32 == 2) { a = a.substr(2); }if (b.length % 32 == 30) { b = "00" + b; }if (a.length % 32 == 30) { a = "00" + a; }if (b.length % 32 != 0) { throw "unknown ECDSA sig r length error"; }if (a.length % 32 != 0) { throw "unknown ECDSA sig s length error"; }return b + a; };KJUR.crypto.ECDSA.concatSigToASN1Sig = function (a) { if (a.length / 2 * 8 % (16 * 8) != 0) { throw "unknown ECDSA concatinated r-s sig length error"; }var c = a.substr(0, a.length / 2);var b = a.substr(a.length / 2);return KJUR.crypto.ECDSA.hexRSSigToASN1Sig(c, b); };KJUR.crypto.ECDSA.hexRSSigToASN1Sig = function (b, a) { var d = new BigInteger(b, 16);var c = new BigInteger(a, 16);return KJUR.crypto.ECDSA.biRSSigToASN1Sig(d, c); };KJUR.crypto.ECDSA.biRSSigToASN1Sig = function (f, d) { var c = KJUR.asn1;var b = new c.DERInteger({ bigint: f });var a = new c.DERInteger({ bigint: d });var e = new c.DERSequence({ array: [b, a] });return e.getEncodedHex(); };KJUR.crypto.ECDSA.getName = function (a) { if (a === "2b8104001f") { return "secp192k1"; }if (a === "2a8648ce3d030107") { return "secp256r1"; }if (a === "2b8104000a") { return "secp256k1"; }if (a === "2b81040021") { return "secp224r1"; }if (a === "2b81040022") { return "secp384r1"; }if ("|secp256r1|NIST P-256|P-256|prime256v1|".indexOf(a) !== -1) { return "secp256r1"; }if ("|secp256k1|".indexOf(a) !== -1) { return "secp256k1"; }if ("|secp224r1|NIST P-224|P-224|".indexOf(a) !== -1) { return "secp224r1"; }if ("|secp384r1|NIST P-384|P-384|".indexOf(a) !== -1) { return "secp384r1"; }return null; }; if (typeof KJUR == "undefined" || !KJUR) { exports.KJUR = KJUR = {}; }if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) { KJUR.crypto = {}; }KJUR.crypto.ECParameterDB = new function () { var b = {};var c = {};function a(d) { return new BigInteger(d, 16); }this.getByName = function (e) { var d = e;if (typeof c[d] != "undefined") { d = c[e]; }if (typeof b[d] != "undefined") { return b[d]; }throw "unregistered EC curve name: " + d; };this.regist = function (A, l, o, g, m, e, j, f, k, u, d, x) { b[A] = {};var s = a(o);var z = a(g);var y = a(m);var t = a(e);var w = a(j);var r = new ECCurveFp(s, z, y);var q = r.decodePointHex("04" + f + k);b[A]["name"] = A;b[A]["keylen"] = l;b[A]["curve"] = r;b[A]["G"] = q;b[A]["n"] = t;b[A]["h"] = w;b[A]["oid"] = d;b[A]["info"] = x;for (var v = 0; v < u.length; v++) { c[u[v]] = A; } }; }();KJUR.crypto.ECParameterDB.regist("secp128r1", 128, "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC", "E87579C11079F43DD824993C2CEE5ED3", "FFFFFFFE0000000075A30D1B9038A115", "1", "161FF7528B899B2D0C28607CA52C5B86", "CF5AC8395BAFEB13C02DA292DDED7A83", [], "", "secp128r1 : SECG curve over a 128 bit prime field");KJUR.crypto.ECParameterDB.regist("secp160k1", 160, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73", "0", "7", "0100000000000000000001B8FA16DFAB9ACA16B6B3", "1", "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB", "938CF935318FDCED6BC28286531733C3F03C4FEE", [], "", "secp160k1 : SECG curve over a 160 bit prime field");KJUR.crypto.ECParameterDB.regist("secp160r1", 160, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC", "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45", "0100000000000000000001F4C8F927AED3CA752257", "1", "4A96B5688EF573284664698968C38BB913CBFC82", "23A628553168947D59DCC912042351377AC5FB32", [], "", "secp160r1 : SECG curve over a 160 bit prime field");KJUR.crypto.ECParameterDB.regist("secp192k1", 192, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37", "0", "3", "FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D", "1", "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D", "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D", []);KJUR.crypto.ECParameterDB.regist("secp192r1", 192, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1", "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831", "1", "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012", "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811", []);KJUR.crypto.ECParameterDB.regist("secp224r1", 224, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE", "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4", "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D", "1", "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21", "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34", []);KJUR.crypto.ECParameterDB.regist("secp256k1", 256, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", "0", "7", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", "1", "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", []);KJUR.crypto.ECParameterDB.regist("secp256r1", 256, "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", "1", "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", ["NIST P-256", "P-256", "prime256v1"]);KJUR.crypto.ECParameterDB.regist("secp384r1", 384, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC", "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973", "1", "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7", "3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f", ["NIST P-384", "P-384"]);KJUR.crypto.ECParameterDB.regist("secp521r1", 521, "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC", "051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00", "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409", "1", "C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66", "011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650", ["NIST P-521", "P-521"]); var KEYUTIL = function () { var d = function d(p, r, q) { return k(CryptoJS.AES, p, r, q); };var e = function e(p, r, q) { return k(CryptoJS.TripleDES, p, r, q); };var a = function a(p, r, q) { return k(CryptoJS.DES, p, r, q); };var k = function k(s, x, u, q) { var r = CryptoJS.enc.Hex.parse(x);var w = CryptoJS.enc.Hex.parse(u);var p = CryptoJS.enc.Hex.parse(q);var t = {};t.key = w;t.iv = p;t.ciphertext = r;var v = s.decrypt(t, w, { iv: p });return CryptoJS.enc.Hex.stringify(v); };var l = function l(p, r, q) { return g(CryptoJS.AES, p, r, q); };var o = function o(p, r, q) { return g(CryptoJS.TripleDES, p, r, q); };var f = function f(p, r, q) { return g(CryptoJS.DES, p, r, q); };var g = function g(t, y, v, q) { var s = CryptoJS.enc.Hex.parse(y);var x = CryptoJS.enc.Hex.parse(v);var p = CryptoJS.enc.Hex.parse(q);var w = t.encrypt(s, x, { iv: p });var r = CryptoJS.enc.Hex.parse(w.toString());var u = CryptoJS.enc.Base64.stringify(r);return u; };var i = { "AES-256-CBC": { proc: d, eproc: l, keylen: 32, ivlen: 16 }, "AES-192-CBC": { proc: d, eproc: l, keylen: 24, ivlen: 16 }, "AES-128-CBC": { proc: d, eproc: l, keylen: 16, ivlen: 16 }, "DES-EDE3-CBC": { proc: e, eproc: o, keylen: 24, ivlen: 8 }, "DES-CBC": { proc: a, eproc: f, keylen: 8, ivlen: 8 } };var c = function c(p) { return i[p]["proc"]; };var m = function m(p) { var r = CryptoJS.lib.WordArray.random(p);var q = CryptoJS.enc.Hex.stringify(r);return q; };var n = function n(v) { var w = {};var q = v.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)", "m"));if (q) { w.cipher = q[1];w.ivsalt = q[2]; }var p = v.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"));if (p) { w.type = p[1]; }var u = -1;var x = 0;if (v.indexOf("\r\n\r\n") != -1) { u = v.indexOf("\r\n\r\n");x = 2; }if (v.indexOf("\n\n") != -1) { u = v.indexOf("\n\n");x = 1; }var t = v.indexOf("-----END");if (u != -1 && t != -1) { var r = v.substring(u + x * 2, t - x);r = r.replace(/\s+/g, "");w.data = r; }return w; };var j = function j(q, y, p) { var v = p.substring(0, 16);var t = CryptoJS.enc.Hex.parse(v);var r = CryptoJS.enc.Utf8.parse(y);var u = i[q]["keylen"] + i[q]["ivlen"];var x = "";var w = null;for (;;) { var s = CryptoJS.algo.MD5.create();if (w != null) { s.update(w); }s.update(r);s.update(t);w = s.finalize();x = x + CryptoJS.enc.Hex.stringify(w);if (x.length >= u * 2) { break; } }var z = {};z.keyhex = x.substr(0, i[q]["keylen"] * 2);z.ivhex = x.substr(i[q]["keylen"] * 2, i[q]["ivlen"] * 2);return z; };var b = function b(p, v, r, w) { var s = CryptoJS.enc.Base64.parse(p);var q = CryptoJS.enc.Hex.stringify(s);var u = i[v]["proc"];var t = u(q, r, w);return t; };var h = function h(p, s, q, u) { var r = i[s]["eproc"];var t = r(p, q, u);return t; };return { version: "1.0.0", parsePKCS5PEM: function parsePKCS5PEM(p) { return n(p); }, getKeyAndUnusedIvByPasscodeAndIvsalt: function getKeyAndUnusedIvByPasscodeAndIvsalt(q, p, r) { return j(q, p, r); }, decryptKeyB64: function decryptKeyB64(p, r, q, s) { return b(p, r, q, s); }, getDecryptedKeyHex: function getDecryptedKeyHex(y, x) { var q = n(y);var t = q.type;var r = q.cipher;var p = q.ivsalt;var s = q.data;var w = j(r, x, p);var v = w.keyhex;var u = b(s, r, v, p);return u; }, getEncryptedPKCS5PEMFromPrvKeyHex: function getEncryptedPKCS5PEMFromPrvKeyHex(x, s, A, t, r) { var p = "";if (typeof t == "undefined" || t == null) { t = "AES-256-CBC"; }if (typeof i[t] == "undefined") { throw "KEYUTIL unsupported algorithm: " + t; }if (typeof r == "undefined" || r == null) { var v = i[t]["ivlen"];var u = m(v);r = u.toUpperCase(); }var z = j(t, A, r);var y = z.keyhex;var w = h(s, t, y, r);var q = w.replace(/(.{64})/g, "$1\r\n");var p = "-----BEGIN " + x + " PRIVATE KEY-----\r\n";p += "Proc-Type: 4,ENCRYPTED\r\n";p += "DEK-Info: " + t + "," + r + "\r\n";p += "\r\n";p += q;p += "\r\n-----END " + x + " PRIVATE KEY-----\r\n";return p; }, parseHexOfEncryptedPKCS8: function parseHexOfEncryptedPKCS8(y) { var B = ASN1HEX;var z = B.getChildIdx;var w = B.getV;var t = {};var r = z(y, 0);if (r.length != 2) { throw "malformed format: SEQUENCE(0).items != 2: " + r.length; }t.ciphertext = w(y, r[1]);var A = z(y, r[0]);if (A.length != 2) { throw "malformed format: SEQUENCE(0.0).items != 2: " + A.length; }if (w(y, A[0]) != "2a864886f70d01050d") { throw "this only supports pkcs5PBES2"; }var p = z(y, A[1]);if (A.length != 2) { throw "malformed format: SEQUENCE(0.0.1).items != 2: " + p.length; }var q = z(y, p[1]);if (q.length != 2) { throw "malformed format: SEQUENCE(0.0.1.1).items != 2: " + q.length; }if (w(y, q[0]) != "2a864886f70d0307") { throw "this only supports TripleDES"; }t.encryptionSchemeAlg = "TripleDES";t.encryptionSchemeIV = w(y, q[1]);var s = z(y, p[0]);if (s.length != 2) { throw "malformed format: SEQUENCE(0.0.1.0).items != 2: " + s.length; }if (w(y, s[0]) != "2a864886f70d01050c") { throw "this only supports pkcs5PBKDF2"; }var x = z(y, s[1]);if (x.length < 2) { throw "malformed format: SEQUENCE(0.0.1.0.1).items < 2: " + x.length; }t.pbkdf2Salt = w(y, x[0]);var u = w(y, x[1]);try { t.pbkdf2Iter = parseInt(u, 16); } catch (v) { throw "malformed format pbkdf2Iter: " + u; }return t; }, getPBKDF2KeyHexFromParam: function getPBKDF2KeyHexFromParam(u, p) { var t = CryptoJS.enc.Hex.parse(u.pbkdf2Salt);var q = u.pbkdf2Iter;var s = CryptoJS.PBKDF2(p, t, { keySize: 192 / 32, iterations: q });var r = CryptoJS.enc.Hex.stringify(s);return r; }, _getPlainPKCS8HexFromEncryptedPKCS8PEM: function _getPlainPKCS8HexFromEncryptedPKCS8PEM(x, y) { var r = pemtohex(x, "ENCRYPTED PRIVATE KEY");var p = this.parseHexOfEncryptedPKCS8(r);var u = KEYUTIL.getPBKDF2KeyHexFromParam(p, y);var v = {};v.ciphertext = CryptoJS.enc.Hex.parse(p.ciphertext);var t = CryptoJS.enc.Hex.parse(u);var s = CryptoJS.enc.Hex.parse(p.encryptionSchemeIV);var w = CryptoJS.TripleDES.decrypt(v, t, { iv: s });var q = CryptoJS.enc.Hex.stringify(w);return q; }, getKeyFromEncryptedPKCS8PEM: function getKeyFromEncryptedPKCS8PEM(s, q) { var p = this._getPlainPKCS8HexFromEncryptedPKCS8PEM(s, q);var r = this.getKeyFromPlainPrivatePKCS8Hex(p);return r; }, parsePlainPrivatePKCS8Hex: function parsePlainPrivatePKCS8Hex(s) { var v = ASN1HEX;var u = v.getChildIdx;var t = v.getV;var q = {};q.algparam = null;if (s.substr(0, 2) != "30") { throw "malformed plain PKCS8 private key(code:001)"; }var r = u(s, 0);if (r.length != 3) { throw "malformed plain PKCS8 private key(code:002)"; }if (s.substr(r[1], 2) != "30") { throw "malformed PKCS8 private key(code:003)"; }var p = u(s, r[1]);if (p.length != 2) { throw "malformed PKCS8 private key(code:004)"; }if (s.substr(p[0], 2) != "06") { throw "malformed PKCS8 private key(code:005)"; }q.algoid = t(s, p[0]);if (s.substr(p[1], 2) == "06") { q.algparam = t(s, p[1]); }if (s.substr(r[2], 2) != "04") { throw "malformed PKCS8 private key(code:006)"; }q.keyidx = v.getVidx(s, r[2]);return q; }, getKeyFromPlainPrivatePKCS8PEM: function getKeyFromPlainPrivatePKCS8PEM(q) { var p = pemtohex(q, "PRIVATE KEY");var r = this.getKeyFromPlainPrivatePKCS8Hex(p);return r; }, getKeyFromPlainPrivatePKCS8Hex: function getKeyFromPlainPrivatePKCS8Hex(p) { var q = this.parsePlainPrivatePKCS8Hex(p);var r;if (q.algoid == "2a864886f70d010101") { r = new RSAKey(); } else { if (q.algoid == "2a8648ce380401") { r = new KJUR.crypto.DSA(); } else { if (q.algoid == "2a8648ce3d0201") { r = new KJUR.crypto.ECDSA(); } else { throw "unsupported private key algorithm"; } } }r.readPKCS8PrvKeyHex(p);return r; }, _getKeyFromPublicPKCS8Hex: function _getKeyFromPublicPKCS8Hex(q) { var p;var r = ASN1HEX.getVbyList(q, 0, [0, 0], "06");if (r === "2a864886f70d010101") { p = new RSAKey(); } else { if (r === "2a8648ce380401") { p = new KJUR.crypto.DSA(); } else { if (r === "2a8648ce3d0201") { p = new KJUR.crypto.ECDSA(); } else { throw "unsupported PKCS#8 public key hex"; } } }p.readPKCS8PubKeyHex(q);return p; }, parsePublicRawRSAKeyHex: function parsePublicRawRSAKeyHex(r) { var u = ASN1HEX;var t = u.getChildIdx;var s = u.getV;var p = {};if (r.substr(0, 2) != "30") { throw "malformed RSA key(code:001)"; }var q = t(r, 0);if (q.length != 2) { throw "malformed RSA key(code:002)"; }if (r.substr(q[0], 2) != "02") { throw "malformed RSA key(code:003)"; }p.n = s(r, q[0]);if (r.substr(q[1], 2) != "02") { throw "malformed RSA key(code:004)"; }p.e = s(r, q[1]);return p; }, parsePublicPKCS8Hex: function parsePublicPKCS8Hex(t) { var v = ASN1HEX;var u = v.getChildIdx;var s = v.getV;var q = {};q.algparam = null;var r = u(t, 0);if (r.length != 2) { throw "outer DERSequence shall have 2 elements: " + r.length; }var w = r[0];if (t.substr(w, 2) != "30") { throw "malformed PKCS8 public key(code:001)"; }var p = u(t, w);if (p.length != 2) { throw "malformed PKCS8 public key(code:002)"; }if (t.substr(p[0], 2) != "06") { throw "malformed PKCS8 public key(code:003)"; }q.algoid = s(t, p[0]);if (t.substr(p[1], 2) == "06") { q.algparam = s(t, p[1]); } else { if (t.substr(p[1], 2) == "30") { q.algparam = {};q.algparam.p = v.getVbyList(t, p[1], [0], "02");q.algparam.q = v.getVbyList(t, p[1], [1], "02");q.algparam.g = v.getVbyList(t, p[1], [2], "02"); } }if (t.substr(r[1], 2) != "03") { throw "malformed PKCS8 public key(code:004)"; }q.key = s(t, r[1]).substr(2);return q; } }; }();KEYUTIL.getKey = function (l, k, n) { var G = ASN1HEX, L = G.getChildIdx, v = G.getV, d = G.getVbyList, c = KJUR.crypto, i = c.ECDSA, C = c.DSA, w = RSAKey, M = pemtohex, F = KEYUTIL;if (typeof w != "undefined" && l instanceof w) { return l; }if (typeof i != "undefined" && l instanceof i) { return l; }if (typeof C != "undefined" && l instanceof C) { return l; }if (l.curve !== undefined && l.xy !== undefined && l.d === undefined) { return new i({ pub: l.xy, curve: l.curve }); }if (l.curve !== undefined && l.d !== undefined) { return new i({ prv: l.d, curve: l.curve }); }if (l.kty === undefined && l.n !== undefined && l.e !== undefined && l.d === undefined) { var P = new w();P.setPublic(l.n, l.e);return P; }if (l.kty === undefined && l.n !== undefined && l.e !== undefined && l.d !== undefined && l.p !== undefined && l.q !== undefined && l.dp !== undefined && l.dq !== undefined && l.co !== undefined && l.qi === undefined) { var P = new w();P.setPrivateEx(l.n, l.e, l.d, l.p, l.q, l.dp, l.dq, l.co);return P; }if (l.kty === undefined && l.n !== undefined && l.e !== undefined && l.d !== undefined && l.p === undefined) { var P = new w();P.setPrivate(l.n, l.e, l.d);return P; }if (l.p !== undefined && l.q !== undefined && l.g !== undefined && l.y !== undefined && l.x === undefined) { var P = new C();P.setPublic(l.p, l.q, l.g, l.y);return P; }if (l.p !== undefined && l.q !== undefined && l.g !== undefined && l.y !== undefined && l.x !== undefined) { var P = new C();P.setPrivate(l.p, l.q, l.g, l.y, l.x);return P; }if (l.kty === "RSA" && l.n !== undefined && l.e !== undefined && l.d === undefined) { var P = new w();P.setPublic(b64utohex(l.n), b64utohex(l.e));return P; }if (l.kty === "RSA" && l.n !== undefined && l.e !== undefined && l.d !== undefined && l.p !== undefined && l.q !== undefined && l.dp !== undefined && l.dq !== undefined && l.qi !== undefined) { var P = new w();P.setPrivateEx(b64utohex(l.n), b64utohex(l.e), b64utohex(l.d), b64utohex(l.p), b64utohex(l.q), b64utohex(l.dp), b64utohex(l.dq), b64utohex(l.qi));return P; }if (l.kty === "RSA" && l.n !== undefined && l.e !== undefined && l.d !== undefined) { var P = new w();P.setPrivate(b64utohex(l.n), b64utohex(l.e), b64utohex(l.d));return P; }if (l.kty === "EC" && l.crv !== undefined && l.x !== undefined && l.y !== undefined && l.d === undefined) { var j = new i({ curve: l.crv });var t = j.ecparams.keylen / 4;var B = ("0000000000" + b64utohex(l.x)).slice(-t);var z = ("0000000000" + b64utohex(l.y)).slice(-t);var u = "04" + B + z;j.setPublicKeyHex(u);return j; }if (l.kty === "EC" && l.crv !== undefined && l.x !== undefined && l.y !== undefined && l.d !== undefined) { var j = new i({ curve: l.crv });var t = j.ecparams.keylen / 4;var B = ("0000000000" + b64utohex(l.x)).slice(-t);var z = ("0000000000" + b64utohex(l.y)).slice(-t);var u = "04" + B + z;var b = ("0000000000" + b64utohex(l.d)).slice(-t);j.setPublicKeyHex(u);j.setPrivateKeyHex(b);return j; }if (n === "pkcs5prv") { var J = l, G = ASN1HEX, N, P;N = L(J, 0);if (N.length === 9) { P = new w();P.readPKCS5PrvKeyHex(J); } else { if (N.length === 6) { P = new C();P.readPKCS5PrvKeyHex(J); } else { if (N.length > 2 && J.substr(N[1], 2) === "04") { P = new i();P.readPKCS5PrvKeyHex(J); } else { throw "unsupported PKCS#1/5 hexadecimal key"; } } }return P; }if (n === "pkcs8prv") { var P = F.getKeyFromPlainPrivatePKCS8Hex(l);return P; }if (n === "pkcs8pub") { return F._getKeyFromPublicPKCS8Hex(l); }if (n === "x509pub") { return X509.getPublicKeyFromCertHex(l); }if (l.indexOf("-END CERTIFICATE-", 0) != -1 || l.indexOf("-END X509 CERTIFICATE-", 0) != -1 || l.indexOf("-END TRUSTED CERTIFICATE-", 0) != -1) { return X509.getPublicKeyFromCertPEM(l); }if (l.indexOf("-END PUBLIC KEY-") != -1) { var O = pemtohex(l, "PUBLIC KEY");return F._getKeyFromPublicPKCS8Hex(O); }if (l.indexOf("-END RSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") == -1) { var m = M(l, "RSA PRIVATE KEY");return F.getKey(m, null, "pkcs5prv"); }if (l.indexOf("-END DSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") == -1) { var I = M(l, "DSA PRIVATE KEY");var E = d(I, 0, [1], "02");var D = d(I, 0, [2], "02");var K = d(I, 0, [3], "02");var r = d(I, 0, [4], "02");var s = d(I, 0, [5], "02");var P = new C();P.setPrivate(new BigInteger(E, 16), new BigInteger(D, 16), new BigInteger(K, 16), new BigInteger(r, 16), new BigInteger(s, 16));return P; }if (l.indexOf("-END EC PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") == -1) { var m = M(l, "EC PRIVATE KEY");return F.getKey(m, null, "pkcs5prv"); }if (l.indexOf("-END PRIVATE KEY-") != -1) { return F.getKeyFromPlainPrivatePKCS8PEM(l); }if (l.indexOf("-END RSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") != -1) { var o = F.getDecryptedKeyHex(l, k);var H = new RSAKey();H.readPKCS5PrvKeyHex(o);return H; }if (l.indexOf("-END EC PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") != -1) { var I = F.getDecryptedKeyHex(l, k);var P = d(I, 0, [1], "04");var f = d(I, 0, [2, 0], "06");var A = d(I, 0, [3, 0], "03").substr(2);var e = "";if (KJUR.crypto.OID.oidhex2name[f] !== undefined) { e = KJUR.crypto.OID.oidhex2name[f]; } else { throw "undefined OID(hex) in KJUR.crypto.OID: " + f; }var j = new i({ curve: e });j.setPublicKeyHex(A);j.setPrivateKeyHex(P);j.isPublic = false;return j; }if (l.indexOf("-END DSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") != -1) { var I = F.getDecryptedKeyHex(l, k);var E = d(I, 0, [1], "02");var D = d(I, 0, [2], "02");var K = d(I, 0, [3], "02");var r = d(I, 0, [4], "02");var s = d(I, 0, [5], "02");var P = new C();P.setPrivate(new BigInteger(E, 16), new BigInteger(D, 16), new BigInteger(K, 16), new BigInteger(r, 16), new BigInteger(s, 16));return P; }if (l.indexOf("-END ENCRYPTED PRIVATE KEY-") != -1) { return F.getKeyFromEncryptedPKCS8PEM(l, k); }throw new Error("not supported argument"); };KEYUTIL.generateKeypair = function (a, c) { if (a == "RSA") { var b = c;var h = new RSAKey();h.generate(b, "10001");h.isPrivate = true;h.isPublic = true;var f = new RSAKey();var e = h.n.toString(16);var i = h.e.toString(16);f.setPublic(e, i);f.isPrivate = false;f.isPublic = true;var k = {};k.prvKeyObj = h;k.pubKeyObj = f;return k; } else { if (a == "EC") { var d = c;var g = new KJUR.crypto.ECDSA({ curve: d });var j = g.generateKeyPairHex();var h = new KJUR.crypto.ECDSA({ curve: d });h.setPublicKeyHex(j.ecpubhex);h.setPrivateKeyHex(j.ecprvhex);h.isPrivate = true;h.isPublic = false;var f = new KJUR.crypto.ECDSA({ curve: d });f.setPublicKeyHex(j.ecpubhex);f.isPrivate = false;f.isPublic = true;var k = {};k.prvKeyObj = h;k.pubKeyObj = f;return k; } else { throw "unknown algorithm: " + a; } } };KEYUTIL.getPEM = function (b, D, y, m, q, j) { var F = KJUR, k = F.asn1, z = k.DERObjectIdentifier, f = k.DERInteger, l = k.ASN1Util.newObject, a = k.x509, C = a.SubjectPublicKeyInfo, e = F.crypto, u = e.DSA, r = e.ECDSA, n = RSAKey;function A(s) { var G = l({ seq: [{ "int": 0 }, { "int": { bigint: s.n } }, { "int": s.e }, { "int": { bigint: s.d } }, { "int": { bigint: s.p } }, { "int": { bigint: s.q } }, { "int": { bigint: s.dmp1 } }, { "int": { bigint: s.dmq1 } }, { "int": { bigint: s.coeff } }] });return G; }function B(G) { var s = l({ seq: [{ "int": 1 }, { octstr: { hex: G.prvKeyHex } }, { tag: ["a0", true, { oid: { name: G.curveName } }] }, { tag: ["a1", true, { bitstr: { hex: "00" + G.pubKeyHex } }] }] });return s; }function x(s) { var G = l({ seq: [{ "int": 0 }, { "int": { bigint: s.p } }, { "int": { bigint: s.q } }, { "int": { bigint: s.g } }, { "int": { bigint: s.y } }, { "int": { bigint: s.x } }] });return G; }if ((n !== undefined && b instanceof n || u !== undefined && b instanceof u || r !== undefined && b instanceof r) && b.isPublic == true && (D === undefined || D == "PKCS8PUB")) { var E = new C(b);var w = E.getEncodedHex();return hextopem(w, "PUBLIC KEY"); }if (D == "PKCS1PRV" && n !== undefined && b instanceof n && (y === undefined || y == null) && b.isPrivate == true) { var E = A(b);var w = E.getEncodedHex();return hextopem(w, "RSA PRIVATE KEY"); }if (D == "PKCS1PRV" && r !== undefined && b instanceof r && (y === undefined || y == null) && b.isPrivate == true) { var i = new z({ name: b.curveName });var v = i.getEncodedHex();var h = B(b);var t = h.getEncodedHex();var p = "";p += hextopem(v, "EC PARAMETERS");p += hextopem(t, "EC PRIVATE KEY");return p; }if (D == "PKCS1PRV" && u !== undefined && b instanceof u && (y === undefined || y == null) && b.isPrivate == true) { var E = x(b);var w = E.getEncodedHex();return hextopem(w, "DSA PRIVATE KEY"); }if (D == "PKCS5PRV" && n !== undefined && b instanceof n && y !== undefined && y != null && b.isPrivate == true) { var E = A(b);var w = E.getEncodedHex();if (m === undefined) { m = "DES-EDE3-CBC"; }return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA", w, y, m, j); }if (D == "PKCS5PRV" && r !== undefined && b instanceof r && y !== undefined && y != null && b.isPrivate == true) { var E = B(b);var w = E.getEncodedHex();if (m === undefined) { m = "DES-EDE3-CBC"; }return this.getEncryptedPKCS5PEMFromPrvKeyHex("EC", w, y, m, j); }if (D == "PKCS5PRV" && u !== undefined && b instanceof u && y !== undefined && y != null && b.isPrivate == true) { var E = x(b);var w = E.getEncodedHex();if (m === undefined) { m = "DES-EDE3-CBC"; }return this.getEncryptedPKCS5PEMFromPrvKeyHex("DSA", w, y, m, j); }var o = function o(G, s) { var I = c(G, s);var H = new l({ seq: [{ seq: [{ oid: { name: "pkcs5PBES2" } }, { seq: [{ seq: [{ oid: { name: "pkcs5PBKDF2" } }, { seq: [{ octstr: { hex: I.pbkdf2Salt } }, { "int": I.pbkdf2Iter }] }] }, { seq: [{ oid: { name: "des-EDE3-CBC" } }, { octstr: { hex: I.encryptionSchemeIV } }] }] }] }, { octstr: { hex: I.ciphertext } }] });return H.getEncodedHex(); };var c = function c(N, O) { var H = 100;var M = CryptoJS.lib.WordArray.random(8);var L = "DES-EDE3-CBC";var s = CryptoJS.lib.WordArray.random(8);var I = CryptoJS.PBKDF2(O, M, { keySize: 192 / 32, iterations: H });var J = CryptoJS.enc.Hex.parse(N);var K = CryptoJS.TripleDES.encrypt(J, I, { iv: s }) + "";var G = {};G.ciphertext = K;G.pbkdf2Salt = CryptoJS.enc.Hex.stringify(M);G.pbkdf2Iter = H;G.encryptionSchemeAlg = L;G.encryptionSchemeIV = CryptoJS.enc.Hex.stringify(s);return G; };if (D == "PKCS8PRV" && n != undefined && b instanceof n && b.isPrivate == true) { var g = A(b);var d = g.getEncodedHex();var E = l({ seq: [{ "int": 0 }, { seq: [{ oid: { name: "rsaEncryption" } }, { "null": true }] }, { octstr: { hex: d } }] });var w = E.getEncodedHex();if (y === undefined || y == null) { return hextopem(w, "PRIVATE KEY"); } else { var t = o(w, y);return hextopem(t, "ENCRYPTED PRIVATE KEY"); } }if (D == "PKCS8PRV" && r !== undefined && b instanceof r && b.isPrivate == true) { var g = new l({ seq: [{ "int": 1 }, { octstr: { hex: b.prvKeyHex } }, { tag: ["a1", true, { bitstr: { hex: "00" + b.pubKeyHex } }] }] });var d = g.getEncodedHex();var E = l({ seq: [{ "int": 0 }, { seq: [{ oid: { name: "ecPublicKey" } }, { oid: { name: b.curveName } }] }, { octstr: { hex: d } }] });var w = E.getEncodedHex();if (y === undefined || y == null) { return hextopem(w, "PRIVATE KEY"); } else { var t = o(w, y);return hextopem(t, "ENCRYPTED PRIVATE KEY"); } }if (D == "PKCS8PRV" && u !== undefined && b instanceof u && b.isPrivate == true) { var g = new f({ bigint: b.x });var d = g.getEncodedHex();var E = l({ seq: [{ "int": 0 }, { seq: [{ oid: { name: "dsa" } }, { seq: [{ "int": { bigint: b.p } }, { "int": { bigint: b.q } }, { "int": { bigint: b.g } }] }] }, { octstr: { hex: d } }] });var w = E.getEncodedHex();if (y === undefined || y == null) { return hextopem(w, "PRIVATE KEY"); } else { var t = o(w, y);return hextopem(t, "ENCRYPTED PRIVATE KEY"); } }throw new Error("unsupported object nor format"); };KEYUTIL.getKeyFromCSRPEM = function (b) { var a = pemtohex(b, "CERTIFICATE REQUEST");var c = KEYUTIL.getKeyFromCSRHex(a);return c; };KEYUTIL.getKeyFromCSRHex = function (a) { var c = KEYUTIL.parseCSRHex(a);var b = KEYUTIL.getKey(c.p8pubkeyhex, null, "pkcs8pub");return b; };KEYUTIL.parseCSRHex = function (d) { var i = ASN1HEX;var f = i.getChildIdx;var c = i.getTLV;var b = {};var g = d;if (g.substr(0, 2) != "30") { throw "malformed CSR(code:001)"; }var e = f(g, 0);if (e.length < 1) { throw "malformed CSR(code:002)"; }if (g.substr(e[0], 2) != "30") { throw "malformed CSR(code:003)"; }var a = f(g, e[0]);if (a.length < 3) { throw "malformed CSR(code:004)"; }b.p8pubkeyhex = c(g, a[2]);return b; };KEYUTIL.getKeyID = function (f) { var c = KEYUTIL;var e = ASN1HEX;if (typeof f === "string" && f.indexOf("BEGIN ") != -1) { f = c.getKey(f); }var d = pemtohex(c.getPEM(f));var b = e.getIdxbyList(d, 0, [1]);var a = e.getV(d, b).substring(2);return KJUR.crypto.Util.hashHex(a, "sha1"); };KEYUTIL.getJWKFromKey = function (d) { var b = {};if (d instanceof RSAKey && d.isPrivate) { b.kty = "RSA";b.n = hextob64u(d.n.toString(16));b.e = hextob64u(d.e.toString(16));b.d = hextob64u(d.d.toString(16));b.p = hextob64u(d.p.toString(16));b.q = hextob64u(d.q.toString(16));b.dp = hextob64u(d.dmp1.toString(16));b.dq = hextob64u(d.dmq1.toString(16));b.qi = hextob64u(d.coeff.toString(16));return b; } else { if (d instanceof RSAKey && d.isPublic) { b.kty = "RSA";b.n = hextob64u(d.n.toString(16));b.e = hextob64u(d.e.toString(16));return b; } else { if (d instanceof KJUR.crypto.ECDSA && d.isPrivate) { var a = d.getShortNISTPCurveName();if (a !== "P-256" && a !== "P-384") { throw "unsupported curve name for JWT: " + a; }var c = d.getPublicKeyXYHex();b.kty = "EC";b.crv = a;b.x = hextob64u(c.x);b.y = hextob64u(c.y);b.d = hextob64u(d.prvKeyHex);return b; } else { if (d instanceof KJUR.crypto.ECDSA && d.isPublic) { var a = d.getShortNISTPCurveName();if (a !== "P-256" && a !== "P-384") { throw "unsupported curve name for JWT: " + a; }var c = d.getPublicKeyXYHex();b.kty = "EC";b.crv = a;b.x = hextob64u(c.x);b.y = hextob64u(c.y);return b; } } } }throw "not supported key object"; }; RSAKey.getPosArrayOfChildrenFromHex = function (a) { return ASN1HEX.getChildIdx(a, 0); };RSAKey.getHexValueArrayOfChildrenFromHex = function (f) { var n = ASN1HEX;var i = n.getV;var k = RSAKey.getPosArrayOfChildrenFromHex(f);var e = i(f, k[0]);var j = i(f, k[1]);var b = i(f, k[2]);var c = i(f, k[3]);var h = i(f, k[4]);var g = i(f, k[5]);var m = i(f, k[6]);var l = i(f, k[7]);var d = i(f, k[8]);var k = new Array();k.push(e, j, b, c, h, g, m, l, d);return k; };RSAKey.prototype.readPrivateKeyFromPEMString = function (d) { var c = pemtohex(d);var b = RSAKey.getHexValueArrayOfChildrenFromHex(c);this.setPrivateEx(b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8]); };RSAKey.prototype.readPKCS5PrvKeyHex = function (c) { var b = RSAKey.getHexValueArrayOfChildrenFromHex(c);this.setPrivateEx(b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8]); };RSAKey.prototype.readPKCS8PrvKeyHex = function (e) { var c, i, k, b, a, f, d, j;var m = ASN1HEX;var l = m.getVbyListEx;if (m.isASN1HEX(e) === false) { throw new Error("not ASN.1 hex string"); }try { c = l(e, 0, [2, 0, 1], "02");i = l(e, 0, [2, 0, 2], "02");k = l(e, 0, [2, 0, 3], "02");b = l(e, 0, [2, 0, 4], "02");a = l(e, 0, [2, 0, 5], "02");f = l(e, 0, [2, 0, 6], "02");d = l(e, 0, [2, 0, 7], "02");j = l(e, 0, [2, 0, 8], "02"); } catch (g) { throw new Error("malformed PKCS#8 plain RSA private key"); }this.setPrivateEx(c, i, k, b, a, f, d, j); };RSAKey.prototype.readPKCS5PubKeyHex = function (c) { var e = ASN1HEX;var b = e.getV;if (e.isASN1HEX(c) === false) { throw new Error("keyHex is not ASN.1 hex string"); }var a = e.getChildIdx(c, 0);if (a.length !== 2 || c.substr(a[0], 2) !== "02" || c.substr(a[1], 2) !== "02") { throw new Error("wrong hex for PKCS#5 public key"); }var f = b(c, a[0]);var d = b(c, a[1]);this.setPublic(f, d); };RSAKey.prototype.readPKCS8PubKeyHex = function (b) { var c = ASN1HEX;if (c.isASN1HEX(b) === false) { throw new Error("not ASN.1 hex string"); }if (c.getTLVbyListEx(b, 0, [0, 0]) !== "06092a864886f70d010101") { throw new Error("not PKCS8 RSA public key"); }var a = c.getTLVbyListEx(b, 0, [1, 0]);this.readPKCS5PubKeyHex(a); };RSAKey.prototype.readCertPubKeyHex = function (b, d) { var a, c;a = new X509();a.readCertHex(b);c = a.getPublicKeyHex();this.readPKCS8PubKeyHex(c); }; var _RE_HEXDECONLY = new RegExp("[^0-9a-f]", "gi");function _rsasign_getHexPaddedDigestInfoForString(d, e, a) { var b = function b(f) { return KJUR.crypto.Util.hashString(f, a); };var c = b(d);return KJUR.crypto.Util.getPaddedDigestInfoHex(c, a, e); }function _zeroPaddingOfSignature(e, d) { var c = "";var a = d / 4 - e.length;for (var b = 0; b < a; b++) { c = c + "0"; }return c + e; }RSAKey.prototype.sign = function (d, a) { var b = function b(e) { return KJUR.crypto.Util.hashString(e, a); };var c = b(d);return this.signWithMessageHash(c, a); };RSAKey.prototype.signWithMessageHash = function (e, c) { var f = KJUR.crypto.Util.getPaddedDigestInfoHex(e, c, this.n.bitLength());var b = parseBigInt(f, 16);var d = this.doPrivate(b);var a = d.toString(16);return _zeroPaddingOfSignature(a, this.n.bitLength()); };function pss_mgf1_str(c, a, e) { var b = "", d = 0;while (b.length < a) { b += hextorstr(e(rstrtohex(c + String.fromCharCode.apply(String, [(d & 4278190080) >> 24, (d & 16711680) >> 16, (d & 65280) >> 8, d & 255]))));d += 1; }return b; }RSAKey.prototype.signPSS = function (e, a, d) { var c = function c(f) { return KJUR.crypto.Util.hashHex(f, a); };var b = c(rstrtohex(e));if (d === undefined) { d = -1; }return this.signWithMessageHashPSS(b, a, d); };RSAKey.prototype.signWithMessageHashPSS = function (l, a, k) { var b = hextorstr(l);var g = b.length;var m = this.n.bitLength() - 1;var c = Math.ceil(m / 8);var d;var o = function o(i) { return KJUR.crypto.Util.hashHex(i, a); };if (k === -1 || k === undefined) { k = g; } else { if (k === -2) { k = c - g - 2; } else { if (k < -2) { throw new Error("invalid salt length"); } } }if (c < g + k + 2) { throw new Error("data too long"); }var f = "";if (k > 0) { f = new Array(k);new SecureRandom().nextBytes(f);f = String.fromCharCode.apply(String, f); }var n = hextorstr(o(rstrtohex("\x00\x00\x00\x00\x00\x00\x00\x00" + b + f)));var j = [];for (d = 0; d < c - k - g - 2; d += 1) { j[d] = 0; }var e = String.fromCharCode.apply(String, j) + "\x01" + f;var h = pss_mgf1_str(n, e.length, o);var q = [];for (d = 0; d < e.length; d += 1) { q[d] = e.charCodeAt(d) ^ h.charCodeAt(d); }var p = 65280 >> 8 * c - m & 255;q[0] &= ~p;for (d = 0; d < g; d++) { q.push(n.charCodeAt(d)); }q.push(188);return _zeroPaddingOfSignature(this.doPrivate(new BigInteger(q)).toString(16), this.n.bitLength()); };function _rsasign_getDecryptSignatureBI(a, d, c) { var b = new RSAKey();b.setPublic(d, c);var e = b.doPublic(a);return e; }function _rsasign_getHexDigestInfoFromSig(a, c, b) { var e = _rsasign_getDecryptSignatureBI(a, c, b);var d = e.toString(16).replace(/^1f+00/, "");return d; }function _rsasign_getAlgNameAndHashFromHexDisgestInfo(f) { for (var e in KJUR.crypto.Util.DIGESTINFOHEAD) { var d = KJUR.crypto.Util.DIGESTINFOHEAD[e];var b = d.length;if (f.substring(0, b) == d) { var c = [e, f.substring(b)];return c; } }return []; }RSAKey.prototype.verify = function (f, j) { j = j.replace(_RE_HEXDECONLY, "");j = j.replace(/[ \n]+/g, "");var b = parseBigInt(j, 16);if (b.bitLength() > this.n.bitLength()) { return 0; }var i = this.doPublic(b);var e = i.toString(16).replace(/^1f+00/, "");var g = _rsasign_getAlgNameAndHashFromHexDisgestInfo(e);if (g.length == 0) { return false; }var d = g[0];var h = g[1];var a = function a(k) { return KJUR.crypto.Util.hashString(k, d); };var c = a(f);return h == c; };RSAKey.prototype.verifyWithMessageHash = function (e, a) { if (a.length != Math.ceil(this.n.bitLength() / 4)) { return false; }var b = parseBigInt(a, 16);if (b.bitLength() > this.n.bitLength()) { return 0; }var h = this.doPublic(b);var g = h.toString(16).replace(/^1f+00/, "");var c = _rsasign_getAlgNameAndHashFromHexDisgestInfo(g);if (c.length == 0) { return false; }var d = c[0];var f = c[1];return f == e; };RSAKey.prototype.verifyPSS = function (c, b, a, f) { var e = function e(g) { return KJUR.crypto.Util.hashHex(g, a); };var d = e(rstrtohex(c));if (f === undefined) { f = -1; }return this.verifyWithMessageHashPSS(d, b, a, f); };RSAKey.prototype.verifyWithMessageHashPSS = function (f, s, l, c) { if (s.length != Math.ceil(this.n.bitLength() / 4)) { return false; }var k = new BigInteger(s, 16);var r = function r(i) { return KJUR.crypto.Util.hashHex(i, l); };var j = hextorstr(f);var h = j.length;var g = this.n.bitLength() - 1;var m = Math.ceil(g / 8);var q;if (c === -1 || c === undefined) { c = h; } else { if (c === -2) { c = m - h - 2; } else { if (c < -2) { throw new Error("invalid salt length"); } } }if (m < h + c + 2) { throw new Error("data too long"); }var a = this.doPublic(k).toByteArray();for (q = 0; q < a.length; q += 1) { a[q] &= 255; }while (a.length < m) { a.unshift(0); }if (a[m - 1] !== 188) { throw new Error("encoded message does not end in 0xbc"); }a = String.fromCharCode.apply(String, a);var d = a.substr(0, m - h - 1);var e = a.substr(d.length, h);var p = 65280 >> 8 * m - g & 255;if ((d.charCodeAt(0) & p) !== 0) { throw new Error("bits beyond keysize not zero"); }var n = pss_mgf1_str(e, d.length, r);var o = [];for (q = 0; q < d.length; q += 1) { o[q] = d.charCodeAt(q) ^ n.charCodeAt(q); }o[0] &= ~p;var b = m - h - c - 2;for (q = 0; q < b; q += 1) { if (o[q] !== 0) { throw new Error("leftmost octets not zero"); } }if (o[b] !== 1) { throw new Error("0x01 marker not found"); }return e === hextorstr(r(rstrtohex("\x00\x00\x00\x00\x00\x00\x00\x00" + j + String.fromCharCode.apply(String, o.slice(-c))))); };RSAKey.SALT_LEN_HLEN = -1;RSAKey.SALT_LEN_MAX = -2;RSAKey.SALT_LEN_RECOVER = -2; function X509(q) { var j = ASN1HEX, n = j.getChildIdx, g = j.getV, b = j.getTLV, c = j.getVbyList, k = j.getVbyListEx, a = j.getTLVbyList, l = j.getTLVbyListEx, h = j.getIdxbyList, e = j.getIdxbyListEx, i = j.getVidx, p = j.oidname, m = j.hextooidstr, d = X509, r = pemtohex, f;try { f = KJUR.asn1.x509.AlgorithmIdentifier.PSSNAME2ASN1TLV; } catch (o) {}this.HEX2STAG = { "0c": "utf8", "13": "prn", "16": "ia5", "1a": "vis", "1e": "bmp" };this.hex = null;this.version = 0;this.foffset = 0;this.aExtInfo = null;this.getVersion = function () { if (this.hex === null || this.version !== 0) { return this.version; }if (a(this.hex, 0, [0, 0]) !== "a003020102") { this.version = 1;this.foffset = -1;return 1; }this.version = 3;return 3; };this.getSerialNumberHex = function () { return k(this.hex, 0, [0, 0], "02"); };this.getSignatureAlgorithmField = function () { var s = l(this.hex, 0, [0, 1]);return this.getAlgorithmIdentifierName(s); };this.getAlgorithmIdentifierName = function (s) { for (var t in f) { if (s === f[t]) { return t; } }return p(k(s, 0, [0], "06")); };this.getIssuer = function () { return this.getX500Name(this.getIssuerHex()); };this.getIssuerHex = function () { return a(this.hex, 0, [0, 3 + this.foffset], "30"); };this.getIssuerString = function () { return d.hex2dn(this.getIssuerHex()); };this.getSubject = function () { return this.getX500Name(this.getSubjectHex()); };this.getSubjectHex = function () { return a(this.hex, 0, [0, 5 + this.foffset], "30"); };this.getSubjectString = function () { return d.hex2dn(this.getSubjectHex()); };this.getNotBefore = function () { var t = c(this.hex, 0, [0, 4 + this.foffset, 0]);t = t.replace(/(..)/g, "%$1");t = decodeURIComponent(t);return t; };this.getNotAfter = function () { var t = c(this.hex, 0, [0, 4 + this.foffset, 1]);t = t.replace(/(..)/g, "%$1");t = decodeURIComponent(t);return t; };this.getPublicKeyHex = function () { return j.getTLVbyList(this.hex, 0, [0, 6 + this.foffset], "30"); };this.getPublicKeyIdx = function () { return h(this.hex, 0, [0, 6 + this.foffset], "30"); };this.getPublicKeyContentIdx = function () { var s = this.getPublicKeyIdx();return h(this.hex, s, [1, 0], "30"); };this.getPublicKey = function () { return KEYUTIL.getKey(this.getPublicKeyHex(), null, "pkcs8pub"); };this.getSignatureAlgorithmName = function () { var s = a(this.hex, 0, [1], "30");return this.getAlgorithmIdentifierName(s); };this.getSignatureValueHex = function () { return c(this.hex, 0, [2], "03", true); };this.verifySignature = function (u) { var v = this.getSignatureAlgorithmField();var s = this.getSignatureValueHex();var t = a(this.hex, 0, [0], "30");var w = new KJUR.crypto.Signature({ alg: v });w.init(u);w.updateHex(t);return w.verify(s); };this.parseExt = function (B) { var u, s, w;if (B === undefined) { w = this.hex;if (this.version !== 3) { return -1; }u = h(w, 0, [0, 7, 0], "30");s = n(w, u); } else { w = pemtohex(B);var x = h(w, 0, [0, 3, 0, 0], "06");if (g(w, x) != "2a864886f70d01090e") { this.aExtInfo = new Array();return; }u = h(w, 0, [0, 3, 0, 1, 0], "30");s = n(w, u);this.hex = w; }this.aExtInfo = new Array();for (var v = 0; v < s.length; v++) { var z = {};z.critical = false;var y = n(w, s[v]);var t = 0;if (y.length === 3) { z.critical = true;t = 1; }z.oid = j.hextooidstr(c(w, s[v], [0], "06"));var A = h(w, s[v], [1 + t]);z.vidx = i(w, A);this.aExtInfo.push(z); } };this.getExtInfo = function (u) { var s = this.aExtInfo;var v = u;if (!u.match(/^[0-9.]+$/)) { v = KJUR.asn1.x509.OID.name2oid(u); }if (v === "") { return undefined; }for (var t = 0; t < s.length; t++) { if (s[t].oid === v) { return s[t]; } }return undefined; };this.getExtBasicConstraints = function (t, x) { if (t === undefined && x === undefined) { var v = this.getExtInfo("basicConstraints");if (v === undefined) { return undefined; }t = b(this.hex, v.vidx);x = v.critical; }var s = { extname: "basicConstraints" };if (x) { s.critical = true; }if (t === "3000") { return s; }if (t === "30030101ff") { s.cA = true;return s; }if (t.substr(0, 12) === "30060101ff02") { var w = g(t, 10);var u = parseInt(w, 16);s.cA = true;s.pathLen = u;return s; }throw new Error("hExtV parse error: " + t); };this.getExtKeyUsage = function (t, v) { if (t === undefined && v === undefined) { var u = this.getExtInfo("keyUsage");if (u === undefined) { return undefined; }t = b(this.hex, u.vidx);v = u.critical; }var s = { extname: "keyUsage" };if (v) { s.critical = true; }s.names = this.getExtKeyUsageString(t).split(",");return s; };this.getExtKeyUsageBin = function (u) { if (u === undefined) { var v = this.getExtInfo("keyUsage");if (v === undefined) { return ""; }u = b(this.hex, v.vidx); }if (u.length != 8 && u.length != 10) { throw new Error("malformed key usage value: " + u); }var t = "000000000000000" + parseInt(u.substr(6), 16).toString(2);if (u.length == 8) { t = t.slice(-8); }if (u.length == 10) { t = t.slice(-16); }t = t.replace(/0+$/, "");if (t == "") { t = "0"; }return t; };this.getExtKeyUsageString = function (u) { var v = this.getExtKeyUsageBin(u);var s = new Array();for (var t = 0; t < v.length; t++) { if (v.substr(t, 1) == "1") { s.push(X509.KEYUSAGE_NAME[t]); } }return s.join(","); };this.getExtSubjectKeyIdentifier = function (u, w) { if (u === undefined && w === undefined) { var v = this.getExtInfo("subjectKeyIdentifier");if (v === undefined) { return undefined; }u = b(this.hex, v.vidx);w = v.critical; }var s = { extname: "subjectKeyIdentifier" };if (w) { s.critical = true; }var t = g(u, 0);s.kid = { hex: t };return s; };this.getExtAuthorityKeyIdentifier = function (y, w) { if (y === undefined && w === undefined) { var s = this.getExtInfo("authorityKeyIdentifier");if (s === undefined) { return undefined; }y = b(this.hex, s.vidx);w = s.critical; }var z = { extname: "authorityKeyIdentifier" };if (w) { z.critical = true; }var x = n(y, 0);for (var t = 0; t < x.length; t++) { var A = y.substr(x[t], 2);if (A === "80") { z.kid = { hex: g(y, x[t]) }; }if (A === "a1") { var v = b(y, x[t]);var u = this.getGeneralNames(v);z.issuer = u[0]["dn"]; }if (A === "82") { z.sn = { hex: g(y, x[t]) }; } }return z; };this.getExtExtKeyUsage = function (v, x) { if (v === undefined && x === undefined) { var w = this.getExtInfo("extKeyUsage");if (w === undefined) { return undefined; }v = b(this.hex, w.vidx);x = w.critical; }var s = { extname: "extKeyUsage", array: [] };if (x) { s.critical = true; }var t = n(v, 0);for (var u = 0; u < t.length; u++) { s.array.push(p(g(v, t[u]))); }return s; };this.getExtExtKeyUsageName = function () { var w = this.getExtInfo("extKeyUsage");if (w === undefined) { return w; }var s = new Array();var v = b(this.hex, w.vidx);if (v === "") { return s; }var t = n(v, 0);for (var u = 0; u < t.length; u++) { s.push(p(g(v, t[u]))); }return s; };this.getExtSubjectAltName = function (t, v) { if (t === undefined && v === undefined) { var u = this.getExtInfo("subjectAltName");if (u === undefined) { return undefined; }t = b(this.hex, u.vidx);v = u.critical; }var s = { extname: "subjectAltName", array: [] };if (v) { s.critical = true; }s.array = this.getGeneralNames(t);return s; };this.getExtIssuerAltName = function (t, v) { if (t === undefined && v === undefined) { var u = this.getExtInfo("issuerAltName");if (u === undefined) { return undefined; }t = b(this.hex, u.vidx);v = u.critical; }var s = { extname: "issuerAltName", array: [] };if (v) { s.critical = true; }s.array = this.getGeneralNames(t);return s; };this.getGeneralNames = function (w) { var u = n(w, 0);var s = [];for (var v = 0; v < u.length; v++) { var t = this.getGeneralName(b(w, u[v]));if (t !== undefined) { s.push(t); } }return s; };this.getGeneralName = function (t) { var s = t.substr(0, 2);var v = g(t, 0);var u = hextorstr(v);if (s == "81") { return { rfc822: u }; }if (s == "82") { return { dns: u }; }if (s == "86") { return { uri: u }; }if (s == "87") { return { ip: hextoip(v) }; }if (s == "a4") { return { dn: this.getX500Name(v) }; }return undefined; };this.getExtSubjectAltName2 = function () { var w, z, y;var x = this.getExtInfo("subjectAltName");if (x === undefined) { return x; }var s = new Array();var v = b(this.hex, x.vidx);var t = n(v, 0);for (var u = 0; u < t.length; u++) { y = v.substr(t[u], 2);w = g(v, t[u]);if (y === "81") { z = hextoutf8(w);s.push(["MAIL", z]); }if (y === "82") { z = hextoutf8(w);s.push(["DNS", z]); }if (y === "84") { z = X509.hex2dn(w, 0);s.push(["DN", z]); }if (y === "86") { z = hextoutf8(w);s.push(["URI", z]); }if (y === "87") { z = hextoip(w);s.push(["IP", z]); } }return s; };this.getExtCRLDistributionPoints = function (w, y) { if (w === undefined && y === undefined) { var x = this.getExtInfo("cRLDistributionPoints");if (x === undefined) { return undefined; }w = b(this.hex, x.vidx);y = x.critical; }var t = { extname: "cRLDistributionPoints", array: [] };if (y) { t.critical = true; }var u = n(w, 0);for (var v = 0; v < u.length; v++) { var s = b(w, u[v]);t.array.push(this.getDistributionPoint(s)); }return t; };this.getDistributionPoint = function (x) { var u = {};var v = n(x, 0);for (var w = 0; w < v.length; w++) { var t = x.substr(v[w], 2);var s = b(x, v[w]);if (t == "a0") { u.dpname = this.getDistributionPointName(s); } }return u; };this.getDistributionPointName = function (x) { var u = {};var v = n(x, 0);for (var w = 0; w < v.length; w++) { var t = x.substr(v[w], 2);var s = b(x, v[w]);if (t == "a0") { u.full = this.getGeneralNames(s); } }return u; };this.getExtCRLDistributionPointsURI = function () { var x = this.getExtInfo("cRLDistributionPoints");if (x === undefined) { return x; }var s = new Array();var t = n(this.hex, x.vidx);for (var v = 0; v < t.length; v++) { try { var y = c(this.hex, t[v], [0, 0, 0], "86");var w = hextoutf8(y);s.push(w); } catch (u) {} }return s; };this.getExtAIAInfo = function () { var w = this.getExtInfo("authorityInfoAccess");if (w === undefined) { return w; }var s = { ocsp: [], caissuer: [] };var t = n(this.hex, w.vidx);for (var u = 0; u < t.length; u++) { var x = c(this.hex, t[u], [0], "06");var v = c(this.hex, t[u], [1], "86");if (x === "2b06010505073001") { s.ocsp.push(hextoutf8(v)); }if (x === "2b06010505073002") { s.caissuer.push(hextoutf8(v)); } }return s; };this.getExtAuthorityInfoAccess = function (z, x) { if (z === undefined && x === undefined) { var s = this.getExtInfo("authorityInfoAccess");if (s === undefined) { return undefined; }z = b(this.hex, s.vidx);x = s.critical; }var A = { extname: "authorityInfoAccess", array: [] };if (x) { A.critical = true; }var y = n(z, 0);for (var t = 0; t < y.length; t++) { var w = k(z, y[t], [0], "06");var u = c(z, y[t], [1], "86");var v = hextoutf8(u);if (w == "2b06010505073001") { A.array.push({ ocsp: v }); } else { if (w == "2b06010505073002") { A.array.push({ caissuer: v }); } else { throw new Error("unknown method: " + w); } } }return A; };this.getExtCertificatePolicies = function (w, z) { if (w === undefined && z === undefined) { var y = this.getExtInfo("certificatePolicies");if (y === undefined) { return undefined; }w = b(this.hex, y.vidx);z = y.critical; }var s = { extname: "certificatePolicies", array: [] };if (z) { s.critical = true; }var t = n(w, 0);for (var u = 0; u < t.length; u++) { var x = b(w, t[u]);var v = this.getPolicyInformation(x);s.array.push(v); }return s; };this.getPolicyInformation = function (w) { var s = {};var y = c(w, 0, [0], "06");s.policyoid = p(y);var z = e(w, 0, [1], "30");if (z != -1) { s.array = [];var t = n(w, z);for (var u = 0; u < t.length; u++) { var x = b(w, t[u]);var v = this.getPolicyQualifierInfo(x);s.array.push(v); } }return s; };this.getPolicyQualifierInfo = function (t) { var s = {};var u = c(t, 0, [0], "06");if (u === "2b06010505070201") { var w = k(t, 0, [1], "16");s.cps = hextorstr(w); } else { if (u === "2b06010505070202") { var v = a(t, 0, [1], "30");s.unotice = this.getUserNotice(v); } }return s; };this.getUserNotice = function (w) { var t = {};var u = n(w, 0);for (var v = 0; v < u.length; v++) { var s = b(w, u[v]);if (s.substr(0, 2) != "30") { t.exptext = this.getDisplayText(s); } }return t; };this.getDisplayText = function (t) { var u = { "0c": "utf8", "16": "ia5", "1a": "vis", "1e": "bmp" };var s = {};s.type = u[t.substr(0, 2)];s.str = hextorstr(g(t, 0));return s; };this.getExtCRLNumber = function (t, u) { var s = { extname: "cRLNumber" };if (u) { s.critical = true; }if (t.substr(0, 2) == "02") { s.num = { hex: g(t, 0) };return s; }throw new Error("hExtV parse error: " + t); };this.getExtCRLReason = function (t, u) { var s = { extname: "cRLReason" };if (u) { s.critical = true; }if (t.substr(0, 2) == "0a") { s.code = parseInt(g(t, 0), 16);return s; }throw new Error("hExtV parse error: " + t); };this.getExtOcspNonce = function (t, v) { var s = { extname: "ocspNonce" };if (v) { s.critical = true; }var u = g(t, 0);s.hex = u;return s; };this.getExtOcspNoCheck = function (t, u) { var s = { extname: "ocspNoCheck" };if (u) { s.critical = true; }return s; };this.getExtAdobeTimeStamp = function (v, y) { if (v === undefined && y === undefined) { var x = this.getExtInfo("adobeTimeStamp");if (x === undefined) { return undefined; }v = b(this.hex, x.vidx);y = x.critical; }var s = { extname: "adobeTimeStamp" };if (y) { s.critical = true; }var u = n(v, 0);if (u.length > 1) { var z = b(v, u[1]);var t = this.getGeneralName(z);if (t.uri != undefined) { s.uri = t.uri; } }if (u.length > 2) { var w = b(v, u[2]);if (w == "0101ff") { s.reqauth = true; }if (w == "010100") { s.reqauth = false; } }return s; };this.getX500NameRule = function (s) { var z = true;var D = true;var C = false;var t = "";var w = "";var F = null;var A = [];for (var v = 0; v < s.length; v++) { var x = s[v];for (var u = 0; u < x.length; u++) { A.push(x[u]); } }for (var v = 0; v < A.length; v++) { var E = A[v];var G = E.ds;var B = E.value;var y = E.type;t += ":" + G;if (G != "prn" && G != "utf8" && G != "ia5") { return "mixed"; }if (G == "ia5") { if (y != "CN") { return "mixed"; } else { if (!KJUR.lang.String.isMail(B)) { return "mixed"; } else { continue; } } }if (y == "C") { if (G == "prn") { continue; } else { return "mixed"; } }w += ":" + G;if (F == null) { F = G; } else { if (F !== G) { return "mixed"; } } }if (F == null) { return "prn"; } else { return F; } };this.getX500Name = function (v) { var t = this.getX500NameArray(v);var u = this.dnarraytostr(t);return { array: t, str: u }; };this.getX500NameArray = function (v) { var s = [];var t = n(v, 0);for (var u = 0; u < t.length; u++) { s.push(this.getRDN(b(v, t[u]))); }return s; };this.getRDN = function (v) { var s = [];var t = n(v, 0);for (var u = 0; u < t.length; u++) { s.push(this.getAttrTypeAndValue(b(v, t[u]))); }return s; };this.getAttrTypeAndValue = function (u) { var s = { type: null, value: null, ds: null };var t = n(u, 0);var x = c(u, t[0], [], "06");var w = c(u, t[1], []);var v = KJUR.asn1.ASN1Util.oidHexToInt(x);s.type = KJUR.asn1.x509.OID.oid2atype(v);s.value = hextorstr(w);s.ds = this.HEX2STAG[u.substr(t[1], 2)];return s; };this.readCertPEM = function (s) { this.readCertHex(r(s)); };this.readCertHex = function (s) { this.hex = s;this.getVersion();try { h(this.hex, 0, [0, 7], "a3");this.parseExt(); } catch (t) {} };this.getParam = function () { var s = {};s.version = this.getVersion();s.serial = { hex: this.getSerialNumberHex() };s.sigalg = this.getSignatureAlgorithmField();s.issuer = this.getIssuer();s.notbefore = this.getNotBefore();s.notafter = this.getNotAfter();s.subject = this.getSubject();s.sbjpubkey = hextopem(this.getPublicKeyHex(), "PUBLIC KEY");if (this.aExtInfo.length > 0) { s.ext = this.getExtParamArray(); }s.sighex = this.getSignatureValueHex();return s; };this.getExtParamArray = function (t) { if (t == undefined) { var v = e(this.hex, 0, [0, "[3]"]);if (v != -1) { t = l(this.hex, 0, [0, "[3]", 0], "30"); } }var s = [];var u = n(t, 0);for (var w = 0; w < u.length; w++) { var y = b(t, u[w]);var x = this.getExtParam(y);if (x != null) { s.push(x); } }return s; };this.getExtParam = function (t) { var A = {};var v = n(t, 0);var w = v.length;if (w != 2 && w != 3) { throw new Error("wrong number elements in Extension: " + w + " " + t); }var u = m(c(t, 0, [0], "06"));var y = false;if (w == 3 && a(t, 0, [1]) == "0101ff") { y = true; }var z = a(t, 0, [w - 1, 0]);var x = undefined;if (u == "2.5.29.14") { x = this.getExtSubjectKeyIdentifier(z, y); } else { if (u == "2.5.29.15") { x = this.getExtKeyUsage(z, y); } else { if (u == "2.5.29.17") { x = this.getExtSubjectAltName(z, y); } else { if (u == "2.5.29.18") { x = this.getExtIssuerAltName(z, y); } else { if (u == "2.5.29.19") { x = this.getExtBasicConstraints(z, y); } else { if (u == "2.5.29.31") { x = this.getExtCRLDistributionPoints(z, y); } else { if (u == "2.5.29.32") { x = this.getExtCertificatePolicies(z, y); } else { if (u == "2.5.29.35") { x = this.getExtAuthorityKeyIdentifier(z, y); } else { if (u == "2.5.29.37") { x = this.getExtExtKeyUsage(z, y); } else { if (u == "1.3.6.1.5.5.7.1.1") { x = this.getExtAuthorityInfoAccess(z, y); } else { if (u == "2.5.29.20") { x = this.getExtCRLNumber(z, y); } else { if (u == "2.5.29.21") { x = this.getExtCRLReason(z, y); } else { if (u == "1.3.6.1.5.5.7.48.1.2") { x = this.getExtOcspNonce(z, y); } else { if (u == "1.3.6.1.5.5.7.48.1.5") { x = this.getExtOcspNoCheck(z, y); } else { if (u == "1.2.840.113583.1.1.9.1") { x = this.getExtAdobeTimeStamp(z, y); } } } } } } } } } } } } } } }if (x != undefined) { return x; }var s = { extname: u, extn: z };if (y) { s.critical = true; }return s; };this.findExt = function (t, u) { for (var s = 0; s < t.length; s++) { if (t[s].extname == u) { return t[s]; } }return null; };this.updateExtCDPFullURI = function (w, s) { var v = this.findExt(w, "cRLDistributionPoints");if (v == null) { return; }if (v.array == undefined) { return; }var y = v.array;for (var u = 0; u < y.length; u++) { if (y[u].dpname == undefined) { continue; }if (y[u].dpname.full == undefined) { continue; }var z = y[u].dpname.full;for (var t = 0; t < z.length; t++) { var x = z[u];if (x.uri == undefined) { continue; }x.uri = s; } } };this.updateExtAIAOCSP = function (w, t) { var v = this.findExt(w, "authorityInfoAccess");if (v == null) { return; }if (v.array == undefined) { return; }var s = v.array;for (var u = 0; u < s.length; u++) { if (s[u].ocsp != undefined) { s[u].ocsp = t; } } };this.updateExtAIACAIssuer = function (w, t) { var v = this.findExt(w, "authorityInfoAccess");if (v == null) { return; }if (v.array == undefined) { return; }var s = v.array;for (var u = 0; u < s.length; u++) { if (s[u].caissuer != undefined) { s[u].caissuer = t; } } };this.dnarraytostr = function (u) { function s(v) { return v.map(function (w) { return t(w); }).join("+"); }function t(v) { return v.type + "=" + v.value; }return "/" + u.map(function (v) { return s(v); }).join("/"); };this.getInfo = function () { var u = function u(M) { var L = JSON.stringify(M.array).replace(/[\[\]\{\}\"]/g, "");return L; };var A = function A(R) { var P = "";var L = R.array;for (var O = 0; O < L.length; O++) { var Q = L[O];P += " policy oid: " + Q.policyoid + "\n";if (Q.array === undefined) { continue; }for (var N = 0; N < Q.array.length; N++) { var M = Q.array[N];if (M.cps !== undefined) { P += " cps: " + M.cps + "\n"; } } }return P; };var D = function D(P) { var O = "";var L = P.array;for (var N = 0; N < L.length; N++) { var Q = L[N];try { if (Q.dpname.full[0].uri !== undefined) { O += " " + Q.dpname.full[0].uri + "\n"; } } catch (M) {}try { if (Q.dname.full[0].dn.hex !== undefined) { O += " " + X509.hex2dn(Q.dpname.full[0].dn.hex) + "\n"; } } catch (M) {} }return O; };var B = function B(P) { var O = "";var L = P.array;for (var M = 0; M < L.length; M++) { var N = L[M];if (N.caissuer !== undefined) { O += " caissuer: " + N.caissuer + "\n"; }if (N.ocsp !== undefined) { O += " ocsp: " + N.ocsp + "\n"; } }return O; };var v = X509;var F, E, K;F = "Basic Fields\n";F += " serial number: " + this.getSerialNumberHex() + "\n";F += " signature algorithm: " + this.getSignatureAlgorithmField() + "\n";F += " issuer: " + this.getIssuerString() + "\n";F += " notBefore: " + this.getNotBefore() + "\n";F += " notAfter: " + this.getNotAfter() + "\n";F += " subject: " + this.getSubjectString() + "\n";F += " subject public key info: \n";E = this.getPublicKey();F += " key algorithm: " + E.type + "\n";if (E.type === "RSA") { F += " n=" + hextoposhex(E.n.toString(16)).substr(0, 16) + "...\n";F += " e=" + hextoposhex(E.e.toString(16)) + "\n"; }K = this.aExtInfo;if (K !== undefined && K !== null) { F += "X509v3 Extensions:\n";for (var H = 0; H < K.length; H++) { var J = K[H];var t = KJUR.asn1.x509.OID.oid2name(J.oid);if (t === "") { t = J.oid; }var G = "";if (J.critical === true) { G = "CRITICAL"; }F += " " + t + " " + G + ":\n";if (t === "basicConstraints") { var w = this.getExtBasicConstraints();if (w.cA === undefined) { F += " {}\n"; } else { F += " cA=true";if (w.pathLen !== undefined) { F += ", pathLen=" + w.pathLen; }F += "\n"; } } else { if (t === "keyUsage") { F += " " + this.getExtKeyUsageString() + "\n"; } else { if (t === "subjectKeyIdentifier") { F += " " + this.getExtSubjectKeyIdentifier().kid.hex + "\n"; } else { if (t === "authorityKeyIdentifier") { var x = this.getExtAuthorityKeyIdentifier();if (x.kid !== undefined) { F += " kid=" + x.kid.hex + "\n"; } } else { if (t === "extKeyUsage") { var I = this.getExtExtKeyUsage().array;F += " " + I.join(", ") + "\n"; } else { if (t === "subjectAltName") { var y = u(this.getExtSubjectAltName());F += " " + y + "\n"; } else { if (t === "cRLDistributionPoints") { var C = this.getExtCRLDistributionPoints();F += D(C); } else { if (t === "authorityInfoAccess") { var z = this.getExtAuthorityInfoAccess();F += B(z); } else { if (t === "certificatePolicies") { F += A(this.getExtCertificatePolicies()); } } } } } } } } } } }F += "signature algorithm: " + this.getSignatureAlgorithmName() + "\n";F += "signature: " + this.getSignatureValueHex().substr(0, 16) + "...\n";return F; };if (typeof q == "string") { if (q.indexOf("-----BEGIN") != -1) { this.readCertPEM(q); } else { if (KJUR.lang.String.isHex(q)) { this.readCertHex(q); } } } }X509.hex2dn = function (f, b) { if (b === undefined) { b = 0; }if (f.substr(b, 2) !== "30") { throw new Error("malformed DN"); }var c = new Array();var d = ASN1HEX.getChildIdx(f, b);for (var e = 0; e < d.length; e++) { c.push(X509.hex2rdn(f, d[e])); }c = c.map(function (a) { return a.replace("/", "\\/"); });return "/" + c.join("/"); };X509.hex2rdn = function (f, b) { if (b === undefined) { b = 0; }if (f.substr(b, 2) !== "31") { throw new Error("malformed RDN"); }var c = new Array();var d = ASN1HEX.getChildIdx(f, b);for (var e = 0; e < d.length; e++) { c.push(X509.hex2attrTypeValue(f, d[e])); }c = c.map(function (a) { return a.replace("+", "\\+"); });return c.join("+"); };X509.hex2attrTypeValue = function (d, i) { var j = ASN1HEX;var h = j.getV;if (i === undefined) { i = 0; }if (d.substr(i, 2) !== "30") { throw new Error("malformed attribute type and value"); }var g = j.getChildIdx(d, i);if (g.length !== 2 || d.substr(g[0], 2) !== "06") { "malformed attribute type and value"; }var b = h(d, g[0]);var f = KJUR.asn1.ASN1Util.oidHexToInt(b);var e = KJUR.asn1.x509.OID.oid2atype(f);var a = h(d, g[1]);var c = hextorstr(a);return e + "=" + c; };X509.getPublicKeyFromCertHex = function (b) { var a = new X509();a.readCertHex(b);return a.getPublicKey(); };X509.getPublicKeyFromCertPEM = function (b) { var a = new X509();a.readCertPEM(b);return a.getPublicKey(); };X509.getPublicKeyInfoPropOfCertPEM = function (c) { var e = ASN1HEX;var g = e.getVbyList;var b = {};var a, f, d;b.algparam = null;a = new X509();a.readCertPEM(c);f = a.getPublicKeyHex();b.keyhex = g(f, 0, [1], "03").substr(2);b.algoid = g(f, 0, [0, 0], "06");if (b.algoid === "2a8648ce3d0201") { b.algparam = g(f, 0, [0, 1], "06"); }return b; };X509.KEYUSAGE_NAME = ["digitalSignature", "nonRepudiation", "keyEncipherment", "dataEncipherment", "keyAgreement", "keyCertSign", "cRLSign", "encipherOnly", "decipherOnly"]; if (typeof KJUR == "undefined" || !KJUR) { exports.KJUR = KJUR = {}; }if (typeof KJUR.jws == "undefined" || !KJUR.jws) { KJUR.jws = {}; }KJUR.jws.JWS = function () { var b = KJUR, a = b.jws.JWS, c = a.isSafeJSONString;this.parseJWS = function (g, j) { if (this.parsedJWS !== undefined && (j || this.parsedJWS.sigvalH !== undefined)) { return; }var i = g.match(/^([^.]+)\.([^.]+)\.([^.]+)$/);if (i == null) { throw "JWS signature is not a form of 'Head.Payload.SigValue'."; }var k = i[1];var e = i[2];var l = i[3];var n = k + "." + e;this.parsedJWS = {};this.parsedJWS.headB64U = k;this.parsedJWS.payloadB64U = e;this.parsedJWS.sigvalB64U = l;this.parsedJWS.si = n;if (!j) { var h = b64utohex(l);var f = parseBigInt(h, 16);this.parsedJWS.sigvalH = h;this.parsedJWS.sigvalBI = f; }var d = b64utoutf8(k);var m = b64utoutf8(e);this.parsedJWS.headS = d;this.parsedJWS.payloadS = m;if (!c(d, this.parsedJWS, "headP")) { throw "malformed JSON string for JWS Head: " + d; } }; };KJUR.jws.JWS.sign = function (j, w, z, A, a) { var x = KJUR, n = x.jws, r = n.JWS, h = r.readSafeJSONString, q = r.isSafeJSONString, d = x.crypto, l = d.ECDSA, p = d.Mac, c = d.Signature, u = JSON;var t, k, o;if (typeof w != "string" && (typeof w === "undefined" ? "undefined" : _typeof(w)) != "object") { throw "spHeader must be JSON string or object: " + w; }if ((typeof w === "undefined" ? "undefined" : _typeof(w)) == "object") { k = w;t = u.stringify(k); }if (typeof w == "string") { t = w;if (!q(t)) { throw "JWS Head is not safe JSON string: " + t; }k = h(t); }o = z;if ((typeof z === "undefined" ? "undefined" : _typeof(z)) == "object") { o = u.stringify(z); }if ((j == "" || j == null) && k.alg !== undefined) { j = k.alg; }if (j != "" && j != null && k.alg === undefined) { k.alg = j;t = u.stringify(k); }if (j !== k.alg) { throw "alg and sHeader.alg doesn't match: " + j + "!=" + k.alg; }var s = null;if (r.jwsalg2sigalg[j] === undefined) { throw "unsupported alg name: " + j; } else { s = r.jwsalg2sigalg[j]; }var e = utf8tob64u(t);var m = utf8tob64u(o);var b = e + "." + m;var y = "";if (s.substr(0, 4) == "Hmac") { if (A === undefined) { throw "mac key shall be specified for HS* alg"; }var i = new p({ alg: s, prov: "cryptojs", pass: A });i.updateString(b);y = i.doFinal(); } else { if (s.indexOf("withECDSA") != -1) { var f = new c({ alg: s });f.init(A, a);f.updateString(b);var g = f.sign();y = KJUR.crypto.ECDSA.asn1SigToConcatSig(g); } else { if (s != "none") { var f = new c({ alg: s });f.init(A, a);f.updateString(b);y = f.sign(); } } }var v = hextob64u(y);return b + "." + v; };KJUR.jws.JWS.verify = function (w, B, n) { var x = KJUR, q = x.jws, t = q.JWS, i = t.readSafeJSONString, e = x.crypto, p = e.ECDSA, s = e.Mac, d = e.Signature, m;if ((typeof RSAKey === "undefined" ? "undefined" : _typeof(RSAKey)) !== undefined) { m = RSAKey; }var y = w.split(".");if (y.length !== 3) { return false; }var f = y[0];var r = y[1];var c = f + "." + r;var A = b64utohex(y[2]);var l = i(b64utoutf8(y[0]));var k = null;var z = null;if (l.alg === undefined) { throw "algorithm not specified in header"; } else { k = l.alg;z = k.substr(0, 2); }if (n != null && Object.prototype.toString.call(n) === "[object Array]" && n.length > 0) { var b = ":" + n.join(":") + ":";if (b.indexOf(":" + k + ":") == -1) { throw "algorithm '" + k + "' not accepted in the list"; } }if (k != "none" && B === null) { throw "key shall be specified to verify."; }if (typeof B == "string" && B.indexOf("-----BEGIN ") != -1) { B = KEYUTIL.getKey(B); }if (z == "RS" || z == "PS") { if (!(B instanceof m)) { throw "key shall be a RSAKey obj for RS* and PS* algs"; } }if (z == "ES") { if (!(B instanceof p)) { throw "key shall be a ECDSA obj for ES* algs"; } }if (k == "none") {}var u = null;if (t.jwsalg2sigalg[l.alg] === undefined) { throw "unsupported alg name: " + k; } else { u = t.jwsalg2sigalg[k]; }if (u == "none") { throw "not supported"; } else { if (u.substr(0, 4) == "Hmac") { var o = null;if (B === undefined) { throw "hexadecimal key shall be specified for HMAC"; }var j = new s({ alg: u, pass: B });j.updateString(c);o = j.doFinal();return A == o; } else { if (u.indexOf("withECDSA") != -1) { var h = null;try { h = p.concatSigToASN1Sig(A); } catch (v) { return false; }var g = new d({ alg: u });g.init(B);g.updateString(c);return g.verify(h); } else { var g = new d({ alg: u });g.init(B);g.updateString(c);return g.verify(A); } } } };KJUR.jws.JWS.parse = function (g) { var c = g.split(".");var b = {};var f, e, d;if (c.length != 2 && c.length != 3) { throw "malformed sJWS: wrong number of '.' splitted elements"; }f = c[0];e = c[1];if (c.length == 3) { d = c[2]; }b.headerObj = KJUR.jws.JWS.readSafeJSONString(b64utoutf8(f));b.payloadObj = KJUR.jws.JWS.readSafeJSONString(b64utoutf8(e));b.headerPP = JSON.stringify(b.headerObj, null, " ");if (b.payloadObj == null) { b.payloadPP = b64utoutf8(e); } else { b.payloadPP = JSON.stringify(b.payloadObj, null, " "); }if (d !== undefined) { b.sigHex = b64utohex(d); }return b; };KJUR.jws.JWS.verifyJWT = function (e, l, r) { var d = KJUR, j = d.jws, o = j.JWS, n = o.readSafeJSONString, p = o.inArray, f = o.includedArray;var k = e.split(".");var c = k[0];var i = k[1];var q = c + "." + i;var m = b64utohex(k[2]);var h = n(b64utoutf8(c));var g = n(b64utoutf8(i));if (h.alg === undefined) { return false; }if (r.alg === undefined) { throw "acceptField.alg shall be specified"; }if (!p(h.alg, r.alg)) { return false; }if (g.iss !== undefined && _typeof(r.iss) === "object") { if (!p(g.iss, r.iss)) { return false; } }if (g.sub !== undefined && _typeof(r.sub) === "object") { if (!p(g.sub, r.sub)) { return false; } }if (g.aud !== undefined && _typeof(r.aud) === "object") { if (typeof g.aud == "string") { if (!p(g.aud, r.aud)) { return false; } } else { if (_typeof(g.aud) == "object") { if (!f(g.aud, r.aud)) { return false; } } } }var b = j.IntDate.getNow();if (r.verifyAt !== undefined && typeof r.verifyAt === "number") { b = r.verifyAt; }if (r.gracePeriod === undefined || typeof r.gracePeriod !== "number") { r.gracePeriod = 0; }if (g.exp !== undefined && typeof g.exp == "number") { if (g.exp + r.gracePeriod < b) { return false; } }if (g.nbf !== undefined && typeof g.nbf == "number") { if (b < g.nbf - r.gracePeriod) { return false; } }if (g.iat !== undefined && typeof g.iat == "number") { if (b < g.iat - r.gracePeriod) { return false; } }if (g.jti !== undefined && r.jti !== undefined) { if (g.jti !== r.jti) { return false; } }if (!o.verify(e, l, r.alg)) { return false; }return true; };KJUR.jws.JWS.includedArray = function (b, a) { var c = KJUR.jws.JWS.inArray;if (b === null) { return false; }if ((typeof b === "undefined" ? "undefined" : _typeof(b)) !== "object") { return false; }if (typeof b.length !== "number") { return false; }for (var d = 0; d < b.length; d++) { if (!c(b[d], a)) { return false; } }return true; };KJUR.jws.JWS.inArray = function (d, b) { if (b === null) { return false; }if ((typeof b === "undefined" ? "undefined" : _typeof(b)) !== "object") { return false; }if (typeof b.length !== "number") { return false; }for (var c = 0; c < b.length; c++) { if (b[c] == d) { return true; } }return false; };KJUR.jws.JWS.jwsalg2sigalg = { HS256: "HmacSHA256", HS384: "HmacSHA384", HS512: "HmacSHA512", RS256: "SHA256withRSA", RS384: "SHA384withRSA", RS512: "SHA512withRSA", ES256: "SHA256withECDSA", ES384: "SHA384withECDSA", PS256: "SHA256withRSAandMGF1", PS384: "SHA384withRSAandMGF1", PS512: "SHA512withRSAandMGF1", none: "none" };KJUR.jws.JWS.isSafeJSONString = function (c, b, d) { var e = null;try { e = jsonParse(c);if ((typeof e === "undefined" ? "undefined" : _typeof(e)) != "object") { return 0; }if (e.constructor === Array) { return 0; }if (b) { b[d] = e; }return 1; } catch (a) { return 0; } };KJUR.jws.JWS.readSafeJSONString = function (b) { var c = null;try { c = jsonParse(b);if ((typeof c === "undefined" ? "undefined" : _typeof(c)) != "object") { return null; }if (c.constructor === Array) { return null; }return c; } catch (a) { return null; } };KJUR.jws.JWS.getEncodedSignatureValueFromJWS = function (b) { var a = b.match(/^[^.]+\.[^.]+\.([^.]+)$/);if (a == null) { throw "JWS signature is not a form of 'Head.Payload.SigValue'."; }return a[1]; };KJUR.jws.JWS.getJWKthumbprint = function (d) { if (d.kty !== "RSA" && d.kty !== "EC" && d.kty !== "oct") { throw "unsupported algorithm for JWK Thumprint"; }var a = "{";if (d.kty === "RSA") { if (typeof d.n != "string" || typeof d.e != "string") { throw "wrong n and e value for RSA key"; }a += '"e":"' + d.e + '",';a += '"kty":"' + d.kty + '",';a += '"n":"' + d.n + '"}'; } else { if (d.kty === "EC") { if (typeof d.crv != "string" || typeof d.x != "string" || typeof d.y != "string") { throw "wrong crv, x and y value for EC key"; }a += '"crv":"' + d.crv + '",';a += '"kty":"' + d.kty + '",';a += '"x":"' + d.x + '",';a += '"y":"' + d.y + '"}'; } else { if (d.kty === "oct") { if (typeof d.k != "string") { throw "wrong k value for oct(symmetric) key"; }a += '"kty":"' + d.kty + '",';a += '"k":"' + d.k + '"}'; } } }var b = rstrtohex(a);var c = KJUR.crypto.Util.hashHex(b, "sha256");var e = hextob64u(c);return e; };KJUR.jws.IntDate = {};KJUR.jws.IntDate.get = function (c) { var b = KJUR.jws.IntDate, d = b.getNow, a = b.getZulu;if (c == "now") { return d(); } else { if (c == "now + 1hour") { return d() + 60 * 60; } else { if (c == "now + 1day") { return d() + 60 * 60 * 24; } else { if (c == "now + 1month") { return d() + 60 * 60 * 24 * 30; } else { if (c == "now + 1year") { return d() + 60 * 60 * 24 * 365; } else { if (c.match(/Z$/)) { return a(c); } else { if (c.match(/^[0-9]+$/)) { return parseInt(c); } } } } } } }throw "unsupported format: " + c; };KJUR.jws.IntDate.getZulu = function (a) { return zulutosec(a); };KJUR.jws.IntDate.getNow = function () { var a = ~~(new Date() / 1000);return a; };KJUR.jws.IntDate.intDate2UTCString = function (a) { var b = new Date(a * 1000);return b.toUTCString(); };KJUR.jws.IntDate.intDate2Zulu = function (e) { var i = new Date(e * 1000), h = ("0000" + i.getUTCFullYear()).slice(-4), g = ("00" + (i.getUTCMonth() + 1)).slice(-2), b = ("00" + i.getUTCDate()).slice(-2), a = ("00" + i.getUTCHours()).slice(-2), c = ("00" + i.getUTCMinutes()).slice(-2), f = ("00" + i.getUTCSeconds()).slice(-2);return h + g + b + a + c + f + "Z"; }; exports.SecureRandom = SecureRandom; exports.rng_seed_time = rng_seed_time; exports.BigInteger = BigInteger; exports.RSAKey = RSAKey; var EDSA = KJUR.crypto.EDSA; exports.EDSA = EDSA; var DSA = KJUR.crypto.DSA; exports.DSA = DSA; var Signature = KJUR.crypto.Signature; exports.Signature = Signature; var MessageDigest = KJUR.crypto.MessageDigest; exports.MessageDigest = MessageDigest; var Mac = KJUR.crypto.Mac; exports.Mac = Mac; var Cipher = KJUR.crypto.Cipher; exports.Cipher = Cipher; exports.KEYUTIL = KEYUTIL; exports.ASN1HEX = ASN1HEX; exports.X509 = X509; exports.CryptoJS = CryptoJS; // ext/base64.js exports.b64tohex = b64tohex; exports.b64toBA = b64toBA; // base64x.js exports.stoBA = stoBA; exports.BAtos = BAtos; exports.BAtohex = BAtohex; exports.stohex = stohex; exports.stob64 = stob64; exports.stob64u = stob64u; exports.b64utos = b64utos; exports.b64tob64u = b64tob64u; exports.b64utob64 = b64utob64; exports.hex2b64 = hex2b64; exports.hextob64u = hextob64u; exports.b64utohex = b64utohex; exports.utf8tob64u = utf8tob64u; exports.b64utoutf8 = b64utoutf8; exports.utf8tob64 = utf8tob64; exports.b64toutf8 = b64toutf8; exports.utf8tohex = utf8tohex; exports.hextoutf8 = hextoutf8; exports.hextorstr = hextorstr; exports.rstrtohex = rstrtohex; exports.hextob64 = hextob64; exports.hextob64nl = hextob64nl; exports.b64nltohex = b64nltohex; exports.hextopem = hextopem; exports.pemtohex = pemtohex; exports.hextoArrayBuffer = hextoArrayBuffer; exports.ArrayBuffertohex = ArrayBuffertohex; exports.zulutomsec = zulutomsec; exports.zulutosec = zulutosec; exports.zulutodate = zulutodate; exports.datetozulu = datetozulu; exports.uricmptohex = uricmptohex; exports.hextouricmp = hextouricmp; exports.ipv6tohex = ipv6tohex; exports.hextoipv6 = hextoipv6; exports.hextoip = hextoip; exports.iptohex = iptohex; exports.encodeURIComponentAll = encodeURIComponentAll; exports.newline_toUnix = newline_toUnix; exports.newline_toDos = newline_toDos; exports.hextoposhex = hextoposhex; exports.intarystrtohex = intarystrtohex; exports.strdiffidx = strdiffidx; // name spaces exports.KJUR = KJUR; var _crypto = KJUR.crypto; exports.crypto = _crypto; var _KJUR = KJUR; var asn1 = _KJUR.asn1; exports.asn1 = asn1; var _KJUR2 = KJUR; var jws = _KJUR2.jws; exports.jws = jws; var _KJUR3 = KJUR; var lang = _KJUR3.lang; exports.lang = lang; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/buffer/index.js */ "./node_modules/buffer/index.js").Buffer)) /***/ }), /***/ "./node_modules/base64-js/index.js": /*!*****************************************!*\ !*** ./node_modules/base64-js/index.js ***! \*****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.byteLength = byteLength exports.toByteArray = toByteArray exports.fromByteArray = 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('') } /***/ }), /***/ "./node_modules/buffer/index.js": /*!**************************************!*\ !*** ./node_modules/buffer/index.js ***! \**************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global) {/*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh * @license MIT */ /* eslint-disable no-proto */ var base64 = __webpack_require__(/*! base64-js */ "./node_modules/base64-js/index.js") var ieee754 = __webpack_require__(/*! ieee754 */ "./node_modules/ieee754/index.js") var isArray = __webpack_require__(/*! isarray */ "./node_modules/isarray/index.js") exports.Buffer = Buffer exports.SlowBuffer = SlowBuffer exports.INSPECT_MAX_BYTES = 50 /** * If `Buffer.TYPED_ARRAY_SUPPORT`: * === true Use Uint8Array implementation (fastest) * === false Use 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+. * * Due to various browser bugs, sometimes the Object implementation will be used even * when the browser supports typed arrays. * * Note: * * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. * * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. * * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of * incorrect length in some situations. * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they * get the Object implementation, which is slower but behaves correctly. */ Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined ? global.TYPED_ARRAY_SUPPORT : typedArraySupport() /* * Export kMaxLength after typed array support is determined. */ exports.kMaxLength = kMaxLength() function typedArraySupport () { try { var arr = new Uint8Array(1) arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }} return arr.foo() === 42 && // typed array instances can be augmented typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` } catch (e) { return false } } function kMaxLength () { return Buffer.TYPED_ARRAY_SUPPORT ? 0x7fffffff : 0x3fffffff } function createBuffer (that, length) { if (kMaxLength() < length) { throw new RangeError('Invalid typed array length') } if (Buffer.TYPED_ARRAY_SUPPORT) { // Return an augmented `Uint8Array` instance, for best performance that = new Uint8Array(length) that.__proto__ = Buffer.prototype } else { // Fallback: Return an object instance of the Buffer class if (that === null) { that = new Buffer(length) } that.length = length } return that } /** * 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) { if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) { return new Buffer(arg, encodingOrOffset, length) } // Common case. if (typeof arg === 'number') { if (typeof encodingOrOffset === 'string') { throw new Error( 'If encoding is specified then the first argument must be a string' ) } return allocUnsafe(this, arg) } return from(this, arg, encodingOrOffset, length) } Buffer.poolSize = 8192 // not used by this implementation // TODO: Legacy, not needed anymore. Remove in next major version. Buffer._augment = function (arr) { arr.__proto__ = Buffer.prototype return arr } function from (that, value, encodingOrOffset, length) { if (typeof value === 'number') { throw new TypeError('"value" argument must not be a number') } if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { return fromArrayBuffer(that, value, encodingOrOffset, length) } if (typeof value === 'string') { return fromString(that, value, encodingOrOffset) } return fromObject(that, 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(null, value, encodingOrOffset, length) } if (Buffer.TYPED_ARRAY_SUPPORT) { Buffer.prototype.__proto__ = Uint8Array.prototype Buffer.__proto__ = Uint8Array if (typeof Symbol !== 'undefined' && Symbol.species && Buffer[Symbol.species] === Buffer) { // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 Object.defineProperty(Buffer, Symbol.species, { value: null, configurable: true }) } } function assertSize (size) { if (typeof size !== 'number') { throw new TypeError('"size" argument must be a number') } else if (size < 0) { throw new RangeError('"size" argument must not be negative') } } function alloc (that, size, fill, encoding) { assertSize(size) if (size <= 0) { return createBuffer(that, 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(that, size).fill(fill, encoding) : createBuffer(that, size).fill(fill) } return createBuffer(that, size) } /** * Creates a new filled Buffer instance. * alloc(size[, fill[, encoding]]) **/ Buffer.alloc = function (size, fill, encoding) { return alloc(null, size, fill, encoding) } function allocUnsafe (that, size) { assertSize(size) that = createBuffer(that, size < 0 ? 0 : checked(size) | 0) if (!Buffer.TYPED_ARRAY_SUPPORT) { for (var i = 0; i < size; ++i) { that[i] = 0 } } return that } /** * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. * */ Buffer.allocUnsafe = function (size) { return allocUnsafe(null, size) } /** * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. */ Buffer.allocUnsafeSlow = function (size) { return allocUnsafe(null, size) } function fromString (that, string, encoding) { if (typeof encoding !== 'string' || encoding === '') { encoding = 'utf8' } if (!Buffer.isEncoding(encoding)) { throw new TypeError('"encoding" must be a valid string encoding') } var length = byteLength(string, encoding) | 0 that = createBuffer(that, length) var actual = that.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') that = that.slice(0, actual) } return that } function fromArrayLike (that, array) { var length = array.length < 0 ? 0 : checked(array.length) | 0 that = createBuffer(that, length) for (var i = 0; i < length; i += 1) { that[i] = array[i] & 255 } return that } function fromArrayBuffer (that, array, byteOffset, length) { array.byteLength // this throws if `array` is not a valid ArrayBuffer if (byteOffset < 0 || array.byteLength < byteOffset) { throw new RangeError('\'offset\' is out of bounds') } if (array.byteLength < byteOffset + (length || 0)) { throw new RangeError('\'length\' is out of bounds') } if (byteOffset === undefined && length === undefined) { array = new Uint8Array(array) } else if (length === undefined) { array = new Uint8Array(array, byteOffset) } else { array = new Uint8Array(array, byteOffset, length) } if (Buffer.TYPED_ARRAY_SUPPORT) { // Return an augmented `Uint8Array` instance, for best performance that = array that.__proto__ = Buffer.prototype } else { // Fallback: Return an object instance of the Buffer class that = fromArrayLike(that, array) } return that } function fromObject (that, obj) { if (Buffer.isBuffer(obj)) { var len = checked(obj.length) | 0 that = createBuffer(that, len) if (that.length === 0) { return that } obj.copy(that, 0, 0, len) return that } if (obj) { if ((typeof ArrayBuffer !== 'undefined' && obj.buffer instanceof ArrayBuffer) || 'length' in obj) { if (typeof obj.length !== 'number' || isnan(obj.length)) { return createBuffer(that, 0) } return fromArrayLike(that, obj) } if (obj.type === 'Buffer' && isArray(obj.data)) { return fromArrayLike(that, obj.data) } } throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') } function checked (length) { // Note: cannot use `length < kMaxLength()` here because that fails when // length is NaN (which is otherwise coerced to zero.) if (length >= kMaxLength()) { throw new RangeError('Attempt to allocate Buffer larger than maximum ' + 'size: 0x' + kMaxLength().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) } Buffer.compare = function compare (a, b) { if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { throw new TypeError('Arguments must be Buffers') } 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 (!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 (!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 (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { return string.byteLength } if (typeof string !== 'string') { string = '' + string } var len = string.length if (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': case undefined: 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 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 } } } // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect // Buffer instances. 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 | 0 if (length === 0) return '' if (arguments.length === 0) return utf8Slice(this, 0, length) return slowToString.apply(this, arguments) } 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 if (this.length > 0) { str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') if (this.length > max) str += ' ... ' } return '' } Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { if (!Buffer.isBuffer(target)) { throw new TypeError('Argument must be a Buffer') } 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 (isNaN(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 (Buffer.TYPED_ARRAY_SUPPORT && 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 } } // must be an even number of digits var strLen = string.length if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') if (length > strLen / 2) { length = strLen / 2 } for (var i = 0; i < length; ++i) { var parsed = parseInt(string.substr(i * 2, 2), 16) if (isNaN(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 } // legacy write(string, encoding, offset, length) - remove in v0.13 } 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 base64.fromByteArray(buf) } else { return base64.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 += toHex(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 if (Buffer.TYPED_ARRAY_SUPPORT) { newBuf = this.subarray(start, end) newBuf.__proto__ = Buffer.prototype } else { var sliceLen = end - start newBuf = new Buffer(sliceLen, undefined) for (var i = 0; i < sliceLen; ++i) { newBuf[i] = this[i + start] } } 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) { if (!noAssert) checkOffset(offset, 1, this.length) return this[offset] } Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) return this[offset] | (this[offset + 1] << 8) } Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) return (this[offset] << 8) | this[offset + 1] } Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { 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) { 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) { 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) { 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) { 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) { 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) { 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) { if (!noAssert) checkOffset(offset, 4, this.length) return ieee754.read(this, offset, true, 23, 4) } Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return ieee754.read(this, offset, false, 23, 4) } Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { if (!noAssert) checkOffset(offset, 8, this.length) return ieee754.read(this, offset, true, 52, 8) } Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { 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) if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) this[offset] = (value & 0xff) return offset + 1 } function objectWriteUInt16 (buf, value, offset, littleEndian) { if (value < 0) value = 0xffff + value + 1 for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> (littleEndian ? i : 1 - i) * 8 } } Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) } else { objectWriteUInt16(this, value, offset, true) } 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) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 8) this[offset + 1] = (value & 0xff) } else { objectWriteUInt16(this, value, offset, false) } return offset + 2 } function objectWriteUInt32 (buf, value, offset, littleEndian) { if (value < 0) value = 0xffffffff + value + 1 for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff } } Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset + 3] = (value >>> 24) this[offset + 2] = (value >>> 16) this[offset + 1] = (value >>> 8) this[offset] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, true) } 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) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) this[offset + 3] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, false) } 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 (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) 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) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) } else { objectWriteUInt16(this, value, offset, true) } 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) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 8) this[offset + 1] = (value & 0xff) } else { objectWriteUInt16(this, value, offset, false) } 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) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) this[offset + 2] = (value >>> 16) this[offset + 3] = (value >>> 24) } else { objectWriteUInt32(this, value, offset, true) } 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 if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) this[offset + 3] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, false) } 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) { if (!noAssert) { checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) } 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) { if (!noAssert) { checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) } 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 (!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('sourceStart out of bounds') 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 var i if (this === target && start < targetStart && targetStart < end) { // descending copy from end for (i = len - 1; i >= 0; --i) { target[i + targetStart] = this[i + start] } } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { // ascending copy from start for (i = 0; i < len; ++i) { target[i + targetStart] = this[i + start] } } else { Uint8Array.prototype.set.call( target, this.subarray(start, start + len), 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 (val.length === 1) { var code = val.charCodeAt(0) if (code < 256) { val = code } } 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) } } else if (typeof val === 'number') { val = val & 255 } // 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 : utf8ToBytes(new Buffer(val, encoding).toString()) var len = bytes.length 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 strips out invalid characters like \n and \t from the string, base64-js does not str = stringtrim(str).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 stringtrim (str) { if (str.trim) return str.trim() return str.replace(/^\s+|\s+$/g, '') } function toHex (n) { if (n < 16) return '0' + n.toString(16) return n.toString(16) } 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 base64.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 } function isnan (val) { return val !== val // eslint-disable-line no-self-compare } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) /***/ }), /***/ "./node_modules/core-js/es/array/find.js": /*!***********************************************!*\ !*** ./node_modules/core-js/es/array/find.js ***! \***********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(/*! ../../modules/es.array.find */ "./node_modules/core-js/modules/es.array.find.js"); var entryUnbind = __webpack_require__(/*! ../../internals/entry-unbind */ "./node_modules/core-js/internals/entry-unbind.js"); module.exports = entryUnbind('Array', 'find'); /***/ }), /***/ "./node_modules/core-js/es/array/is-array.js": /*!***************************************************!*\ !*** ./node_modules/core-js/es/array/is-array.js ***! \***************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(/*! ../../modules/es.array.is-array */ "./node_modules/core-js/modules/es.array.is-array.js"); var path = __webpack_require__(/*! ../../internals/path */ "./node_modules/core-js/internals/path.js"); module.exports = path.Array.isArray; /***/ }), /***/ "./node_modules/core-js/es/array/some.js": /*!***********************************************!*\ !*** ./node_modules/core-js/es/array/some.js ***! \***********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(/*! ../../modules/es.array.some */ "./node_modules/core-js/modules/es.array.some.js"); var entryUnbind = __webpack_require__(/*! ../../internals/entry-unbind */ "./node_modules/core-js/internals/entry-unbind.js"); module.exports = entryUnbind('Array', 'some'); /***/ }), /***/ "./node_modules/core-js/es/array/splice.js": /*!*************************************************!*\ !*** ./node_modules/core-js/es/array/splice.js ***! \*************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(/*! ../../modules/es.array.splice */ "./node_modules/core-js/modules/es.array.splice.js"); var entryUnbind = __webpack_require__(/*! ../../internals/entry-unbind */ "./node_modules/core-js/internals/entry-unbind.js"); module.exports = entryUnbind('Array', 'splice'); /***/ }), /***/ "./node_modules/core-js/es/function/bind.js": /*!**************************************************!*\ !*** ./node_modules/core-js/es/function/bind.js ***! \**************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(/*! ../../modules/es.function.bind */ "./node_modules/core-js/modules/es.function.bind.js"); var entryUnbind = __webpack_require__(/*! ../../internals/entry-unbind */ "./node_modules/core-js/internals/entry-unbind.js"); module.exports = entryUnbind('Function', 'bind'); /***/ }), /***/ "./node_modules/core-js/es/object/assign.js": /*!**************************************************!*\ !*** ./node_modules/core-js/es/object/assign.js ***! \**************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(/*! ../../modules/es.object.assign */ "./node_modules/core-js/modules/es.object.assign.js"); var path = __webpack_require__(/*! ../../internals/path */ "./node_modules/core-js/internals/path.js"); module.exports = path.Object.assign; /***/ }), /***/ "./node_modules/core-js/es/promise/index.js": /*!**************************************************!*\ !*** ./node_modules/core-js/es/promise/index.js ***! \**************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(/*! ../../modules/es.aggregate-error */ "./node_modules/core-js/modules/es.aggregate-error.js"); __webpack_require__(/*! ../../modules/es.object.to-string */ "./node_modules/core-js/modules/es.object.to-string.js"); __webpack_require__(/*! ../../modules/es.promise */ "./node_modules/core-js/modules/es.promise.js"); __webpack_require__(/*! ../../modules/es.promise.all-settled */ "./node_modules/core-js/modules/es.promise.all-settled.js"); __webpack_require__(/*! ../../modules/es.promise.any */ "./node_modules/core-js/modules/es.promise.any.js"); __webpack_require__(/*! ../../modules/es.promise.finally */ "./node_modules/core-js/modules/es.promise.finally.js"); __webpack_require__(/*! ../../modules/es.string.iterator */ "./node_modules/core-js/modules/es.string.iterator.js"); __webpack_require__(/*! ../../modules/web.dom-collections.iterator */ "./node_modules/core-js/modules/web.dom-collections.iterator.js"); var path = __webpack_require__(/*! ../../internals/path */ "./node_modules/core-js/internals/path.js"); module.exports = path.Promise; /***/ }), /***/ "./node_modules/core-js/features/array/find.js": /*!*****************************************************!*\ !*** ./node_modules/core-js/features/array/find.js ***! \*****************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var parent = __webpack_require__(/*! ../../es/array/find */ "./node_modules/core-js/es/array/find.js"); module.exports = parent; /***/ }), /***/ "./node_modules/core-js/features/array/is-array.js": /*!*********************************************************!*\ !*** ./node_modules/core-js/features/array/is-array.js ***! \*********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var parent = __webpack_require__(/*! ../../es/array/is-array */ "./node_modules/core-js/es/array/is-array.js"); module.exports = parent; /***/ }), /***/ "./node_modules/core-js/features/array/some.js": /*!*****************************************************!*\ !*** ./node_modules/core-js/features/array/some.js ***! \*****************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var parent = __webpack_require__(/*! ../../es/array/some */ "./node_modules/core-js/es/array/some.js"); module.exports = parent; /***/ }), /***/ "./node_modules/core-js/features/array/splice.js": /*!*******************************************************!*\ !*** ./node_modules/core-js/features/array/splice.js ***! \*******************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var parent = __webpack_require__(/*! ../../es/array/splice */ "./node_modules/core-js/es/array/splice.js"); module.exports = parent; /***/ }), /***/ "./node_modules/core-js/features/function/bind.js": /*!********************************************************!*\ !*** ./node_modules/core-js/features/function/bind.js ***! \********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var parent = __webpack_require__(/*! ../../es/function/bind */ "./node_modules/core-js/es/function/bind.js"); module.exports = parent; /***/ }), /***/ "./node_modules/core-js/features/object/assign.js": /*!********************************************************!*\ !*** ./node_modules/core-js/features/object/assign.js ***! \********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var parent = __webpack_require__(/*! ../../es/object/assign */ "./node_modules/core-js/es/object/assign.js"); module.exports = parent; /***/ }), /***/ "./node_modules/core-js/features/promise/index.js": /*!********************************************************!*\ !*** ./node_modules/core-js/features/promise/index.js ***! \********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var parent = __webpack_require__(/*! ../../es/promise */ "./node_modules/core-js/es/promise/index.js"); __webpack_require__(/*! ../../modules/esnext.aggregate-error */ "./node_modules/core-js/modules/esnext.aggregate-error.js"); // TODO: Remove from `core-js@4` __webpack_require__(/*! ../../modules/esnext.promise.all-settled */ "./node_modules/core-js/modules/esnext.promise.all-settled.js"); __webpack_require__(/*! ../../modules/esnext.promise.try */ "./node_modules/core-js/modules/esnext.promise.try.js"); __webpack_require__(/*! ../../modules/esnext.promise.any */ "./node_modules/core-js/modules/esnext.promise.any.js"); module.exports = parent; /***/ }), /***/ "./node_modules/core-js/internals/a-function.js": /*!******************************************************!*\ !*** ./node_modules/core-js/internals/a-function.js ***! \******************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = function (it) { if (typeof it != 'function') { throw TypeError(String(it) + ' is not a function'); } return it; }; /***/ }), /***/ "./node_modules/core-js/internals/a-possible-prototype.js": /*!****************************************************************!*\ !*** ./node_modules/core-js/internals/a-possible-prototype.js ***! \****************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); module.exports = function (it) { if (!isObject(it) && it !== null) { throw TypeError("Can't set " + String(it) + ' as a prototype'); } return it; }; /***/ }), /***/ "./node_modules/core-js/internals/add-to-unscopables.js": /*!**************************************************************!*\ !*** ./node_modules/core-js/internals/add-to-unscopables.js ***! \**************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js"); var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js"); var UNSCOPABLES = wellKnownSymbol('unscopables'); var ArrayPrototype = Array.prototype; // Array.prototype[@@unscopables] // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables if (ArrayPrototype[UNSCOPABLES] == undefined) { definePropertyModule.f(ArrayPrototype, UNSCOPABLES, { configurable: true, value: create(null) }); } // add a key to Array.prototype[@@unscopables] module.exports = function (key) { ArrayPrototype[UNSCOPABLES][key] = true; }; /***/ }), /***/ "./node_modules/core-js/internals/an-instance.js": /*!*******************************************************!*\ !*** ./node_modules/core-js/internals/an-instance.js ***! \*******************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = function (it, Constructor, name) { if (!(it instanceof Constructor)) { throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation'); } return it; }; /***/ }), /***/ "./node_modules/core-js/internals/an-object.js": /*!*****************************************************!*\ !*** ./node_modules/core-js/internals/an-object.js ***! \*****************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); module.exports = function (it) { if (!isObject(it)) { throw TypeError(String(it) + ' is not an object'); } return it; }; /***/ }), /***/ "./node_modules/core-js/internals/array-includes.js": /*!**********************************************************!*\ !*** ./node_modules/core-js/internals/array-includes.js ***! \**********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js"); var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js"); var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "./node_modules/core-js/internals/to-absolute-index.js"); // `Array.prototype.{ indexOf, includes }` methods implementation var createMethod = function (IS_INCLUDES) { return function ($this, el, fromIndex) { var O = toIndexedObject($this); var length = toLength(O.length); var index = toAbsoluteIndex(fromIndex, length); var value; // Array#includes uses SameValueZero equality algorithm // eslint-disable-next-line no-self-compare if (IS_INCLUDES && el != el) while (length > index) { value = O[index++]; // eslint-disable-next-line no-self-compare if (value != value) return true; // Array#indexOf ignores holes, Array#includes - not } else for (;length > index; index++) { if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; } return !IS_INCLUDES && -1; }; }; module.exports = { // `Array.prototype.includes` method // https://tc39.es/ecma262/#sec-array.prototype.includes includes: createMethod(true), // `Array.prototype.indexOf` method // https://tc39.es/ecma262/#sec-array.prototype.indexof indexOf: createMethod(false) }; /***/ }), /***/ "./node_modules/core-js/internals/array-iteration.js": /*!***********************************************************!*\ !*** ./node_modules/core-js/internals/array-iteration.js ***! \***********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var bind = __webpack_require__(/*! ../internals/function-bind-context */ "./node_modules/core-js/internals/function-bind-context.js"); var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/core-js/internals/indexed-object.js"); var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js"); var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js"); var arraySpeciesCreate = __webpack_require__(/*! ../internals/array-species-create */ "./node_modules/core-js/internals/array-species-create.js"); var push = [].push; // `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterOut }` methods implementation var createMethod = function (TYPE) { var IS_MAP = TYPE == 1; var IS_FILTER = TYPE == 2; var IS_SOME = TYPE == 3; var IS_EVERY = TYPE == 4; var IS_FIND_INDEX = TYPE == 6; var IS_FILTER_OUT = TYPE == 7; var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; return function ($this, callbackfn, that, specificCreate) { var O = toObject($this); var self = IndexedObject(O); var boundFunction = bind(callbackfn, that, 3); var length = toLength(self.length); var index = 0; var create = specificCreate || arraySpeciesCreate; var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_OUT ? create($this, 0) : undefined; var value, result; for (;length > index; index++) if (NO_HOLES || index in self) { value = self[index]; result = boundFunction(value, index, O); if (TYPE) { if (IS_MAP) target[index] = result; // map else if (result) switch (TYPE) { case 3: return true; // some case 5: return value; // find case 6: return index; // findIndex case 2: push.call(target, value); // filter } else switch (TYPE) { case 4: return false; // every case 7: push.call(target, value); // filterOut } } } return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target; }; }; module.exports = { // `Array.prototype.forEach` method // https://tc39.es/ecma262/#sec-array.prototype.foreach forEach: createMethod(0), // `Array.prototype.map` method // https://tc39.es/ecma262/#sec-array.prototype.map map: createMethod(1), // `Array.prototype.filter` method // https://tc39.es/ecma262/#sec-array.prototype.filter filter: createMethod(2), // `Array.prototype.some` method // https://tc39.es/ecma262/#sec-array.prototype.some some: createMethod(3), // `Array.prototype.every` method // https://tc39.es/ecma262/#sec-array.prototype.every every: createMethod(4), // `Array.prototype.find` method // https://tc39.es/ecma262/#sec-array.prototype.find find: createMethod(5), // `Array.prototype.findIndex` method // https://tc39.es/ecma262/#sec-array.prototype.findIndex findIndex: createMethod(6), // `Array.prototype.filterOut` method // https://github.com/tc39/proposal-array-filtering filterOut: createMethod(7) }; /***/ }), /***/ "./node_modules/core-js/internals/array-method-has-species-support.js": /*!****************************************************************************!*\ !*** ./node_modules/core-js/internals/array-method-has-species-support.js ***! \****************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "./node_modules/core-js/internals/engine-v8-version.js"); var SPECIES = wellKnownSymbol('species'); module.exports = function (METHOD_NAME) { // We can't use this feature detection in V8 since it causes // deoptimization and serious performance degradation // https://github.com/zloirock/core-js/issues/677 return V8_VERSION >= 51 || !fails(function () { var array = []; var constructor = array.constructor = {}; constructor[SPECIES] = function () { return { foo: 1 }; }; return array[METHOD_NAME](Boolean).foo !== 1; }); }; /***/ }), /***/ "./node_modules/core-js/internals/array-method-is-strict.js": /*!******************************************************************!*\ !*** ./node_modules/core-js/internals/array-method-is-strict.js ***! \******************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); module.exports = function (METHOD_NAME, argument) { var method = [][METHOD_NAME]; return !!method && fails(function () { // eslint-disable-next-line no-useless-call,no-throw-literal method.call(null, argument || function () { throw 1; }, 1); }); }; /***/ }), /***/ "./node_modules/core-js/internals/array-method-uses-to-length.js": /*!***********************************************************************!*\ !*** ./node_modules/core-js/internals/array-method-uses-to-length.js ***! \***********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js"); var defineProperty = Object.defineProperty; var cache = {}; var thrower = function (it) { throw it; }; module.exports = function (METHOD_NAME, options) { if (has(cache, METHOD_NAME)) return cache[METHOD_NAME]; if (!options) options = {}; var method = [][METHOD_NAME]; var ACCESSORS = has(options, 'ACCESSORS') ? options.ACCESSORS : false; var argument0 = has(options, 0) ? options[0] : thrower; var argument1 = has(options, 1) ? options[1] : undefined; return cache[METHOD_NAME] = !!method && !fails(function () { if (ACCESSORS && !DESCRIPTORS) return true; var O = { length: -1 }; if (ACCESSORS) defineProperty(O, 1, { enumerable: true, get: thrower }); else O[1] = 1; method.call(O, argument0, argument1); }); }; /***/ }), /***/ "./node_modules/core-js/internals/array-species-create.js": /*!****************************************************************!*\ !*** ./node_modules/core-js/internals/array-species-create.js ***! \****************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/core-js/internals/is-array.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var SPECIES = wellKnownSymbol('species'); // `ArraySpeciesCreate` abstract operation // https://tc39.es/ecma262/#sec-arrayspeciescreate module.exports = function (originalArray, length) { var C; if (isArray(originalArray)) { C = originalArray.constructor; // cross-realm fallback if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined; else if (isObject(C)) { C = C[SPECIES]; if (C === null) C = undefined; } } return new (C === undefined ? Array : C)(length === 0 ? 0 : length); }; /***/ }), /***/ "./node_modules/core-js/internals/check-correctness-of-iteration.js": /*!**************************************************************************!*\ !*** ./node_modules/core-js/internals/check-correctness-of-iteration.js ***! \**************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var ITERATOR = wellKnownSymbol('iterator'); var SAFE_CLOSING = false; try { var called = 0; var iteratorWithReturn = { next: function () { return { done: !!called++ }; }, 'return': function () { SAFE_CLOSING = true; } }; iteratorWithReturn[ITERATOR] = function () { return this; }; // eslint-disable-next-line no-throw-literal Array.from(iteratorWithReturn, function () { throw 2; }); } catch (error) { /* empty */ } module.exports = function (exec, SKIP_CLOSING) { if (!SKIP_CLOSING && !SAFE_CLOSING) return false; var ITERATION_SUPPORT = false; try { var object = {}; object[ITERATOR] = function () { return { next: function () { return { done: ITERATION_SUPPORT = true }; } }; }; exec(object); } catch (error) { /* empty */ } return ITERATION_SUPPORT; }; /***/ }), /***/ "./node_modules/core-js/internals/classof-raw.js": /*!*******************************************************!*\ !*** ./node_modules/core-js/internals/classof-raw.js ***! \*******************************************************/ /*! no static exports found */ /***/ (function(module, exports) { var toString = {}.toString; module.exports = function (it) { return toString.call(it).slice(8, -1); }; /***/ }), /***/ "./node_modules/core-js/internals/classof.js": /*!***************************************************!*\ !*** ./node_modules/core-js/internals/classof.js ***! \***************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "./node_modules/core-js/internals/to-string-tag-support.js"); var classofRaw = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var TO_STRING_TAG = wellKnownSymbol('toStringTag'); // ES3 wrong here var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments'; // fallback for IE11 Script Access Denied error var tryGet = function (it, key) { try { return it[key]; } catch (error) { /* empty */ } }; // getting tag from ES6+ `Object.prototype.toString` module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) { var O, tag, result; return it === undefined ? 'Undefined' : it === null ? 'Null' // @@toStringTag case : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag // builtinTag case : CORRECT_ARGUMENTS ? classofRaw(O) // ES3 arguments fallback : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result; }; /***/ }), /***/ "./node_modules/core-js/internals/copy-constructor-properties.js": /*!***********************************************************************!*\ !*** ./node_modules/core-js/internals/copy-constructor-properties.js ***! \***********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js"); var ownKeys = __webpack_require__(/*! ../internals/own-keys */ "./node_modules/core-js/internals/own-keys.js"); var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js"); var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js"); module.exports = function (target, source) { var keys = ownKeys(source); var defineProperty = definePropertyModule.f; var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; for (var i = 0; i < keys.length; i++) { var key = keys[i]; if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key)); } }; /***/ }), /***/ "./node_modules/core-js/internals/correct-prototype-getter.js": /*!********************************************************************!*\ !*** ./node_modules/core-js/internals/correct-prototype-getter.js ***! \********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); module.exports = !fails(function () { function F() { /* empty */ } F.prototype.constructor = null; return Object.getPrototypeOf(new F()) !== F.prototype; }); /***/ }), /***/ "./node_modules/core-js/internals/create-iterator-constructor.js": /*!***********************************************************************!*\ !*** ./node_modules/core-js/internals/create-iterator-constructor.js ***! \***********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var IteratorPrototype = __webpack_require__(/*! ../internals/iterators-core */ "./node_modules/core-js/internals/iterators-core.js").IteratorPrototype; var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js"); var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js"); var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js"); var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js"); var returnThis = function () { return this; }; module.exports = function (IteratorConstructor, NAME, next) { var TO_STRING_TAG = NAME + ' Iterator'; IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) }); setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true); Iterators[TO_STRING_TAG] = returnThis; return IteratorConstructor; }; /***/ }), /***/ "./node_modules/core-js/internals/create-non-enumerable-property.js": /*!**************************************************************************!*\ !*** ./node_modules/core-js/internals/create-non-enumerable-property.js ***! \**************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js"); var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js"); module.exports = DESCRIPTORS ? function (object, key, value) { return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); } : function (object, key, value) { object[key] = value; return object; }; /***/ }), /***/ "./node_modules/core-js/internals/create-property-descriptor.js": /*!**********************************************************************!*\ !*** ./node_modules/core-js/internals/create-property-descriptor.js ***! \**********************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = function (bitmap, value) { return { enumerable: !(bitmap & 1), configurable: !(bitmap & 2), writable: !(bitmap & 4), value: value }; }; /***/ }), /***/ "./node_modules/core-js/internals/create-property.js": /*!***********************************************************!*\ !*** ./node_modules/core-js/internals/create-property.js ***! \***********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/core-js/internals/to-primitive.js"); var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js"); var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js"); module.exports = function (object, key, value) { var propertyKey = toPrimitive(key); if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value)); else object[propertyKey] = value; }; /***/ }), /***/ "./node_modules/core-js/internals/define-iterator.js": /*!***********************************************************!*\ !*** ./node_modules/core-js/internals/define-iterator.js ***! \***********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var createIteratorConstructor = __webpack_require__(/*! ../internals/create-iterator-constructor */ "./node_modules/core-js/internals/create-iterator-constructor.js"); var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js"); var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/core-js/internals/object-set-prototype-of.js"); var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js"); var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js"); var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js"); var IteratorsCore = __webpack_require__(/*! ../internals/iterators-core */ "./node_modules/core-js/internals/iterators-core.js"); var IteratorPrototype = IteratorsCore.IteratorPrototype; var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS; var ITERATOR = wellKnownSymbol('iterator'); var KEYS = 'keys'; var VALUES = 'values'; var ENTRIES = 'entries'; var returnThis = function () { return this; }; module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) { createIteratorConstructor(IteratorConstructor, NAME, next); var getIterationMethod = function (KIND) { if (KIND === DEFAULT && defaultIterator) return defaultIterator; if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND]; switch (KIND) { case KEYS: return function keys() { return new IteratorConstructor(this, KIND); }; case VALUES: return function values() { return new IteratorConstructor(this, KIND); }; case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); }; } return function () { return new IteratorConstructor(this); }; }; var TO_STRING_TAG = NAME + ' Iterator'; var INCORRECT_VALUES_NAME = false; var IterablePrototype = Iterable.prototype; var nativeIterator = IterablePrototype[ITERATOR] || IterablePrototype['@@iterator'] || DEFAULT && IterablePrototype[DEFAULT]; var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT); var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator; var CurrentIteratorPrototype, methods, KEY; // fix native if (anyNativeIterator) { CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable())); if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) { if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) { if (setPrototypeOf) { setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype); } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') { createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR, returnThis); } } // Set @@toStringTag to native iterators setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true); if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis; } } // fix Array#{values, @@iterator}.name in V8 / FF if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) { INCORRECT_VALUES_NAME = true; defaultIterator = function values() { return nativeIterator.call(this); }; } // define iterator if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) { createNonEnumerableProperty(IterablePrototype, ITERATOR, defaultIterator); } Iterators[NAME] = defaultIterator; // export additional methods if (DEFAULT) { methods = { values: getIterationMethod(VALUES), keys: IS_SET ? defaultIterator : getIterationMethod(KEYS), entries: getIterationMethod(ENTRIES) }; if (FORCED) for (KEY in methods) { if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) { redefine(IterablePrototype, KEY, methods[KEY]); } } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods); } return methods; }; /***/ }), /***/ "./node_modules/core-js/internals/descriptors.js": /*!*******************************************************!*\ !*** ./node_modules/core-js/internals/descriptors.js ***! \*******************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); // Detect IE8's incomplete defineProperty implementation module.exports = !fails(function () { return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7; }); /***/ }), /***/ "./node_modules/core-js/internals/document-create-element.js": /*!*******************************************************************!*\ !*** ./node_modules/core-js/internals/document-create-element.js ***! \*******************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); var document = global.document; // typeof document.createElement is 'object' in old IE var EXISTS = isObject(document) && isObject(document.createElement); module.exports = function (it) { return EXISTS ? document.createElement(it) : {}; }; /***/ }), /***/ "./node_modules/core-js/internals/dom-iterables.js": /*!*********************************************************!*\ !*** ./node_modules/core-js/internals/dom-iterables.js ***! \*********************************************************/ /*! no static exports found */ /***/ (function(module, exports) { // iterable DOM collections // flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods module.exports = { CSSRuleList: 0, CSSStyleDeclaration: 0, CSSValueList: 0, ClientRectList: 0, DOMRectList: 0, DOMStringList: 0, DOMTokenList: 1, DataTransferItemList: 0, FileList: 0, HTMLAllCollection: 0, HTMLCollection: 0, HTMLFormElement: 0, HTMLSelectElement: 0, MediaList: 0, MimeTypeArray: 0, NamedNodeMap: 0, NodeList: 1, PaintRequestList: 0, Plugin: 0, PluginArray: 0, SVGLengthList: 0, SVGNumberList: 0, SVGPathSegList: 0, SVGPointList: 0, SVGStringList: 0, SVGTransformList: 0, SourceBufferList: 0, StyleSheetList: 0, TextTrackCueList: 0, TextTrackList: 0, TouchList: 0 }; /***/ }), /***/ "./node_modules/core-js/internals/engine-is-ios.js": /*!*********************************************************!*\ !*** ./node_modules/core-js/internals/engine-is-ios.js ***! \*********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js/internals/engine-user-agent.js"); module.exports = /(iphone|ipod|ipad).*applewebkit/i.test(userAgent); /***/ }), /***/ "./node_modules/core-js/internals/engine-is-node.js": /*!**********************************************************!*\ !*** ./node_modules/core-js/internals/engine-is-node.js ***! \**********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js"); var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); module.exports = classof(global.process) == 'process'; /***/ }), /***/ "./node_modules/core-js/internals/engine-is-webos-webkit.js": /*!******************************************************************!*\ !*** ./node_modules/core-js/internals/engine-is-webos-webkit.js ***! \******************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js/internals/engine-user-agent.js"); module.exports = /web0s(?!.*chrome)/i.test(userAgent); /***/ }), /***/ "./node_modules/core-js/internals/engine-user-agent.js": /*!*************************************************************!*\ !*** ./node_modules/core-js/internals/engine-user-agent.js ***! \*************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); module.exports = getBuiltIn('navigator', 'userAgent') || ''; /***/ }), /***/ "./node_modules/core-js/internals/engine-v8-version.js": /*!*************************************************************!*\ !*** ./node_modules/core-js/internals/engine-v8-version.js ***! \*************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js/internals/engine-user-agent.js"); var process = global.process; var versions = process && process.versions; var v8 = versions && versions.v8; var match, version; if (v8) { match = v8.split('.'); version = match[0] + match[1]; } else if (userAgent) { match = userAgent.match(/Edge\/(\d+)/); if (!match || match[1] >= 74) { match = userAgent.match(/Chrome\/(\d+)/); if (match) version = match[1]; } } module.exports = version && +version; /***/ }), /***/ "./node_modules/core-js/internals/entry-unbind.js": /*!********************************************************!*\ !*** ./node_modules/core-js/internals/entry-unbind.js ***! \********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var bind = __webpack_require__(/*! ../internals/function-bind-context */ "./node_modules/core-js/internals/function-bind-context.js"); var call = Function.call; module.exports = function (CONSTRUCTOR, METHOD, length) { return bind(call, global[CONSTRUCTOR].prototype[METHOD], length); }; /***/ }), /***/ "./node_modules/core-js/internals/enum-bug-keys.js": /*!*********************************************************!*\ !*** ./node_modules/core-js/internals/enum-bug-keys.js ***! \*********************************************************/ /*! no static exports found */ /***/ (function(module, exports) { // IE8- don't enum bug keys module.exports = [ 'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'valueOf' ]; /***/ }), /***/ "./node_modules/core-js/internals/export.js": /*!**************************************************!*\ !*** ./node_modules/core-js/internals/export.js ***! \**************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js").f; var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js"); var setGlobal = __webpack_require__(/*! ../internals/set-global */ "./node_modules/core-js/internals/set-global.js"); var copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ "./node_modules/core-js/internals/copy-constructor-properties.js"); var isForced = __webpack_require__(/*! ../internals/is-forced */ "./node_modules/core-js/internals/is-forced.js"); /* options.target - name of the target object options.global - target is the global object options.stat - export as static methods of target options.proto - export as prototype methods of target options.real - real prototype method for the `pure` version options.forced - export even if the native feature is available options.bind - bind methods to the target, required for the `pure` version options.wrap - wrap constructors to preventing global pollution, required for the `pure` version options.unsafe - use the simple assignment of property instead of delete + defineProperty options.sham - add a flag to not completely full polyfills options.enumerable - export as enumerable property options.noTargetGet - prevent calling a getter on target */ module.exports = function (options, source) { var TARGET = options.target; var GLOBAL = options.global; var STATIC = options.stat; var FORCED, target, key, targetProperty, sourceProperty, descriptor; if (GLOBAL) { target = global; } else if (STATIC) { target = global[TARGET] || setGlobal(TARGET, {}); } else { target = (global[TARGET] || {}).prototype; } if (target) for (key in source) { sourceProperty = source[key]; if (options.noTargetGet) { descriptor = getOwnPropertyDescriptor(target, key); targetProperty = descriptor && descriptor.value; } else targetProperty = target[key]; FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); // contained in target if (!FORCED && targetProperty !== undefined) { if (typeof sourceProperty === typeof targetProperty) continue; copyConstructorProperties(sourceProperty, targetProperty); } // add a flag to not completely full polyfills if (options.sham || (targetProperty && targetProperty.sham)) { createNonEnumerableProperty(sourceProperty, 'sham', true); } // extend global redefine(target, key, sourceProperty, options); } }; /***/ }), /***/ "./node_modules/core-js/internals/fails.js": /*!*************************************************!*\ !*** ./node_modules/core-js/internals/fails.js ***! \*************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = function (exec) { try { return !!exec(); } catch (error) { return true; } }; /***/ }), /***/ "./node_modules/core-js/internals/function-bind-context.js": /*!*****************************************************************!*\ !*** ./node_modules/core-js/internals/function-bind-context.js ***! \*****************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/core-js/internals/a-function.js"); // optional / simple context binding module.exports = function (fn, that, length) { aFunction(fn); if (that === undefined) return fn; switch (length) { case 0: return function () { return fn.call(that); }; case 1: return function (a) { return fn.call(that, a); }; case 2: return function (a, b) { return fn.call(that, a, b); }; case 3: return function (a, b, c) { return fn.call(that, a, b, c); }; } return function (/* ...args */) { return fn.apply(that, arguments); }; }; /***/ }), /***/ "./node_modules/core-js/internals/function-bind.js": /*!*********************************************************!*\ !*** ./node_modules/core-js/internals/function-bind.js ***! \*********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/core-js/internals/a-function.js"); var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); var slice = [].slice; var factories = {}; var construct = function (C, argsLength, args) { if (!(argsLength in factories)) { for (var list = [], i = 0; i < argsLength; i++) list[i] = 'a[' + i + ']'; // eslint-disable-next-line no-new-func factories[argsLength] = Function('C,a', 'return new C(' + list.join(',') + ')'); } return factories[argsLength](C, args); }; // `Function.prototype.bind` method implementation // https://tc39.es/ecma262/#sec-function.prototype.bind module.exports = Function.bind || function bind(that /* , ...args */) { var fn = aFunction(this); var partArgs = slice.call(arguments, 1); var boundFunction = function bound(/* args... */) { var args = partArgs.concat(slice.call(arguments)); return this instanceof boundFunction ? construct(fn, args.length, args) : fn.apply(that, args); }; if (isObject(fn.prototype)) boundFunction.prototype = fn.prototype; return boundFunction; }; /***/ }), /***/ "./node_modules/core-js/internals/get-built-in.js": /*!********************************************************!*\ !*** ./node_modules/core-js/internals/get-built-in.js ***! \********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var path = __webpack_require__(/*! ../internals/path */ "./node_modules/core-js/internals/path.js"); var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var aFunction = function (variable) { return typeof variable == 'function' ? variable : undefined; }; 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]; }; /***/ }), /***/ "./node_modules/core-js/internals/get-iterator-method.js": /*!***************************************************************!*\ !*** ./node_modules/core-js/internals/get-iterator-method.js ***! \***************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var classof = __webpack_require__(/*! ../internals/classof */ "./node_modules/core-js/internals/classof.js"); var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var ITERATOR = wellKnownSymbol('iterator'); module.exports = function (it) { if (it != undefined) return it[ITERATOR] || it['@@iterator'] || Iterators[classof(it)]; }; /***/ }), /***/ "./node_modules/core-js/internals/global.js": /*!**************************************************!*\ !*** ./node_modules/core-js/internals/global.js ***! \**************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(global) {var check = function (it) { return it && it.Math == Math && it; }; // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 module.exports = // eslint-disable-next-line no-undef check(typeof globalThis == 'object' && globalThis) || check(typeof window == 'object' && window) || check(typeof self == 'object' && self) || check(typeof global == 'object' && global) || // eslint-disable-next-line no-new-func (function () { return this; })() || Function('return this')(); /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) /***/ }), /***/ "./node_modules/core-js/internals/has.js": /*!***********************************************!*\ !*** ./node_modules/core-js/internals/has.js ***! \***********************************************/ /*! no static exports found */ /***/ (function(module, exports) { var hasOwnProperty = {}.hasOwnProperty; module.exports = function (it, key) { return hasOwnProperty.call(it, key); }; /***/ }), /***/ "./node_modules/core-js/internals/hidden-keys.js": /*!*******************************************************!*\ !*** ./node_modules/core-js/internals/hidden-keys.js ***! \*******************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = {}; /***/ }), /***/ "./node_modules/core-js/internals/host-report-errors.js": /*!**************************************************************!*\ !*** ./node_modules/core-js/internals/host-report-errors.js ***! \**************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); module.exports = function (a, b) { var console = global.console; if (console && console.error) { arguments.length === 1 ? console.error(a) : console.error(a, b); } }; /***/ }), /***/ "./node_modules/core-js/internals/html.js": /*!************************************************!*\ !*** ./node_modules/core-js/internals/html.js ***! \************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); module.exports = getBuiltIn('document', 'documentElement'); /***/ }), /***/ "./node_modules/core-js/internals/ie8-dom-define.js": /*!**********************************************************!*\ !*** ./node_modules/core-js/internals/ie8-dom-define.js ***! \**********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var createElement = __webpack_require__(/*! ../internals/document-create-element */ "./node_modules/core-js/internals/document-create-element.js"); // Thank's IE8 for his funny defineProperty module.exports = !DESCRIPTORS && !fails(function () { return Object.defineProperty(createElement('div'), 'a', { get: function () { return 7; } }).a != 7; }); /***/ }), /***/ "./node_modules/core-js/internals/indexed-object.js": /*!**********************************************************!*\ !*** ./node_modules/core-js/internals/indexed-object.js ***! \**********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js"); var split = ''.split; // fallback for non-array-like ES3 and non-enumerable old V8 strings module.exports = fails(function () { // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 // eslint-disable-next-line no-prototype-builtins return !Object('z').propertyIsEnumerable(0); }) ? function (it) { return classof(it) == 'String' ? split.call(it, '') : Object(it); } : Object; /***/ }), /***/ "./node_modules/core-js/internals/inspect-source.js": /*!**********************************************************!*\ !*** ./node_modules/core-js/internals/inspect-source.js ***! \**********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var store = __webpack_require__(/*! ../internals/shared-store */ "./node_modules/core-js/internals/shared-store.js"); var functionToString = Function.toString; // this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper if (typeof store.inspectSource != 'function') { store.inspectSource = function (it) { return functionToString.call(it); }; } module.exports = store.inspectSource; /***/ }), /***/ "./node_modules/core-js/internals/internal-state.js": /*!**********************************************************!*\ !*** ./node_modules/core-js/internals/internal-state.js ***! \**********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var NATIVE_WEAK_MAP = __webpack_require__(/*! ../internals/native-weak-map */ "./node_modules/core-js/internals/native-weak-map.js"); var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); var objectHas = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js"); var shared = __webpack_require__(/*! ../internals/shared-store */ "./node_modules/core-js/internals/shared-store.js"); var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/core-js/internals/shared-key.js"); var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js/internals/hidden-keys.js"); var WeakMap = global.WeakMap; var set, get, has; var enforce = function (it) { return has(it) ? get(it) : set(it, {}); }; var getterFor = function (TYPE) { return function (it) { var state; if (!isObject(it) || (state = get(it)).type !== TYPE) { throw TypeError('Incompatible receiver, ' + TYPE + ' required'); } return state; }; }; if (NATIVE_WEAK_MAP) { var store = shared.state || (shared.state = new WeakMap()); var wmget = store.get; var wmhas = store.has; var wmset = store.set; set = function (it, metadata) { metadata.facade = it; wmset.call(store, it, metadata); return metadata; }; get = function (it) { return wmget.call(store, it) || {}; }; has = function (it) { return wmhas.call(store, it); }; } else { var STATE = sharedKey('state'); hiddenKeys[STATE] = true; set = function (it, metadata) { metadata.facade = it; createNonEnumerableProperty(it, STATE, metadata); return metadata; }; get = function (it) { return objectHas(it, STATE) ? it[STATE] : {}; }; has = function (it) { return objectHas(it, STATE); }; } module.exports = { set: set, get: get, has: has, enforce: enforce, getterFor: getterFor }; /***/ }), /***/ "./node_modules/core-js/internals/is-array-iterator-method.js": /*!********************************************************************!*\ !*** ./node_modules/core-js/internals/is-array-iterator-method.js ***! \********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js"); var ITERATOR = wellKnownSymbol('iterator'); var ArrayPrototype = Array.prototype; // check on default Array iterator module.exports = function (it) { return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it); }; /***/ }), /***/ "./node_modules/core-js/internals/is-array.js": /*!****************************************************!*\ !*** ./node_modules/core-js/internals/is-array.js ***! \****************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js"); // `IsArray` abstract operation // https://tc39.es/ecma262/#sec-isarray module.exports = Array.isArray || function isArray(arg) { return classof(arg) == 'Array'; }; /***/ }), /***/ "./node_modules/core-js/internals/is-forced.js": /*!*****************************************************!*\ !*** ./node_modules/core-js/internals/is-forced.js ***! \*****************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var replacement = /#|\.prototype\./; var isForced = function (feature, detection) { var value = data[normalize(feature)]; return value == POLYFILL ? true : value == NATIVE ? false : typeof detection == 'function' ? fails(detection) : !!detection; }; var normalize = isForced.normalize = function (string) { return String(string).replace(replacement, '.').toLowerCase(); }; var data = isForced.data = {}; var NATIVE = isForced.NATIVE = 'N'; var POLYFILL = isForced.POLYFILL = 'P'; module.exports = isForced; /***/ }), /***/ "./node_modules/core-js/internals/is-object.js": /*!*****************************************************!*\ !*** ./node_modules/core-js/internals/is-object.js ***! \*****************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = function (it) { return typeof it === 'object' ? it !== null : typeof it === 'function'; }; /***/ }), /***/ "./node_modules/core-js/internals/is-pure.js": /*!***************************************************!*\ !*** ./node_modules/core-js/internals/is-pure.js ***! \***************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = false; /***/ }), /***/ "./node_modules/core-js/internals/iterate.js": /*!***************************************************!*\ !*** ./node_modules/core-js/internals/iterate.js ***! \***************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); var isArrayIteratorMethod = __webpack_require__(/*! ../internals/is-array-iterator-method */ "./node_modules/core-js/internals/is-array-iterator-method.js"); var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js"); var bind = __webpack_require__(/*! ../internals/function-bind-context */ "./node_modules/core-js/internals/function-bind-context.js"); var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "./node_modules/core-js/internals/get-iterator-method.js"); var iteratorClose = __webpack_require__(/*! ../internals/iterator-close */ "./node_modules/core-js/internals/iterator-close.js"); var Result = function (stopped, result) { this.stopped = stopped; this.result = result; }; module.exports = function (iterable, unboundFunction, options) { var that = options && options.that; var AS_ENTRIES = !!(options && options.AS_ENTRIES); var IS_ITERATOR = !!(options && options.IS_ITERATOR); var INTERRUPTED = !!(options && options.INTERRUPTED); var fn = bind(unboundFunction, that, 1 + AS_ENTRIES + INTERRUPTED); var iterator, iterFn, index, length, result, next, step; var stop = function (condition) { if (iterator) iteratorClose(iterator); return new Result(true, condition); }; var callFn = function (value) { if (AS_ENTRIES) { anObject(value); return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]); } return INTERRUPTED ? fn(value, stop) : fn(value); }; if (IS_ITERATOR) { iterator = iterable; } else { iterFn = getIteratorMethod(iterable); if (typeof iterFn != 'function') throw TypeError('Target is not iterable'); // optimisation for array iterators if (isArrayIteratorMethod(iterFn)) { for (index = 0, length = toLength(iterable.length); length > index; index++) { result = callFn(iterable[index]); if (result && result instanceof Result) return result; } return new Result(false); } iterator = iterFn.call(iterable); } next = iterator.next; while (!(step = next.call(iterator)).done) { try { result = callFn(step.value); } catch (error) { iteratorClose(iterator); throw error; } if (typeof result == 'object' && result && result instanceof Result) return result; } return new Result(false); }; /***/ }), /***/ "./node_modules/core-js/internals/iterator-close.js": /*!**********************************************************!*\ !*** ./node_modules/core-js/internals/iterator-close.js ***! \**********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); module.exports = function (iterator) { var returnMethod = iterator['return']; if (returnMethod !== undefined) { return anObject(returnMethod.call(iterator)).value; } }; /***/ }), /***/ "./node_modules/core-js/internals/iterators-core.js": /*!**********************************************************!*\ !*** ./node_modules/core-js/internals/iterators-core.js ***! \**********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js"); var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js"); var ITERATOR = wellKnownSymbol('iterator'); var BUGGY_SAFARI_ITERATORS = false; var returnThis = function () { return this; }; // `%IteratorPrototype%` object // https://tc39.es/ecma262/#sec-%iteratorprototype%-object var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; if ([].keys) { arrayIterator = [].keys(); // Safari 8 has buggy iterators w/o `next` if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true; else { PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; } } var NEW_ITERATOR_PROTOTYPE = IteratorPrototype == undefined || fails(function () { var test = {}; // FF44- legacy iterators case return IteratorPrototype[ITERATOR].call(test) !== test; }); if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {}; // 25.1.2.1.1 %IteratorPrototype%[@@iterator]() if ((!IS_PURE || NEW_ITERATOR_PROTOTYPE) && !has(IteratorPrototype, ITERATOR)) { createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis); } module.exports = { IteratorPrototype: IteratorPrototype, BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS }; /***/ }), /***/ "./node_modules/core-js/internals/iterators.js": /*!*****************************************************!*\ !*** ./node_modules/core-js/internals/iterators.js ***! \*****************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = {}; /***/ }), /***/ "./node_modules/core-js/internals/microtask.js": /*!*****************************************************!*\ !*** ./node_modules/core-js/internals/microtask.js ***! \*****************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js").f; var macrotask = __webpack_require__(/*! ../internals/task */ "./node_modules/core-js/internals/task.js").set; var IS_IOS = __webpack_require__(/*! ../internals/engine-is-ios */ "./node_modules/core-js/internals/engine-is-ios.js"); var IS_WEBOS_WEBKIT = __webpack_require__(/*! ../internals/engine-is-webos-webkit */ "./node_modules/core-js/internals/engine-is-webos-webkit.js"); var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "./node_modules/core-js/internals/engine-is-node.js"); var MutationObserver = global.MutationObserver || global.WebKitMutationObserver; var document = global.document; var process = global.process; var Promise = global.Promise; // Node.js 11 shows ExperimentalWarning on getting `queueMicrotask` var queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask'); var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value; var flush, head, last, notify, toggle, node, promise, then; // modern engines have queueMicrotask method if (!queueMicrotask) { flush = function () { var parent, fn; if (IS_NODE && (parent = process.domain)) parent.exit(); while (head) { fn = head.fn; head = head.next; try { fn(); } catch (error) { if (head) notify(); else last = undefined; throw error; } } last = undefined; if (parent) parent.enter(); }; // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339 // also except WebOS Webkit https://github.com/zloirock/core-js/issues/898 if (!IS_IOS && !IS_NODE && !IS_WEBOS_WEBKIT && MutationObserver && document) { toggle = true; node = document.createTextNode(''); new MutationObserver(flush).observe(node, { characterData: true }); notify = function () { node.data = toggle = !toggle; }; // environments with maybe non-completely correct, but existent Promise } else if (Promise && Promise.resolve) { // Promise.resolve without an argument throws an error in LG WebOS 2 promise = Promise.resolve(undefined); then = promise.then; notify = function () { then.call(promise, flush); }; // Node.js without promises } else if (IS_NODE) { notify = function () { process.nextTick(flush); }; // for other environments - macrotask based on: // - setImmediate // - MessageChannel // - window.postMessag // - onreadystatechange // - setTimeout } else { notify = function () { // strange IE + webpack dev server bug - use .call(global) macrotask.call(global, flush); }; } } module.exports = queueMicrotask || function (fn) { var task = { fn: fn, next: undefined }; if (last) last.next = task; if (!head) { head = task; notify(); } last = task; }; /***/ }), /***/ "./node_modules/core-js/internals/native-promise-constructor.js": /*!**********************************************************************!*\ !*** ./node_modules/core-js/internals/native-promise-constructor.js ***! \**********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); module.exports = global.Promise; /***/ }), /***/ "./node_modules/core-js/internals/native-symbol.js": /*!*********************************************************!*\ !*** ./node_modules/core-js/internals/native-symbol.js ***! \*********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); module.exports = !!Object.getOwnPropertySymbols && !fails(function () { // Chrome 38 Symbol has incorrect toString conversion // eslint-disable-next-line no-undef return !String(Symbol()); }); /***/ }), /***/ "./node_modules/core-js/internals/native-weak-map.js": /*!***********************************************************!*\ !*** ./node_modules/core-js/internals/native-weak-map.js ***! \***********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "./node_modules/core-js/internals/inspect-source.js"); var WeakMap = global.WeakMap; module.exports = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap)); /***/ }), /***/ "./node_modules/core-js/internals/new-promise-capability.js": /*!******************************************************************!*\ !*** ./node_modules/core-js/internals/new-promise-capability.js ***! \******************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/core-js/internals/a-function.js"); var PromiseCapability = function (C) { var resolve, reject; this.promise = new C(function ($$resolve, $$reject) { if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor'); resolve = $$resolve; reject = $$reject; }); this.resolve = aFunction(resolve); this.reject = aFunction(reject); }; // 25.4.1.5 NewPromiseCapability(C) module.exports.f = function (C) { return new PromiseCapability(C); }; /***/ }), /***/ "./node_modules/core-js/internals/object-assign.js": /*!*********************************************************!*\ !*** ./node_modules/core-js/internals/object-assign.js ***! \*********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/core-js/internals/object-keys.js"); var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "./node_modules/core-js/internals/object-get-own-property-symbols.js"); var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "./node_modules/core-js/internals/object-property-is-enumerable.js"); var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js"); var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/core-js/internals/indexed-object.js"); var nativeAssign = Object.assign; var defineProperty = Object.defineProperty; // `Object.assign` method // https://tc39.es/ecma262/#sec-object.assign module.exports = !nativeAssign || fails(function () { // should have correct order of operations (Edge bug) if (DESCRIPTORS && nativeAssign({ b: 1 }, nativeAssign(defineProperty({}, 'a', { enumerable: true, get: function () { defineProperty(this, 'b', { value: 3, enumerable: false }); } }), { b: 2 })).b !== 1) return true; // should work with symbols and should have deterministic property order (V8 bug) var A = {}; var B = {}; // eslint-disable-next-line no-undef var symbol = Symbol(); var alphabet = 'abcdefghijklmnopqrst'; A[symbol] = 7; alphabet.split('').forEach(function (chr) { B[chr] = chr; }); return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet; }) ? function assign(target, source) { // eslint-disable-line no-unused-vars var T = toObject(target); var argumentsLength = arguments.length; var index = 1; var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; var propertyIsEnumerable = propertyIsEnumerableModule.f; while (argumentsLength > index) { var S = IndexedObject(arguments[index++]); var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S); var length = keys.length; var j = 0; var key; while (length > j) { key = keys[j++]; if (!DESCRIPTORS || propertyIsEnumerable.call(S, key)) T[key] = S[key]; } } return T; } : nativeAssign; /***/ }), /***/ "./node_modules/core-js/internals/object-create.js": /*!*********************************************************!*\ !*** ./node_modules/core-js/internals/object-create.js ***! \*********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); var defineProperties = __webpack_require__(/*! ../internals/object-define-properties */ "./node_modules/core-js/internals/object-define-properties.js"); var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "./node_modules/core-js/internals/enum-bug-keys.js"); var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js/internals/hidden-keys.js"); var html = __webpack_require__(/*! ../internals/html */ "./node_modules/core-js/internals/html.js"); var documentCreateElement = __webpack_require__(/*! ../internals/document-create-element */ "./node_modules/core-js/internals/document-create-element.js"); var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/core-js/internals/shared-key.js"); var GT = '>'; var LT = '<'; var PROTOTYPE = 'prototype'; var SCRIPT = 'script'; var IE_PROTO = sharedKey('IE_PROTO'); var EmptyConstructor = function () { /* empty */ }; var scriptTag = function (content) { return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; }; // Create object with fake `null` prototype: use ActiveX Object with cleared prototype var NullProtoObjectViaActiveX = function (activeXDocument) { activeXDocument.write(scriptTag('')); activeXDocument.close(); var temp = activeXDocument.parentWindow.Object; activeXDocument = null; // avoid memory leak return temp; }; // Create object with fake `null` prototype: use iframe Object with cleared prototype var NullProtoObjectViaIFrame = function () { // Thrash, waste and sodomy: IE GC bug var iframe = documentCreateElement('iframe'); var JS = 'java' + SCRIPT + ':'; var iframeDocument; iframe.style.display = 'none'; html.appendChild(iframe); // https://github.com/zloirock/core-js/issues/475 iframe.src = String(JS); iframeDocument = iframe.contentWindow.document; iframeDocument.open(); iframeDocument.write(scriptTag('document.F=Object')); iframeDocument.close(); return iframeDocument.F; }; // Check for document.domain and active x support // No need to use active x approach when document.domain is not set // see https://github.com/es-shims/es5-shim/issues/150 // variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 // avoid IE GC bug var activeXDocument; var NullProtoObject = function () { try { /* global ActiveXObject */ activeXDocument = document.domain && new ActiveXObject('htmlfile'); } catch (error) { /* ignore */ } NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame(); var length = enumBugKeys.length; while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; return NullProtoObject(); }; hiddenKeys[IE_PROTO] = true; // `Object.create` method // https://tc39.es/ecma262/#sec-object.create module.exports = Object.create || function create(O, Properties) { var result; if (O !== null) { EmptyConstructor[PROTOTYPE] = anObject(O); result = new EmptyConstructor(); EmptyConstructor[PROTOTYPE] = null; // add "__proto__" for Object.getPrototypeOf polyfill result[IE_PROTO] = O; } else result = NullProtoObject(); return Properties === undefined ? result : defineProperties(result, Properties); }; /***/ }), /***/ "./node_modules/core-js/internals/object-define-properties.js": /*!********************************************************************!*\ !*** ./node_modules/core-js/internals/object-define-properties.js ***! \********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js"); var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/core-js/internals/object-keys.js"); // `Object.defineProperties` method // https://tc39.es/ecma262/#sec-object.defineproperties module.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) { anObject(O); var keys = objectKeys(Properties); var length = keys.length; var index = 0; var key; while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]); return O; }; /***/ }), /***/ "./node_modules/core-js/internals/object-define-property.js": /*!******************************************************************!*\ !*** ./node_modules/core-js/internals/object-define-property.js ***! \******************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "./node_modules/core-js/internals/ie8-dom-define.js"); var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/core-js/internals/to-primitive.js"); var nativeDefineProperty = Object.defineProperty; // `Object.defineProperty` method // https://tc39.es/ecma262/#sec-object.defineproperty exports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) { anObject(O); P = toPrimitive(P, true); anObject(Attributes); if (IE8_DOM_DEFINE) try { return nativeDefineProperty(O, P, Attributes); } catch (error) { /* empty */ } if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported'); if ('value' in Attributes) O[P] = Attributes.value; return O; }; /***/ }), /***/ "./node_modules/core-js/internals/object-get-own-property-descriptor.js": /*!******************************************************************************!*\ !*** ./node_modules/core-js/internals/object-get-own-property-descriptor.js ***! \******************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "./node_modules/core-js/internals/object-property-is-enumerable.js"); var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js"); var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js"); var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/core-js/internals/to-primitive.js"); var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js"); var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "./node_modules/core-js/internals/ie8-dom-define.js"); var nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; // `Object.getOwnPropertyDescriptor` method // https://tc39.es/ecma262/#sec-object.getownpropertydescriptor exports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { O = toIndexedObject(O); P = toPrimitive(P, true); if (IE8_DOM_DEFINE) try { return nativeGetOwnPropertyDescriptor(O, P); } catch (error) { /* empty */ } if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]); }; /***/ }), /***/ "./node_modules/core-js/internals/object-get-own-property-names.js": /*!*************************************************************************!*\ !*** ./node_modules/core-js/internals/object-get-own-property-names.js ***! \*************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "./node_modules/core-js/internals/object-keys-internal.js"); var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "./node_modules/core-js/internals/enum-bug-keys.js"); var hiddenKeys = enumBugKeys.concat('length', 'prototype'); // `Object.getOwnPropertyNames` method // https://tc39.es/ecma262/#sec-object.getownpropertynames exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { return internalObjectKeys(O, hiddenKeys); }; /***/ }), /***/ "./node_modules/core-js/internals/object-get-own-property-symbols.js": /*!***************************************************************************!*\ !*** ./node_modules/core-js/internals/object-get-own-property-symbols.js ***! \***************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { exports.f = Object.getOwnPropertySymbols; /***/ }), /***/ "./node_modules/core-js/internals/object-get-prototype-of.js": /*!*******************************************************************!*\ !*** ./node_modules/core-js/internals/object-get-prototype-of.js ***! \*******************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js"); var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js"); var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/core-js/internals/shared-key.js"); var CORRECT_PROTOTYPE_GETTER = __webpack_require__(/*! ../internals/correct-prototype-getter */ "./node_modules/core-js/internals/correct-prototype-getter.js"); var IE_PROTO = sharedKey('IE_PROTO'); var ObjectPrototype = Object.prototype; // `Object.getPrototypeOf` method // https://tc39.es/ecma262/#sec-object.getprototypeof module.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) { O = toObject(O); if (has(O, IE_PROTO)) return O[IE_PROTO]; if (typeof O.constructor == 'function' && O instanceof O.constructor) { return O.constructor.prototype; } return O instanceof Object ? ObjectPrototype : null; }; /***/ }), /***/ "./node_modules/core-js/internals/object-keys-internal.js": /*!****************************************************************!*\ !*** ./node_modules/core-js/internals/object-keys-internal.js ***! \****************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js"); var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js"); var indexOf = __webpack_require__(/*! ../internals/array-includes */ "./node_modules/core-js/internals/array-includes.js").indexOf; var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js/internals/hidden-keys.js"); module.exports = function (object, names) { var O = toIndexedObject(object); var i = 0; var result = []; var key; for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key); // Don't enum bug & hidden keys while (names.length > i) if (has(O, key = names[i++])) { ~indexOf(result, key) || result.push(key); } return result; }; /***/ }), /***/ "./node_modules/core-js/internals/object-keys.js": /*!*******************************************************!*\ !*** ./node_modules/core-js/internals/object-keys.js ***! \*******************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "./node_modules/core-js/internals/object-keys-internal.js"); var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "./node_modules/core-js/internals/enum-bug-keys.js"); // `Object.keys` method // https://tc39.es/ecma262/#sec-object.keys module.exports = Object.keys || function keys(O) { return internalObjectKeys(O, enumBugKeys); }; /***/ }), /***/ "./node_modules/core-js/internals/object-property-is-enumerable.js": /*!*************************************************************************!*\ !*** ./node_modules/core-js/internals/object-property-is-enumerable.js ***! \*************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var nativePropertyIsEnumerable = {}.propertyIsEnumerable; var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; // Nashorn ~ JDK8 bug var NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1); // `Object.prototype.propertyIsEnumerable` method implementation // https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { var descriptor = getOwnPropertyDescriptor(this, V); return !!descriptor && descriptor.enumerable; } : nativePropertyIsEnumerable; /***/ }), /***/ "./node_modules/core-js/internals/object-set-prototype-of.js": /*!*******************************************************************!*\ !*** ./node_modules/core-js/internals/object-set-prototype-of.js ***! \*******************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); var aPossiblePrototype = __webpack_require__(/*! ../internals/a-possible-prototype */ "./node_modules/core-js/internals/a-possible-prototype.js"); // `Object.setPrototypeOf` method // https://tc39.es/ecma262/#sec-object.setprototypeof // Works with __proto__ only. Old v8 can't work with null proto objects. /* eslint-disable no-proto */ module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { var CORRECT_SETTER = false; var test = {}; var setter; try { setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set; setter.call(test, []); CORRECT_SETTER = test instanceof Array; } catch (error) { /* empty */ } return function setPrototypeOf(O, proto) { anObject(O); aPossiblePrototype(proto); if (CORRECT_SETTER) setter.call(O, proto); else O.__proto__ = proto; return O; }; }() : undefined); /***/ }), /***/ "./node_modules/core-js/internals/object-to-string.js": /*!************************************************************!*\ !*** ./node_modules/core-js/internals/object-to-string.js ***! \************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "./node_modules/core-js/internals/to-string-tag-support.js"); var classof = __webpack_require__(/*! ../internals/classof */ "./node_modules/core-js/internals/classof.js"); // `Object.prototype.toString` method implementation // https://tc39.es/ecma262/#sec-object.prototype.tostring module.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() { return '[object ' + classof(this) + ']'; }; /***/ }), /***/ "./node_modules/core-js/internals/own-keys.js": /*!****************************************************!*\ !*** ./node_modules/core-js/internals/own-keys.js ***! \****************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); var getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/core-js/internals/object-get-own-property-names.js"); var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "./node_modules/core-js/internals/object-get-own-property-symbols.js"); var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); // all object keys, includes non-enumerable and symbols module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { var keys = getOwnPropertyNamesModule.f(anObject(it)); var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys; }; /***/ }), /***/ "./node_modules/core-js/internals/path.js": /*!************************************************!*\ !*** ./node_modules/core-js/internals/path.js ***! \************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); module.exports = global; /***/ }), /***/ "./node_modules/core-js/internals/perform.js": /*!***************************************************!*\ !*** ./node_modules/core-js/internals/perform.js ***! \***************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = function (exec) { try { return { error: false, value: exec() }; } catch (error) { return { error: true, value: error }; } }; /***/ }), /***/ "./node_modules/core-js/internals/promise-resolve.js": /*!***********************************************************!*\ !*** ./node_modules/core-js/internals/promise-resolve.js ***! \***********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); var newPromiseCapability = __webpack_require__(/*! ../internals/new-promise-capability */ "./node_modules/core-js/internals/new-promise-capability.js"); module.exports = function (C, x) { anObject(C); if (isObject(x) && x.constructor === C) return x; var promiseCapability = newPromiseCapability.f(C); var resolve = promiseCapability.resolve; resolve(x); return promiseCapability.promise; }; /***/ }), /***/ "./node_modules/core-js/internals/redefine-all.js": /*!********************************************************!*\ !*** ./node_modules/core-js/internals/redefine-all.js ***! \********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js"); module.exports = function (target, src, options) { for (var key in src) redefine(target, key, src[key], options); return target; }; /***/ }), /***/ "./node_modules/core-js/internals/redefine.js": /*!****************************************************!*\ !*** ./node_modules/core-js/internals/redefine.js ***! \****************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js"); var setGlobal = __webpack_require__(/*! ../internals/set-global */ "./node_modules/core-js/internals/set-global.js"); var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "./node_modules/core-js/internals/inspect-source.js"); var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js"); var getInternalState = InternalStateModule.get; var enforceInternalState = InternalStateModule.enforce; var TEMPLATE = String(String).split('String'); (module.exports = function (O, key, value, options) { var unsafe = options ? !!options.unsafe : false; var simple = options ? !!options.enumerable : false; var noTargetGet = options ? !!options.noTargetGet : false; var state; if (typeof value == 'function') { if (typeof key == 'string' && !has(value, 'name')) { createNonEnumerableProperty(value, 'name', key); } state = enforceInternalState(value); if (!state.source) { state.source = TEMPLATE.join(typeof key == 'string' ? key : ''); } } if (O === global) { if (simple) O[key] = value; else setGlobal(key, value); return; } else if (!unsafe) { delete O[key]; } else if (!noTargetGet && O[key]) { simple = true; } if (simple) O[key] = value; else createNonEnumerableProperty(O, key, value); // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative })(Function.prototype, 'toString', function toString() { return typeof this == 'function' && getInternalState(this).source || inspectSource(this); }); /***/ }), /***/ "./node_modules/core-js/internals/require-object-coercible.js": /*!********************************************************************!*\ !*** ./node_modules/core-js/internals/require-object-coercible.js ***! \********************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { // `RequireObjectCoercible` abstract operation // https://tc39.es/ecma262/#sec-requireobjectcoercible module.exports = function (it) { if (it == undefined) throw TypeError("Can't call method on " + it); return it; }; /***/ }), /***/ "./node_modules/core-js/internals/set-global.js": /*!******************************************************!*\ !*** ./node_modules/core-js/internals/set-global.js ***! \******************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); module.exports = function (key, value) { try { createNonEnumerableProperty(global, key, value); } catch (error) { global[key] = value; } return value; }; /***/ }), /***/ "./node_modules/core-js/internals/set-species.js": /*!*******************************************************!*\ !*** ./node_modules/core-js/internals/set-species.js ***! \*******************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); var SPECIES = wellKnownSymbol('species'); module.exports = function (CONSTRUCTOR_NAME) { var Constructor = getBuiltIn(CONSTRUCTOR_NAME); var defineProperty = definePropertyModule.f; if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) { defineProperty(Constructor, SPECIES, { configurable: true, get: function () { return this; } }); } }; /***/ }), /***/ "./node_modules/core-js/internals/set-to-string-tag.js": /*!*************************************************************!*\ !*** ./node_modules/core-js/internals/set-to-string-tag.js ***! \*************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f; var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var TO_STRING_TAG = wellKnownSymbol('toStringTag'); module.exports = function (it, TAG, STATIC) { if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) { defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG }); } }; /***/ }), /***/ "./node_modules/core-js/internals/shared-key.js": /*!******************************************************!*\ !*** ./node_modules/core-js/internals/shared-key.js ***! \******************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/core-js/internals/shared.js"); var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/core-js/internals/uid.js"); var keys = shared('keys'); module.exports = function (key) { return keys[key] || (keys[key] = uid(key)); }; /***/ }), /***/ "./node_modules/core-js/internals/shared-store.js": /*!********************************************************!*\ !*** ./node_modules/core-js/internals/shared-store.js ***! \********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var setGlobal = __webpack_require__(/*! ../internals/set-global */ "./node_modules/core-js/internals/set-global.js"); var SHARED = '__core-js_shared__'; var store = global[SHARED] || setGlobal(SHARED, {}); module.exports = store; /***/ }), /***/ "./node_modules/core-js/internals/shared.js": /*!**************************************************!*\ !*** ./node_modules/core-js/internals/shared.js ***! \**************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js"); var store = __webpack_require__(/*! ../internals/shared-store */ "./node_modules/core-js/internals/shared-store.js"); (module.exports = function (key, value) { return store[key] || (store[key] = value !== undefined ? value : {}); })('versions', []).push({ version: '3.8.3', mode: IS_PURE ? 'pure' : 'global', copyright: '© 2021 Denis Pushkarev (zloirock.ru)' }); /***/ }), /***/ "./node_modules/core-js/internals/species-constructor.js": /*!***************************************************************!*\ !*** ./node_modules/core-js/internals/species-constructor.js ***! \***************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/core-js/internals/a-function.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var SPECIES = wellKnownSymbol('species'); // `SpeciesConstructor` abstract operation // https://tc39.es/ecma262/#sec-speciesconstructor module.exports = function (O, defaultConstructor) { var C = anObject(O).constructor; var S; return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S); }; /***/ }), /***/ "./node_modules/core-js/internals/string-multibyte.js": /*!************************************************************!*\ !*** ./node_modules/core-js/internals/string-multibyte.js ***! \************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js"); var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js"); // `String.prototype.{ codePointAt, at }` methods implementation var createMethod = function (CONVERT_TO_STRING) { return function ($this, pos) { var S = String(requireObjectCoercible($this)); var position = toInteger(pos); var size = S.length; var first, second; if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined; first = S.charCodeAt(position); return first < 0xD800 || first > 0xDBFF || position + 1 === size || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF ? CONVERT_TO_STRING ? S.charAt(position) : first : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000; }; }; module.exports = { // `String.prototype.codePointAt` method // https://tc39.es/ecma262/#sec-string.prototype.codepointat codeAt: createMethod(false), // `String.prototype.at` method // https://github.com/mathiasbynens/String.prototype.at charAt: createMethod(true) }; /***/ }), /***/ "./node_modules/core-js/internals/task.js": /*!************************************************!*\ !*** ./node_modules/core-js/internals/task.js ***! \************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var bind = __webpack_require__(/*! ../internals/function-bind-context */ "./node_modules/core-js/internals/function-bind-context.js"); var html = __webpack_require__(/*! ../internals/html */ "./node_modules/core-js/internals/html.js"); var createElement = __webpack_require__(/*! ../internals/document-create-element */ "./node_modules/core-js/internals/document-create-element.js"); var IS_IOS = __webpack_require__(/*! ../internals/engine-is-ios */ "./node_modules/core-js/internals/engine-is-ios.js"); var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "./node_modules/core-js/internals/engine-is-node.js"); var location = global.location; var set = global.setImmediate; var clear = global.clearImmediate; var process = global.process; var MessageChannel = global.MessageChannel; var Dispatch = global.Dispatch; var counter = 0; var queue = {}; var ONREADYSTATECHANGE = 'onreadystatechange'; var defer, channel, port; var run = function (id) { // eslint-disable-next-line no-prototype-builtins if (queue.hasOwnProperty(id)) { var fn = queue[id]; delete queue[id]; fn(); } }; var runner = function (id) { return function () { run(id); }; }; var listener = function (event) { run(event.data); }; var post = function (id) { // old engines have not location.origin global.postMessage(id + '', location.protocol + '//' + location.host); }; // Node.js 0.9+ & IE10+ has setImmediate, otherwise: if (!set || !clear) { set = function setImmediate(fn) { var args = []; var i = 1; while (arguments.length > i) args.push(arguments[i++]); queue[++counter] = function () { // eslint-disable-next-line no-new-func (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args); }; defer(counter); return counter; }; clear = function clearImmediate(id) { delete queue[id]; }; // Node.js 0.8- if (IS_NODE) { defer = function (id) { process.nextTick(runner(id)); }; // Sphere (JS game engine) Dispatch API } else if (Dispatch && Dispatch.now) { defer = function (id) { Dispatch.now(runner(id)); }; // Browsers with MessageChannel, includes WebWorkers // except iOS - https://github.com/zloirock/core-js/issues/624 } else if (MessageChannel && !IS_IOS) { channel = new MessageChannel(); port = channel.port2; channel.port1.onmessage = listener; defer = bind(port.postMessage, port, 1); // Browsers with postMessage, skip WebWorkers // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' } else if ( global.addEventListener && typeof postMessage == 'function' && !global.importScripts && location && location.protocol !== 'file:' && !fails(post) ) { defer = post; global.addEventListener('message', listener, false); // IE8- } else if (ONREADYSTATECHANGE in createElement('script')) { defer = function (id) { html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () { html.removeChild(this); run(id); }; }; // Rest old browsers } else { defer = function (id) { setTimeout(runner(id), 0); }; } } module.exports = { set: set, clear: clear }; /***/ }), /***/ "./node_modules/core-js/internals/to-absolute-index.js": /*!*************************************************************!*\ !*** ./node_modules/core-js/internals/to-absolute-index.js ***! \*************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js"); var max = Math.max; var min = Math.min; // Helper for a popular repeating case of the spec: // Let integer be ? ToInteger(index). // If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). module.exports = function (index, length) { var integer = toInteger(index); return integer < 0 ? max(integer + length, 0) : min(integer, length); }; /***/ }), /***/ "./node_modules/core-js/internals/to-indexed-object.js": /*!*************************************************************!*\ !*** ./node_modules/core-js/internals/to-indexed-object.js ***! \*************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { // toObject with fallback for non-array-like ES3 strings var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/core-js/internals/indexed-object.js"); var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js"); module.exports = function (it) { return IndexedObject(requireObjectCoercible(it)); }; /***/ }), /***/ "./node_modules/core-js/internals/to-integer.js": /*!******************************************************!*\ !*** ./node_modules/core-js/internals/to-integer.js ***! \******************************************************/ /*! no static exports found */ /***/ (function(module, exports) { var ceil = Math.ceil; var floor = Math.floor; // `ToInteger` abstract operation // https://tc39.es/ecma262/#sec-tointeger module.exports = function (argument) { return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument); }; /***/ }), /***/ "./node_modules/core-js/internals/to-length.js": /*!*****************************************************!*\ !*** ./node_modules/core-js/internals/to-length.js ***! \*****************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js"); var min = Math.min; // `ToLength` abstract operation // https://tc39.es/ecma262/#sec-tolength module.exports = function (argument) { return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 }; /***/ }), /***/ "./node_modules/core-js/internals/to-object.js": /*!*****************************************************!*\ !*** ./node_modules/core-js/internals/to-object.js ***! \*****************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js"); // `ToObject` abstract operation // https://tc39.es/ecma262/#sec-toobject module.exports = function (argument) { return Object(requireObjectCoercible(argument)); }; /***/ }), /***/ "./node_modules/core-js/internals/to-primitive.js": /*!********************************************************!*\ !*** ./node_modules/core-js/internals/to-primitive.js ***! \********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); // `ToPrimitive` abstract operation // https://tc39.es/ecma262/#sec-toprimitive // instead of the ES6 spec version, we didn't implement @@toPrimitive case // and the second argument - flag - preferred type is a string module.exports = function (input, PREFERRED_STRING) { if (!isObject(input)) return input; var fn, val; if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val; if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val; if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val; throw TypeError("Can't convert object to primitive value"); }; /***/ }), /***/ "./node_modules/core-js/internals/to-string-tag-support.js": /*!*****************************************************************!*\ !*** ./node_modules/core-js/internals/to-string-tag-support.js ***! \*****************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var TO_STRING_TAG = wellKnownSymbol('toStringTag'); var test = {}; test[TO_STRING_TAG] = 'z'; module.exports = String(test) === '[object z]'; /***/ }), /***/ "./node_modules/core-js/internals/uid.js": /*!***********************************************!*\ !*** ./node_modules/core-js/internals/uid.js ***! \***********************************************/ /*! no static exports found */ /***/ (function(module, exports) { var id = 0; var postfix = Math.random(); module.exports = function (key) { return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36); }; /***/ }), /***/ "./node_modules/core-js/internals/use-symbol-as-uid.js": /*!*************************************************************!*\ !*** ./node_modules/core-js/internals/use-symbol-as-uid.js ***! \*************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "./node_modules/core-js/internals/native-symbol.js"); module.exports = NATIVE_SYMBOL // eslint-disable-next-line no-undef && !Symbol.sham // eslint-disable-next-line no-undef && typeof Symbol.iterator == 'symbol'; /***/ }), /***/ "./node_modules/core-js/internals/well-known-symbol.js": /*!*************************************************************!*\ !*** ./node_modules/core-js/internals/well-known-symbol.js ***! \*************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/core-js/internals/shared.js"); var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js"); var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/core-js/internals/uid.js"); var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "./node_modules/core-js/internals/native-symbol.js"); var USE_SYMBOL_AS_UID = __webpack_require__(/*! ../internals/use-symbol-as-uid */ "./node_modules/core-js/internals/use-symbol-as-uid.js"); var WellKnownSymbolsStore = shared('wks'); var Symbol = global.Symbol; var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid; module.exports = function (name) { if (!has(WellKnownSymbolsStore, name)) { if (NATIVE_SYMBOL && has(Symbol, name)) WellKnownSymbolsStore[name] = Symbol[name]; else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name); } return WellKnownSymbolsStore[name]; }; /***/ }), /***/ "./node_modules/core-js/modules/es.aggregate-error.js": /*!************************************************************!*\ !*** ./node_modules/core-js/modules/es.aggregate-error.js ***! \************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js"); var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/core-js/internals/object-set-prototype-of.js"); var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js"); var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js"); var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/core-js/internals/iterate.js"); var $AggregateError = function AggregateError(errors, message) { var that = this; if (!(that instanceof $AggregateError)) return new $AggregateError(errors, message); if (setPrototypeOf) { // eslint-disable-next-line unicorn/error-message that = setPrototypeOf(new Error(undefined), getPrototypeOf(that)); } if (message !== undefined) createNonEnumerableProperty(that, 'message', String(message)); var errorsArray = []; iterate(errors, errorsArray.push, { that: errorsArray }); createNonEnumerableProperty(that, 'errors', errorsArray); return that; }; $AggregateError.prototype = create(Error.prototype, { constructor: createPropertyDescriptor(5, $AggregateError), message: createPropertyDescriptor(5, ''), name: createPropertyDescriptor(5, 'AggregateError') }); // `AggregateError` constructor // https://tc39.es/ecma262/#sec-aggregate-error-constructor $({ global: true }, { AggregateError: $AggregateError }); /***/ }), /***/ "./node_modules/core-js/modules/es.array.find.js": /*!*******************************************************!*\ !*** ./node_modules/core-js/modules/es.array.find.js ***! \*******************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var $find = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").find; var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/core-js/internals/add-to-unscopables.js"); var arrayMethodUsesToLength = __webpack_require__(/*! ../internals/array-method-uses-to-length */ "./node_modules/core-js/internals/array-method-uses-to-length.js"); var FIND = 'find'; var SKIPS_HOLES = true; var USES_TO_LENGTH = arrayMethodUsesToLength(FIND); // Shouldn't skip holes if (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; }); // `Array.prototype.find` method // https://tc39.es/ecma262/#sec-array.prototype.find $({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, { find: function find(callbackfn /* , that = undefined */) { return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); } }); // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables addToUnscopables(FIND); /***/ }), /***/ "./node_modules/core-js/modules/es.array.is-array.js": /*!***********************************************************!*\ !*** ./node_modules/core-js/modules/es.array.is-array.js ***! \***********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/core-js/internals/is-array.js"); // `Array.isArray` method // https://tc39.es/ecma262/#sec-array.isarray $({ target: 'Array', stat: true }, { isArray: isArray }); /***/ }), /***/ "./node_modules/core-js/modules/es.array.iterator.js": /*!***********************************************************!*\ !*** ./node_modules/core-js/modules/es.array.iterator.js ***! \***********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js"); var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/core-js/internals/add-to-unscopables.js"); var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js"); var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js"); var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "./node_modules/core-js/internals/define-iterator.js"); var ARRAY_ITERATOR = 'Array Iterator'; var setInternalState = InternalStateModule.set; var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR); // `Array.prototype.entries` method // https://tc39.es/ecma262/#sec-array.prototype.entries // `Array.prototype.keys` method // https://tc39.es/ecma262/#sec-array.prototype.keys // `Array.prototype.values` method // https://tc39.es/ecma262/#sec-array.prototype.values // `Array.prototype[@@iterator]` method // https://tc39.es/ecma262/#sec-array.prototype-@@iterator // `CreateArrayIterator` internal method // https://tc39.es/ecma262/#sec-createarrayiterator module.exports = defineIterator(Array, 'Array', function (iterated, kind) { setInternalState(this, { type: ARRAY_ITERATOR, target: toIndexedObject(iterated), // target index: 0, // next index kind: kind // kind }); // `%ArrayIteratorPrototype%.next` method // https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next }, function () { var state = getInternalState(this); var target = state.target; var kind = state.kind; var index = state.index++; if (!target || index >= target.length) { state.target = undefined; return { value: undefined, done: true }; } if (kind == 'keys') return { value: index, done: false }; if (kind == 'values') return { value: target[index], done: false }; return { value: [index, target[index]], done: false }; }, 'values'); // argumentsList[@@iterator] is %ArrayProto_values% // https://tc39.es/ecma262/#sec-createunmappedargumentsobject // https://tc39.es/ecma262/#sec-createmappedargumentsobject Iterators.Arguments = Iterators.Array; // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables addToUnscopables('keys'); addToUnscopables('values'); addToUnscopables('entries'); /***/ }), /***/ "./node_modules/core-js/modules/es.array.some.js": /*!*******************************************************!*\ !*** ./node_modules/core-js/modules/es.array.some.js ***! \*******************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var $some = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").some; var arrayMethodIsStrict = __webpack_require__(/*! ../internals/array-method-is-strict */ "./node_modules/core-js/internals/array-method-is-strict.js"); var arrayMethodUsesToLength = __webpack_require__(/*! ../internals/array-method-uses-to-length */ "./node_modules/core-js/internals/array-method-uses-to-length.js"); var STRICT_METHOD = arrayMethodIsStrict('some'); var USES_TO_LENGTH = arrayMethodUsesToLength('some'); // `Array.prototype.some` method // https://tc39.es/ecma262/#sec-array.prototype.some $({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, { some: function some(callbackfn /* , thisArg */) { return $some(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); } }); /***/ }), /***/ "./node_modules/core-js/modules/es.array.splice.js": /*!*********************************************************!*\ !*** ./node_modules/core-js/modules/es.array.splice.js ***! \*********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "./node_modules/core-js/internals/to-absolute-index.js"); var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js"); var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js"); var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js"); var arraySpeciesCreate = __webpack_require__(/*! ../internals/array-species-create */ "./node_modules/core-js/internals/array-species-create.js"); var createProperty = __webpack_require__(/*! ../internals/create-property */ "./node_modules/core-js/internals/create-property.js"); var arrayMethodHasSpeciesSupport = __webpack_require__(/*! ../internals/array-method-has-species-support */ "./node_modules/core-js/internals/array-method-has-species-support.js"); var arrayMethodUsesToLength = __webpack_require__(/*! ../internals/array-method-uses-to-length */ "./node_modules/core-js/internals/array-method-uses-to-length.js"); var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('splice'); var USES_TO_LENGTH = arrayMethodUsesToLength('splice', { ACCESSORS: true, 0: 0, 1: 2 }); var max = Math.max; var min = Math.min; var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; var MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded'; // `Array.prototype.splice` method // https://tc39.es/ecma262/#sec-array.prototype.splice // with adding support of @@species $({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, { splice: function splice(start, deleteCount /* , ...items */) { var O = toObject(this); var len = toLength(O.length); var actualStart = toAbsoluteIndex(start, len); var argumentsLength = arguments.length; var insertCount, actualDeleteCount, A, k, from, to; if (argumentsLength === 0) { insertCount = actualDeleteCount = 0; } else if (argumentsLength === 1) { insertCount = 0; actualDeleteCount = len - actualStart; } else { insertCount = argumentsLength - 2; actualDeleteCount = min(max(toInteger(deleteCount), 0), len - actualStart); } if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER) { throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED); } A = arraySpeciesCreate(O, actualDeleteCount); for (k = 0; k < actualDeleteCount; k++) { from = actualStart + k; if (from in O) createProperty(A, k, O[from]); } A.length = actualDeleteCount; if (insertCount < actualDeleteCount) { for (k = actualStart; k < len - actualDeleteCount; k++) { from = k + actualDeleteCount; to = k + insertCount; if (from in O) O[to] = O[from]; else delete O[to]; } for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1]; } else if (insertCount > actualDeleteCount) { for (k = len - actualDeleteCount; k > actualStart; k--) { from = k + actualDeleteCount - 1; to = k + insertCount - 1; if (from in O) O[to] = O[from]; else delete O[to]; } } for (k = 0; k < insertCount; k++) { O[k + actualStart] = arguments[k + 2]; } O.length = len - actualDeleteCount + insertCount; return A; } }); /***/ }), /***/ "./node_modules/core-js/modules/es.function.bind.js": /*!**********************************************************!*\ !*** ./node_modules/core-js/modules/es.function.bind.js ***! \**********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var bind = __webpack_require__(/*! ../internals/function-bind */ "./node_modules/core-js/internals/function-bind.js"); // `Function.prototype.bind` method // https://tc39.es/ecma262/#sec-function.prototype.bind $({ target: 'Function', proto: true }, { bind: bind }); /***/ }), /***/ "./node_modules/core-js/modules/es.object.assign.js": /*!**********************************************************!*\ !*** ./node_modules/core-js/modules/es.object.assign.js ***! \**********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var assign = __webpack_require__(/*! ../internals/object-assign */ "./node_modules/core-js/internals/object-assign.js"); // `Object.assign` method // https://tc39.es/ecma262/#sec-object.assign $({ target: 'Object', stat: true, forced: Object.assign !== assign }, { assign: assign }); /***/ }), /***/ "./node_modules/core-js/modules/es.object.to-string.js": /*!*************************************************************!*\ !*** ./node_modules/core-js/modules/es.object.to-string.js ***! \*************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "./node_modules/core-js/internals/to-string-tag-support.js"); var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js"); var toString = __webpack_require__(/*! ../internals/object-to-string */ "./node_modules/core-js/internals/object-to-string.js"); // `Object.prototype.toString` method // https://tc39.es/ecma262/#sec-object.prototype.tostring if (!TO_STRING_TAG_SUPPORT) { redefine(Object.prototype, 'toString', toString, { unsafe: true }); } /***/ }), /***/ "./node_modules/core-js/modules/es.promise.all-settled.js": /*!****************************************************************!*\ !*** ./node_modules/core-js/modules/es.promise.all-settled.js ***! \****************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/core-js/internals/a-function.js"); var newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ "./node_modules/core-js/internals/new-promise-capability.js"); var perform = __webpack_require__(/*! ../internals/perform */ "./node_modules/core-js/internals/perform.js"); var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/core-js/internals/iterate.js"); // `Promise.allSettled` method // https://tc39.es/ecma262/#sec-promise.allsettled $({ target: 'Promise', stat: true }, { allSettled: function allSettled(iterable) { var C = this; var capability = newPromiseCapabilityModule.f(C); var resolve = capability.resolve; var reject = capability.reject; var result = perform(function () { var promiseResolve = aFunction(C.resolve); var values = []; var counter = 0; var remaining = 1; iterate(iterable, function (promise) { var index = counter++; var alreadyCalled = false; values.push(undefined); remaining++; promiseResolve.call(C, promise).then(function (value) { if (alreadyCalled) return; alreadyCalled = true; values[index] = { status: 'fulfilled', value: value }; --remaining || resolve(values); }, function (error) { if (alreadyCalled) return; alreadyCalled = true; values[index] = { status: 'rejected', reason: error }; --remaining || resolve(values); }); }); --remaining || resolve(values); }); if (result.error) reject(result.value); return capability.promise; } }); /***/ }), /***/ "./node_modules/core-js/modules/es.promise.any.js": /*!********************************************************!*\ !*** ./node_modules/core-js/modules/es.promise.any.js ***! \********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/core-js/internals/a-function.js"); var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); var newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ "./node_modules/core-js/internals/new-promise-capability.js"); var perform = __webpack_require__(/*! ../internals/perform */ "./node_modules/core-js/internals/perform.js"); var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/core-js/internals/iterate.js"); var PROMISE_ANY_ERROR = 'No one promise resolved'; // `Promise.any` method // https://tc39.es/ecma262/#sec-promise.any $({ target: 'Promise', stat: true }, { any: function any(iterable) { var C = this; var capability = newPromiseCapabilityModule.f(C); var resolve = capability.resolve; var reject = capability.reject; var result = perform(function () { var promiseResolve = aFunction(C.resolve); var errors = []; var counter = 0; var remaining = 1; var alreadyResolved = false; iterate(iterable, function (promise) { var index = counter++; var alreadyRejected = false; errors.push(undefined); remaining++; promiseResolve.call(C, promise).then(function (value) { if (alreadyRejected || alreadyResolved) return; alreadyResolved = true; resolve(value); }, function (error) { if (alreadyRejected || alreadyResolved) return; alreadyRejected = true; errors[index] = error; --remaining || reject(new (getBuiltIn('AggregateError'))(errors, PROMISE_ANY_ERROR)); }); }); --remaining || reject(new (getBuiltIn('AggregateError'))(errors, PROMISE_ANY_ERROR)); }); if (result.error) reject(result.value); return capability.promise; } }); /***/ }), /***/ "./node_modules/core-js/modules/es.promise.finally.js": /*!************************************************************!*\ !*** ./node_modules/core-js/modules/es.promise.finally.js ***! \************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js"); var NativePromise = __webpack_require__(/*! ../internals/native-promise-constructor */ "./node_modules/core-js/internals/native-promise-constructor.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); var speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ "./node_modules/core-js/internals/species-constructor.js"); var promiseResolve = __webpack_require__(/*! ../internals/promise-resolve */ "./node_modules/core-js/internals/promise-resolve.js"); var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js"); // Safari bug https://bugs.webkit.org/show_bug.cgi?id=200829 var NON_GENERIC = !!NativePromise && fails(function () { NativePromise.prototype['finally'].call({ then: function () { /* empty */ } }, function () { /* empty */ }); }); // `Promise.prototype.finally` method // https://tc39.es/ecma262/#sec-promise.prototype.finally $({ target: 'Promise', proto: true, real: true, forced: NON_GENERIC }, { 'finally': function (onFinally) { var C = speciesConstructor(this, getBuiltIn('Promise')); var isFunction = typeof onFinally == 'function'; return this.then( isFunction ? function (x) { return promiseResolve(C, onFinally()).then(function () { return x; }); } : onFinally, isFunction ? function (e) { return promiseResolve(C, onFinally()).then(function () { throw e; }); } : onFinally ); } }); // patch native Promise.prototype for native async functions if (!IS_PURE && typeof NativePromise == 'function' && !NativePromise.prototype['finally']) { redefine(NativePromise.prototype, 'finally', getBuiltIn('Promise').prototype['finally']); } /***/ }), /***/ "./node_modules/core-js/modules/es.promise.js": /*!****************************************************!*\ !*** ./node_modules/core-js/modules/es.promise.js ***! \****************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js"); var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); var NativePromise = __webpack_require__(/*! ../internals/native-promise-constructor */ "./node_modules/core-js/internals/native-promise-constructor.js"); var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js"); var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "./node_modules/core-js/internals/redefine-all.js"); var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js"); var setSpecies = __webpack_require__(/*! ../internals/set-species */ "./node_modules/core-js/internals/set-species.js"); var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/core-js/internals/a-function.js"); var anInstance = __webpack_require__(/*! ../internals/an-instance */ "./node_modules/core-js/internals/an-instance.js"); var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "./node_modules/core-js/internals/inspect-source.js"); var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/core-js/internals/iterate.js"); var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "./node_modules/core-js/internals/check-correctness-of-iteration.js"); var speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ "./node_modules/core-js/internals/species-constructor.js"); var task = __webpack_require__(/*! ../internals/task */ "./node_modules/core-js/internals/task.js").set; var microtask = __webpack_require__(/*! ../internals/microtask */ "./node_modules/core-js/internals/microtask.js"); var promiseResolve = __webpack_require__(/*! ../internals/promise-resolve */ "./node_modules/core-js/internals/promise-resolve.js"); var hostReportErrors = __webpack_require__(/*! ../internals/host-report-errors */ "./node_modules/core-js/internals/host-report-errors.js"); var newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ "./node_modules/core-js/internals/new-promise-capability.js"); var perform = __webpack_require__(/*! ../internals/perform */ "./node_modules/core-js/internals/perform.js"); var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js"); var isForced = __webpack_require__(/*! ../internals/is-forced */ "./node_modules/core-js/internals/is-forced.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "./node_modules/core-js/internals/engine-is-node.js"); var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "./node_modules/core-js/internals/engine-v8-version.js"); var SPECIES = wellKnownSymbol('species'); var PROMISE = 'Promise'; var getInternalState = InternalStateModule.get; var setInternalState = InternalStateModule.set; var getInternalPromiseState = InternalStateModule.getterFor(PROMISE); var PromiseConstructor = NativePromise; var TypeError = global.TypeError; var document = global.document; var process = global.process; var $fetch = getBuiltIn('fetch'); var newPromiseCapability = newPromiseCapabilityModule.f; var newGenericPromiseCapability = newPromiseCapability; var DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent); var NATIVE_REJECTION_EVENT = typeof PromiseRejectionEvent == 'function'; var UNHANDLED_REJECTION = 'unhandledrejection'; var REJECTION_HANDLED = 'rejectionhandled'; var PENDING = 0; var FULFILLED = 1; var REJECTED = 2; var HANDLED = 1; var UNHANDLED = 2; var Internal, OwnPromiseCapability, PromiseWrapper, nativeThen; var FORCED = isForced(PROMISE, function () { var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor); if (!GLOBAL_CORE_JS_PROMISE) { // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables // https://bugs.chromium.org/p/chromium/issues/detail?id=830565 // We can't detect it synchronously, so just check versions if (V8_VERSION === 66) return true; // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test if (!IS_NODE && !NATIVE_REJECTION_EVENT) return true; } // We need Promise#finally in the pure version for preventing prototype pollution if (IS_PURE && !PromiseConstructor.prototype['finally']) return true; // We can't use @@species feature detection in V8 since it causes // deoptimization and performance degradation // https://github.com/zloirock/core-js/issues/679 if (V8_VERSION >= 51 && /native code/.test(PromiseConstructor)) return false; // Detect correctness of subclassing with @@species support var promise = PromiseConstructor.resolve(1); var FakePromise = function (exec) { exec(function () { /* empty */ }, function () { /* empty */ }); }; var constructor = promise.constructor = {}; constructor[SPECIES] = FakePromise; return !(promise.then(function () { /* empty */ }) instanceof FakePromise); }); var INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) { PromiseConstructor.all(iterable)['catch'](function () { /* empty */ }); }); // helpers var isThenable = function (it) { var then; return isObject(it) && typeof (then = it.then) == 'function' ? then : false; }; var notify = function (state, isReject) { if (state.notified) return; state.notified = true; var chain = state.reactions; microtask(function () { var value = state.value; var ok = state.state == FULFILLED; var index = 0; // variable length - can't use forEach while (chain.length > index) { var reaction = chain[index++]; var handler = ok ? reaction.ok : reaction.fail; var resolve = reaction.resolve; var reject = reaction.reject; var domain = reaction.domain; var result, then, exited; try { if (handler) { if (!ok) { if (state.rejection === UNHANDLED) onHandleUnhandled(state); state.rejection = HANDLED; } if (handler === true) result = value; else { if (domain) domain.enter(); result = handler(value); // can throw if (domain) { domain.exit(); exited = true; } } if (result === reaction.promise) { reject(TypeError('Promise-chain cycle')); } else if (then = isThenable(result)) { then.call(result, resolve, reject); } else resolve(result); } else reject(value); } catch (error) { if (domain && !exited) domain.exit(); reject(error); } } state.reactions = []; state.notified = false; if (isReject && !state.rejection) onUnhandled(state); }); }; var dispatchEvent = function (name, promise, reason) { var event, handler; if (DISPATCH_EVENT) { event = document.createEvent('Event'); event.promise = promise; event.reason = reason; event.initEvent(name, false, true); global.dispatchEvent(event); } else event = { promise: promise, reason: reason }; if (!NATIVE_REJECTION_EVENT && (handler = global['on' + name])) handler(event); else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason); }; var onUnhandled = function (state) { task.call(global, function () { var promise = state.facade; var value = state.value; var IS_UNHANDLED = isUnhandled(state); var result; if (IS_UNHANDLED) { result = perform(function () { if (IS_NODE) { process.emit('unhandledRejection', value, promise); } else dispatchEvent(UNHANDLED_REJECTION, promise, value); }); // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED; if (result.error) throw result.value; } }); }; var isUnhandled = function (state) { return state.rejection !== HANDLED && !state.parent; }; var onHandleUnhandled = function (state) { task.call(global, function () { var promise = state.facade; if (IS_NODE) { process.emit('rejectionHandled', promise); } else dispatchEvent(REJECTION_HANDLED, promise, state.value); }); }; var bind = function (fn, state, unwrap) { return function (value) { fn(state, value, unwrap); }; }; var internalReject = function (state, value, unwrap) { if (state.done) return; state.done = true; if (unwrap) state = unwrap; state.value = value; state.state = REJECTED; notify(state, true); }; var internalResolve = function (state, value, unwrap) { if (state.done) return; state.done = true; if (unwrap) state = unwrap; try { if (state.facade === value) throw TypeError("Promise can't be resolved itself"); var then = isThenable(value); if (then) { microtask(function () { var wrapper = { done: false }; try { then.call(value, bind(internalResolve, wrapper, state), bind(internalReject, wrapper, state) ); } catch (error) { internalReject(wrapper, error, state); } }); } else { state.value = value; state.state = FULFILLED; notify(state, false); } } catch (error) { internalReject({ done: false }, error, state); } }; // constructor polyfill if (FORCED) { // 25.4.3.1 Promise(executor) PromiseConstructor = function Promise(executor) { anInstance(this, PromiseConstructor, PROMISE); aFunction(executor); Internal.call(this); var state = getInternalState(this); try { executor(bind(internalResolve, state), bind(internalReject, state)); } catch (error) { internalReject(state, error); } }; // eslint-disable-next-line no-unused-vars Internal = function Promise(executor) { setInternalState(this, { type: PROMISE, done: false, notified: false, parent: false, reactions: [], rejection: false, state: PENDING, value: undefined }); }; Internal.prototype = redefineAll(PromiseConstructor.prototype, { // `Promise.prototype.then` method // https://tc39.es/ecma262/#sec-promise.prototype.then then: function then(onFulfilled, onRejected) { var state = getInternalPromiseState(this); var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor)); reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; reaction.fail = typeof onRejected == 'function' && onRejected; reaction.domain = IS_NODE ? process.domain : undefined; state.parent = true; state.reactions.push(reaction); if (state.state != PENDING) notify(state, false); return reaction.promise; }, // `Promise.prototype.catch` method // https://tc39.es/ecma262/#sec-promise.prototype.catch 'catch': function (onRejected) { return this.then(undefined, onRejected); } }); OwnPromiseCapability = function () { var promise = new Internal(); var state = getInternalState(promise); this.promise = promise; this.resolve = bind(internalResolve, state); this.reject = bind(internalReject, state); }; newPromiseCapabilityModule.f = newPromiseCapability = function (C) { return C === PromiseConstructor || C === PromiseWrapper ? new OwnPromiseCapability(C) : newGenericPromiseCapability(C); }; if (!IS_PURE && typeof NativePromise == 'function') { nativeThen = NativePromise.prototype.then; // wrap native Promise#then for native async functions redefine(NativePromise.prototype, 'then', function then(onFulfilled, onRejected) { var that = this; return new PromiseConstructor(function (resolve, reject) { nativeThen.call(that, resolve, reject); }).then(onFulfilled, onRejected); // https://github.com/zloirock/core-js/issues/640 }, { unsafe: true }); // wrap fetch result if (typeof $fetch == 'function') $({ global: true, enumerable: true, forced: true }, { // eslint-disable-next-line no-unused-vars fetch: function fetch(input /* , init */) { return promiseResolve(PromiseConstructor, $fetch.apply(global, arguments)); } }); } } $({ global: true, wrap: true, forced: FORCED }, { Promise: PromiseConstructor }); setToStringTag(PromiseConstructor, PROMISE, false, true); setSpecies(PROMISE); PromiseWrapper = getBuiltIn(PROMISE); // statics $({ target: PROMISE, stat: true, forced: FORCED }, { // `Promise.reject` method // https://tc39.es/ecma262/#sec-promise.reject reject: function reject(r) { var capability = newPromiseCapability(this); capability.reject.call(undefined, r); return capability.promise; } }); $({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, { // `Promise.resolve` method // https://tc39.es/ecma262/#sec-promise.resolve resolve: function resolve(x) { return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x); } }); $({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, { // `Promise.all` method // https://tc39.es/ecma262/#sec-promise.all all: function all(iterable) { var C = this; var capability = newPromiseCapability(C); var resolve = capability.resolve; var reject = capability.reject; var result = perform(function () { var $promiseResolve = aFunction(C.resolve); var values = []; var counter = 0; var remaining = 1; iterate(iterable, function (promise) { var index = counter++; var alreadyCalled = false; values.push(undefined); remaining++; $promiseResolve.call(C, promise).then(function (value) { if (alreadyCalled) return; alreadyCalled = true; values[index] = value; --remaining || resolve(values); }, reject); }); --remaining || resolve(values); }); if (result.error) reject(result.value); return capability.promise; }, // `Promise.race` method // https://tc39.es/ecma262/#sec-promise.race race: function race(iterable) { var C = this; var capability = newPromiseCapability(C); var reject = capability.reject; var result = perform(function () { var $promiseResolve = aFunction(C.resolve); iterate(iterable, function (promise) { $promiseResolve.call(C, promise).then(capability.resolve, reject); }); }); if (result.error) reject(result.value); return capability.promise; } }); /***/ }), /***/ "./node_modules/core-js/modules/es.string.iterator.js": /*!************************************************************!*\ !*** ./node_modules/core-js/modules/es.string.iterator.js ***! \************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var charAt = __webpack_require__(/*! ../internals/string-multibyte */ "./node_modules/core-js/internals/string-multibyte.js").charAt; var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js"); var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "./node_modules/core-js/internals/define-iterator.js"); var STRING_ITERATOR = 'String Iterator'; var setInternalState = InternalStateModule.set; var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR); // `String.prototype[@@iterator]` method // https://tc39.es/ecma262/#sec-string.prototype-@@iterator defineIterator(String, 'String', function (iterated) { setInternalState(this, { type: STRING_ITERATOR, string: String(iterated), index: 0 }); // `%StringIteratorPrototype%.next` method // https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next }, function next() { var state = getInternalState(this); var string = state.string; var index = state.index; var point; if (index >= string.length) return { value: undefined, done: true }; point = charAt(string, index); state.index += point.length; return { value: point, done: false }; }); /***/ }), /***/ "./node_modules/core-js/modules/esnext.aggregate-error.js": /*!****************************************************************!*\ !*** ./node_modules/core-js/modules/esnext.aggregate-error.js ***! \****************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { // TODO: Remove from `core-js@4` __webpack_require__(/*! ./es.aggregate-error */ "./node_modules/core-js/modules/es.aggregate-error.js"); /***/ }), /***/ "./node_modules/core-js/modules/esnext.promise.all-settled.js": /*!********************************************************************!*\ !*** ./node_modules/core-js/modules/esnext.promise.all-settled.js ***! \********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { // TODO: Remove from `core-js@4` __webpack_require__(/*! ./es.promise.all-settled.js */ "./node_modules/core-js/modules/es.promise.all-settled.js"); /***/ }), /***/ "./node_modules/core-js/modules/esnext.promise.any.js": /*!************************************************************!*\ !*** ./node_modules/core-js/modules/esnext.promise.any.js ***! \************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { // TODO: Remove from `core-js@4` __webpack_require__(/*! ./es.promise.any */ "./node_modules/core-js/modules/es.promise.any.js"); /***/ }), /***/ "./node_modules/core-js/modules/esnext.promise.try.js": /*!************************************************************!*\ !*** ./node_modules/core-js/modules/esnext.promise.try.js ***! \************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ "./node_modules/core-js/internals/new-promise-capability.js"); var perform = __webpack_require__(/*! ../internals/perform */ "./node_modules/core-js/internals/perform.js"); // `Promise.try` method // https://github.com/tc39/proposal-promise-try $({ target: 'Promise', stat: true }, { 'try': function (callbackfn) { var promiseCapability = newPromiseCapabilityModule.f(this); var result = perform(callbackfn); (result.error ? promiseCapability.reject : promiseCapability.resolve)(result.value); return promiseCapability.promise; } }); /***/ }), /***/ "./node_modules/core-js/modules/web.dom-collections.iterator.js": /*!**********************************************************************!*\ !*** ./node_modules/core-js/modules/web.dom-collections.iterator.js ***! \**********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var DOMIterables = __webpack_require__(/*! ../internals/dom-iterables */ "./node_modules/core-js/internals/dom-iterables.js"); var ArrayIteratorMethods = __webpack_require__(/*! ../modules/es.array.iterator */ "./node_modules/core-js/modules/es.array.iterator.js"); var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var ITERATOR = wellKnownSymbol('iterator'); var TO_STRING_TAG = wellKnownSymbol('toStringTag'); var ArrayValues = ArrayIteratorMethods.values; for (var COLLECTION_NAME in DOMIterables) { var Collection = global[COLLECTION_NAME]; var CollectionPrototype = Collection && Collection.prototype; if (CollectionPrototype) { // some Chrome versions have non-configurable methods on DOMTokenList if (CollectionPrototype[ITERATOR] !== ArrayValues) try { createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues); } catch (error) { CollectionPrototype[ITERATOR] = ArrayValues; } if (!CollectionPrototype[TO_STRING_TAG]) { createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME); } if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) { // some Chrome versions have non-configurable methods on DOMTokenList if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try { createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]); } catch (error) { CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME]; } } } } /***/ }), /***/ "./node_modules/ieee754/index.js": /*!***************************************!*\ !*** ./node_modules/ieee754/index.js ***! \***************************************/ /*! no static exports found */ /***/ (function(module, exports) { /*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */ exports.read = function (buffer, offset, isLE, mLen, nBytes) { var e, m var eLen = (nBytes * 8) - mLen - 1 var eMax = (1 << eLen) - 1 var eBias = eMax >> 1 var nBits = -7 var i = isLE ? (nBytes - 1) : 0 var d = isLE ? -1 : 1 var s = buffer[offset + i] i += d e = s & ((1 << (-nBits)) - 1) s >>= (-nBits) nBits += eLen for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {} m = e & ((1 << (-nBits)) - 1) e >>= (-nBits) nBits += mLen for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {} if (e === 0) { e = 1 - eBias } else if (e === eMax) { return m ? NaN : ((s ? -1 : 1) * Infinity) } else { m = m + Math.pow(2, mLen) e = e - eBias } return (s ? -1 : 1) * m * Math.pow(2, e - mLen) } exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { var e, m, c var eLen = (nBytes * 8) - mLen - 1 var eMax = (1 << eLen) - 1 var eBias = eMax >> 1 var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) var i = isLE ? 0 : (nBytes - 1) var d = isLE ? 1 : -1 var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 value = Math.abs(value) if (isNaN(value) || value === Infinity) { m = isNaN(value) ? 1 : 0 e = eMax } else { e = Math.floor(Math.log(value) / Math.LN2) if (value * (c = Math.pow(2, -e)) < 1) { e-- c *= 2 } if (e + eBias >= 1) { value += rt / c } else { value += rt * Math.pow(2, 1 - eBias) } if (value * c >= 2) { e++ c /= 2 } if (e + eBias >= eMax) { m = 0 e = eMax } else if (e + eBias >= 1) { m = ((value * c) - 1) * Math.pow(2, mLen) e = e + eBias } else { m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) e = 0 } } for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} e = (e << mLen) | m eLen += mLen for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} buffer[offset + i - d] |= s * 128 } /***/ }), /***/ "./node_modules/isarray/index.js": /*!***************************************!*\ !*** ./node_modules/isarray/index.js ***! \***************************************/ /*! no static exports found */ /***/ (function(module, exports) { var toString = {}.toString; module.exports = Array.isArray || function (arr) { return toString.call(arr) == '[object Array]'; }; /***/ }), /***/ "./node_modules/webpack/buildin/global.js": /*!***********************************!*\ !*** (webpack)/buildin/global.js ***! \***********************************/ /*! no static exports found */ /***/ (function(module, exports) { var g; // This works in non-strict mode g = (function() { return this; })(); try { // This works if eval is allowed (see CSP) g = g || new Function("return this")(); } catch (e) { // This works if the window reference is available if (typeof window === "object") g = window; } // g can still be undefined, but nothing to do about it... // We return undefined, instead of nothing here, so it's // easier to handle this case. if(!global) { ...} module.exports = g; /***/ }), /***/ "./polyfills.js": /*!**********************!*\ !*** ./polyfills.js ***! \**********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; __webpack_require__(/*! core-js/features/promise */ "./node_modules/core-js/features/promise/index.js"); __webpack_require__(/*! core-js/features/function/bind */ "./node_modules/core-js/features/function/bind.js"); __webpack_require__(/*! core-js/features/object/assign */ "./node_modules/core-js/features/object/assign.js"); __webpack_require__(/*! core-js/features/array/find */ "./node_modules/core-js/features/array/find.js"); __webpack_require__(/*! core-js/features/array/some */ "./node_modules/core-js/features/array/some.js"); __webpack_require__(/*! core-js/features/array/is-array */ "./node_modules/core-js/features/array/is-array.js"); __webpack_require__(/*! core-js/features/array/splice */ "./node_modules/core-js/features/array/splice.js"); /***/ }), /***/ "./src/AccessTokenEvents.js": /*!**********************************!*\ !*** ./src/AccessTokenEvents.js ***! \**********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AccessTokenEvents = undefined; var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); var _Timer = __webpack_require__(/*! ./Timer.js */ "./src/Timer.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var DefaultAccessTokenExpiringNotificationTime = 60; // seconds var AccessTokenEvents = exports.AccessTokenEvents = function () { function AccessTokenEvents() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$accessTokenExpir = _ref.accessTokenExpiringNotificationTime, accessTokenExpiringNotificationTime = _ref$accessTokenExpir === undefined ? DefaultAccessTokenExpiringNotificationTime : _ref$accessTokenExpir, _ref$accessTokenExpir2 = _ref.accessTokenExpiringTimer, accessTokenExpiringTimer = _ref$accessTokenExpir2 === undefined ? new _Timer.Timer("Access token expiring") : _ref$accessTokenExpir2, _ref$accessTokenExpir3 = _ref.accessTokenExpiredTimer, accessTokenExpiredTimer = _ref$accessTokenExpir3 === undefined ? new _Timer.Timer("Access token expired") : _ref$accessTokenExpir3; _classCallCheck(this, AccessTokenEvents); this._accessTokenExpiringNotificationTime = accessTokenExpiringNotificationTime; this._accessTokenExpiring = accessTokenExpiringTimer; this._accessTokenExpired = accessTokenExpiredTimer; } AccessTokenEvents.prototype.load = function load(container) { // only register events if there's an access token and it has an expiration if (container.access_token && container.expires_in !== undefined) { var duration = container.expires_in; _Log.Log.debug("AccessTokenEvents.load: access token present, remaining duration:", duration); if (duration > 0) { // only register expiring if we still have time var expiring = duration - this._accessTokenExpiringNotificationTime; if (expiring <= 0) { expiring = 1; } _Log.Log.debug("AccessTokenEvents.load: registering expiring timer in:", expiring); this._accessTokenExpiring.init(expiring); } else { _Log.Log.debug("AccessTokenEvents.load: canceling existing expiring timer becase we're past expiration."); this._accessTokenExpiring.cancel(); } // if it's negative, it will still fire var expired = duration + 1; _Log.Log.debug("AccessTokenEvents.load: registering expired timer in:", expired); this._accessTokenExpired.init(expired); } else { this._accessTokenExpiring.cancel(); this._accessTokenExpired.cancel(); } }; AccessTokenEvents.prototype.unload = function unload() { _Log.Log.debug("AccessTokenEvents.unload: canceling existing access token timers"); this._accessTokenExpiring.cancel(); this._accessTokenExpired.cancel(); }; AccessTokenEvents.prototype.addAccessTokenExpiring = function addAccessTokenExpiring(cb) { this._accessTokenExpiring.addHandler(cb); }; AccessTokenEvents.prototype.removeAccessTokenExpiring = function removeAccessTokenExpiring(cb) { this._accessTokenExpiring.removeHandler(cb); }; AccessTokenEvents.prototype.addAccessTokenExpired = function addAccessTokenExpired(cb) { this._accessTokenExpired.addHandler(cb); }; AccessTokenEvents.prototype.removeAccessTokenExpired = function removeAccessTokenExpired(cb) { this._accessTokenExpired.removeHandler(cb); }; return AccessTokenEvents; }(); /***/ }), /***/ "./src/CheckSessionIFrame.js": /*!***********************************!*\ !*** ./src/CheckSessionIFrame.js ***! \***********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CheckSessionIFrame = undefined; var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var DefaultInterval = 2000; var CheckSessionIFrame = exports.CheckSessionIFrame = function () { function CheckSessionIFrame(callback, client_id, url, interval) { var stopOnError = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; _classCallCheck(this, CheckSessionIFrame); this._callback = callback; this._client_id = client_id; this._url = url; this._interval = interval || DefaultInterval; this._stopOnError = stopOnError; var idx = url.indexOf("/", url.indexOf("//") + 2); this._frame_origin = url.substr(0, idx); this._frame = window.document.createElement("iframe"); // shotgun approach this._frame.style.visibility = "hidden"; this._frame.style.position = "absolute"; this._frame.style.display = "none"; this._frame.width = 0; this._frame.height = 0; this._frame.src = url; } CheckSessionIFrame.prototype.load = function load() { var _this = this; return new Promise(function (resolve) { _this._frame.onload = function () { resolve(); }; window.document.body.appendChild(_this._frame); _this._boundMessageEvent = _this._message.bind(_this); window.addEventListener("message", _this._boundMessageEvent, false); }); }; CheckSessionIFrame.prototype._message = function _message(e) { if (e.origin === this._frame_origin && e.source === this._frame.contentWindow) { if (e.data === "error") { _Log.Log.error("CheckSessionIFrame: error message from check session op iframe"); if (this._stopOnError) { this.stop(); } } else if (e.data === "changed") { _Log.Log.debug("CheckSessionIFrame: changed message from check session op iframe"); this.stop(); this._callback(); } else { _Log.Log.debug("CheckSessionIFrame: " + e.data + " message from check session op iframe"); } } }; CheckSessionIFrame.prototype.start = function start(session_state) { var _this2 = this; if (this._session_state !== session_state) { _Log.Log.debug("CheckSessionIFrame.start"); this.stop(); this._session_state = session_state; var send = function send() { _this2._frame.contentWindow.postMessage(_this2._client_id + " " + _this2._session_state, _this2._frame_origin); }; // trigger now send(); // and setup timer this._timer = window.setInterval(send, this._interval); } }; CheckSessionIFrame.prototype.stop = function stop() { this._session_state = null; if (this._timer) { _Log.Log.debug("CheckSessionIFrame.stop"); window.clearInterval(this._timer); this._timer = null; } }; return CheckSessionIFrame; }(); /***/ }), /***/ "./src/ClockService.js": /*!*****************************!*\ !*** ./src/ClockService.js ***! \*****************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var ClockService = exports.ClockService = function () { function ClockService() { _classCallCheck(this, ClockService); } ClockService.prototype.getEpochTime = function getEpochTime() { return Promise.resolve(Date.now() / 1000 | 0); }; return ClockService; }(); /***/ }), /***/ "./src/CordovaIFrameNavigator.js": /*!***************************************!*\ !*** ./src/CordovaIFrameNavigator.js ***! \***************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CordovaIFrameNavigator = undefined; var _CordovaPopupWindow = __webpack_require__(/*! ./CordovaPopupWindow.js */ "./src/CordovaPopupWindow.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var CordovaIFrameNavigator = exports.CordovaIFrameNavigator = function () { function CordovaIFrameNavigator() { _classCallCheck(this, CordovaIFrameNavigator); } CordovaIFrameNavigator.prototype.prepare = function prepare(params) { params.popupWindowFeatures = 'hidden=yes'; var popup = new _CordovaPopupWindow.CordovaPopupWindow(params); return Promise.resolve(popup); }; return CordovaIFrameNavigator; }(); /***/ }), /***/ "./src/CordovaPopupNavigator.js": /*!**************************************!*\ !*** ./src/CordovaPopupNavigator.js ***! \**************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CordovaPopupNavigator = undefined; var _CordovaPopupWindow = __webpack_require__(/*! ./CordovaPopupWindow.js */ "./src/CordovaPopupWindow.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var CordovaPopupNavigator = exports.CordovaPopupNavigator = function () { function CordovaPopupNavigator() { _classCallCheck(this, CordovaPopupNavigator); } CordovaPopupNavigator.prototype.prepare = function prepare(params) { var popup = new _CordovaPopupWindow.CordovaPopupWindow(params); return Promise.resolve(popup); }; return CordovaPopupNavigator; }(); /***/ }), /***/ "./src/CordovaPopupWindow.js": /*!***********************************!*\ !*** ./src/CordovaPopupWindow.js ***! \***********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CordovaPopupWindow = undefined; var _createClass = function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var DefaultPopupFeatures = 'location=no,toolbar=no,zoom=no'; var DefaultPopupTarget = "_blank"; var CordovaPopupWindow = exports.CordovaPopupWindow = function () { function CordovaPopupWindow(params) { var _this = this; _classCallCheck(this, CordovaPopupWindow); this._promise = new Promise(function (resolve, reject) { _this._resolve = resolve; _this._reject = reject; }); this.features = params.popupWindowFeatures || DefaultPopupFeatures; this.target = params.popupWindowTarget || DefaultPopupTarget; this.redirect_uri = params.startUrl; _Log.Log.debug("CordovaPopupWindow.ctor: redirect_uri: " + this.redirect_uri); } CordovaPopupWindow.prototype._isInAppBrowserInstalled = function _isInAppBrowserInstalled(cordovaMetadata) { return ["cordova-plugin-inappbrowser", "cordova-plugin-inappbrowser.inappbrowser", "org.apache.cordova.inappbrowser"].some(function (name) { return cordovaMetadata.hasOwnProperty(name); }); }; CordovaPopupWindow.prototype.navigate = function navigate(params) { if (!params || !params.url) { this._error("No url provided"); } else { if (!window.cordova) { return this._error("cordova is undefined"); } var cordovaMetadata = window.cordova.require("cordova/plugin_list").metadata; if (this._isInAppBrowserInstalled(cordovaMetadata) === false) { return this._error("InAppBrowser plugin not found"); } this._popup = cordova.InAppBrowser.open(params.url, this.target, this.features); if (this._popup) { _Log.Log.debug("CordovaPopupWindow.navigate: popup successfully created"); this._exitCallbackEvent = this._exitCallback.bind(this); this._loadStartCallbackEvent = this._loadStartCallback.bind(this); this._popup.addEventListener("exit", this._exitCallbackEvent, false); this._popup.addEventListener("loadstart", this._loadStartCallbackEvent, false); } else { this._error("Error opening popup window"); } } return this.promise; }; CordovaPopupWindow.prototype._loadStartCallback = function _loadStartCallback(event) { if (event.url.indexOf(this.redirect_uri) === 0) { this._success({ url: event.url }); } }; CordovaPopupWindow.prototype._exitCallback = function _exitCallback(message) { this._error(message); }; CordovaPopupWindow.prototype._success = function _success(data) { this._cleanup(); _Log.Log.debug("CordovaPopupWindow: Successful response from cordova popup window"); this._resolve(data); }; CordovaPopupWindow.prototype._error = function _error(message) { this._cleanup(); _Log.Log.error(message); this._reject(new Error(message)); }; CordovaPopupWindow.prototype.close = function close() { this._cleanup(); }; CordovaPopupWindow.prototype._cleanup = function _cleanup() { if (this._popup) { _Log.Log.debug("CordovaPopupWindow: cleaning up popup"); this._popup.removeEventListener("exit", this._exitCallbackEvent, false); this._popup.removeEventListener("loadstart", this._loadStartCallbackEvent, false); this._popup.close(); } this._popup = null; }; _createClass(CordovaPopupWindow, [{ key: 'promise', get: function get() { return this._promise; } }]); return CordovaPopupWindow; }(); /***/ }), /***/ "./src/ErrorResponse.js": /*!******************************!*\ !*** ./src/ErrorResponse.js ***! \******************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ErrorResponse = undefined; var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var ErrorResponse = exports.ErrorResponse = function (_Error) { _inherits(ErrorResponse, _Error); function ErrorResponse() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, error = _ref.error, error_description = _ref.error_description, error_uri = _ref.error_uri, state = _ref.state, session_state = _ref.session_state; _classCallCheck(this, ErrorResponse); if (!error) { _Log.Log.error("No error passed to ErrorResponse"); throw new Error("error"); } var _this = _possibleConstructorReturn(this, _Error.call(this, error_description || error)); _this.name = "ErrorResponse"; _this.error = error; _this.error_description = error_description; _this.error_uri = error_uri; _this.state = state; _this.session_state = session_state; return _this; } return ErrorResponse; }(Error); /***/ }), /***/ "./src/Event.js": /*!**********************!*\ !*** ./src/Event.js ***! \**********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Event = undefined; var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var Event = exports.Event = function () { function Event(name) { _classCallCheck(this, Event); this._name = name; this._callbacks = []; } Event.prototype.addHandler = function addHandler(cb) { this._callbacks.push(cb); }; Event.prototype.removeHandler = function removeHandler(cb) { var idx = this._callbacks.findIndex(function (item) { return item === cb; }); if (idx >= 0) { this._callbacks.splice(idx, 1); } }; Event.prototype.raise = function raise() { _Log.Log.debug("Event: Raising event: " + this._name); for (var i = 0; i < this._callbacks.length; i++) { var _callbacks; (_callbacks = this._callbacks)[i].apply(_callbacks, arguments); } }; return Event; }(); /***/ }), /***/ "./src/Global.js": /*!***********************!*\ !*** ./src/Global.js ***! \***********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var timer = { setInterval: function (_setInterval) { function setInterval(_x, _x2) { return _setInterval.apply(this, arguments); } setInterval.toString = function () { return _setInterval.toString(); }; return setInterval; }(function (cb, duration) { return setInterval(cb, duration); }), clearInterval: function (_clearInterval) { function clearInterval(_x3) { return _clearInterval.apply(this, arguments); } clearInterval.toString = function () { return _clearInterval.toString(); }; return clearInterval; }(function (handle) { return clearInterval(handle); }) }; var testing = false; var request = null; var Global = exports.Global = function () { function Global() { _classCallCheck(this, Global); } Global._testing = function _testing() { testing = true; }; Global.setXMLHttpRequest = function setXMLHttpRequest(newRequest) { request = newRequest; }; _createClass(Global, null, [{ key: 'location', get: function get() { if (!testing) { return location; } } }, { key: 'localStorage', get: function get() { if (!testing && typeof window !== 'undefined') { return localStorage; } } }, { key: 'sessionStorage', get: function get() { if (!testing && typeof window !== 'undefined') { return sessionStorage; } } }, { key: 'XMLHttpRequest', get: function get() { if (!testing && typeof window !== 'undefined') { return request || XMLHttpRequest; } } }, { key: 'timer', get: function get() { if (!testing) { return timer; } } }]); return Global; }(); /***/ }), /***/ "./src/IFrameNavigator.js": /*!********************************!*\ !*** ./src/IFrameNavigator.js ***! \********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.IFrameNavigator = undefined; var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); var _IFrameWindow = __webpack_require__(/*! ./IFrameWindow.js */ "./src/IFrameWindow.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var IFrameNavigator = exports.IFrameNavigator = function () { function IFrameNavigator() { _classCallCheck(this, IFrameNavigator); } IFrameNavigator.prototype.prepare = function prepare(params) { var frame = new _IFrameWindow.IFrameWindow(params); return Promise.resolve(frame); }; IFrameNavigator.prototype.callback = function callback(url) { _Log.Log.debug("IFrameNavigator.callback"); try { _IFrameWindow.IFrameWindow.notifyParent(url); return Promise.resolve(); } catch (e) { return Promise.reject(e); } }; return IFrameNavigator; }(); /***/ }), /***/ "./src/IFrameWindow.js": /*!*****************************!*\ !*** ./src/IFrameWindow.js ***! \*****************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.IFrameWindow = undefined; var _createClass = function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var DefaultTimeout = 10000; var IFrameWindow = exports.IFrameWindow = function () { function IFrameWindow(params) { var _this = this; _classCallCheck(this, IFrameWindow); this._promise = new Promise(function (resolve, reject) { _this._resolve = resolve; _this._reject = reject; }); this._boundMessageEvent = this._message.bind(this); window.addEventListener("message", this._boundMessageEvent, false); this._frame = window.document.createElement("iframe"); // shotgun approach this._frame.style.visibility = "hidden"; this._frame.style.position = "absolute"; this._frame.width = 0; this._frame.height = 0; window.document.body.appendChild(this._frame); } IFrameWindow.prototype.navigate = function navigate(params) { if (!params || !params.url) { this._error("No url provided"); } else { var timeout = params.silentRequestTimeout || DefaultTimeout; _Log.Log.debug("IFrameWindow.navigate: Using timeout of:", timeout); this._timer = window.setTimeout(this._timeout.bind(this), timeout); this._frame.src = params.url; } return this.promise; }; IFrameWindow.prototype._success = function _success(data) { this._cleanup(); _Log.Log.debug("IFrameWindow: Successful response from frame window"); this._resolve(data); }; IFrameWindow.prototype._error = function _error(message) { this._cleanup(); _Log.Log.error(message); this._reject(new Error(message)); }; IFrameWindow.prototype.close = function close() { this._cleanup(); }; IFrameWindow.prototype._cleanup = function _cleanup() { if (this._frame) { _Log.Log.debug("IFrameWindow: cleanup"); window.removeEventListener("message", this._boundMessageEvent, false); window.clearTimeout(this._timer); window.document.body.removeChild(this._frame); this._timer = null; this._frame = null; this._boundMessageEvent = null; } }; IFrameWindow.prototype._timeout = function _timeout() { _Log.Log.debug("IFrameWindow.timeout"); this._error("Frame window timed out"); }; IFrameWindow.prototype._message = function _message(e) { _Log.Log.debug("IFrameWindow.message"); if (this._timer && e.origin === this._origin && e.source === this._frame.contentWindow && typeof e.data === 'string' && (e.data.startsWith('http://') || e.data.startsWith('https://'))) { var url = e.data; if (url) { this._success({ url: url }); } else { this._error("Invalid response from frame"); } } }; IFrameWindow.notifyParent = function notifyParent(url) { _Log.Log.debug("IFrameWindow.notifyParent"); url = url || window.location.href; if (url) { _Log.Log.debug("IFrameWindow.notifyParent: posting url message to parent"); window.parent.postMessage(url, location.protocol + "//" + location.host); } }; _createClass(IFrameWindow, [{ key: "promise", get: function get() { return this._promise; } }, { key: "_origin", get: function get() { return location.protocol + "//" + location.host; } }]); return IFrameWindow; }(); /***/ }), /***/ "./src/InMemoryWebStorage.js": /*!***********************************!*\ !*** ./src/InMemoryWebStorage.js ***! \***********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.InMemoryWebStorage = undefined; var _createClass = function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var InMemoryWebStorage = exports.InMemoryWebStorage = function () { function InMemoryWebStorage() { _classCallCheck(this, InMemoryWebStorage); this._data = {}; } InMemoryWebStorage.prototype.getItem = function getItem(key) { _Log.Log.debug("InMemoryWebStorage.getItem", key); return this._data[key]; }; InMemoryWebStorage.prototype.setItem = function setItem(key, value) { _Log.Log.debug("InMemoryWebStorage.setItem", key); this._data[key] = value; }; InMemoryWebStorage.prototype.removeItem = function removeItem(key) { _Log.Log.debug("InMemoryWebStorage.removeItem", key); delete this._data[key]; }; InMemoryWebStorage.prototype.key = function key(index) { return Object.getOwnPropertyNames(this._data)[index]; }; _createClass(InMemoryWebStorage, [{ key: "length", get: function get() { return Object.getOwnPropertyNames(this._data).length; } }]); return InMemoryWebStorage; }(); /***/ }), /***/ "./src/JoseUtil.js": /*!*************************!*\ !*** ./src/JoseUtil.js ***! \*************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.JoseUtil = undefined; var _jsrsasign = __webpack_require__(/*! ./crypto/jsrsasign */ "./src/crypto/jsrsasign.js"); var _JoseUtilImpl = __webpack_require__(/*! ./JoseUtilImpl */ "./src/JoseUtilImpl.js"); var _JoseUtilImpl2 = _interopRequireDefault(_JoseUtilImpl); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var JoseUtil = exports.JoseUtil = (0, _JoseUtilImpl2.default)({ jws: _jsrsasign.jws, KeyUtil: _jsrsasign.KeyUtil, X509: _jsrsasign.X509, crypto: _jsrsasign.crypto, hextob64u: _jsrsasign.hextob64u, b64tohex: _jsrsasign.b64tohex, AllowedSigningAlgs: _jsrsasign.AllowedSigningAlgs }); /***/ }), /***/ "./src/JoseUtilImpl.js": /*!*****************************!*\ !*** ./src/JoseUtilImpl.js ***! \*****************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = getJoseUtil; var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. function getJoseUtil(_ref) { var jws = _ref.jws, KeyUtil = _ref.KeyUtil, X509 = _ref.X509, crypto = _ref.crypto, hextob64u = _ref.hextob64u, b64tohex = _ref.b64tohex, AllowedSigningAlgs = _ref.AllowedSigningAlgs; return function () { function JoseUtil() { _classCallCheck(this, JoseUtil); } JoseUtil.parseJwt = function parseJwt(jwt) { _Log.Log.debug("JoseUtil.parseJwt"); try { var token = jws.JWS.parse(jwt); return { header: token.headerObj, payload: token.payloadObj }; } catch (e) { _Log.Log.error(e); } }; JoseUtil.validateJwt = function validateJwt(jwt, key, issuer, audience, clockSkew, now, timeInsensitive) { _Log.Log.debug("JoseUtil.validateJwt"); try { if (key.kty === "RSA") { if (key.e && key.n) { key = KeyUtil.getKey(key); } else if (key.x5c && key.x5c.length) { var hex = b64tohex(key.x5c[0]); key = X509.getPublicKeyFromCertHex(hex); } else { _Log.Log.error("JoseUtil.validateJwt: RSA key missing key material", key); return Promise.reject(new Error("RSA key missing key material")); } } else if (key.kty === "EC") { if (key.crv && key.x && key.y) { key = KeyUtil.getKey(key); } else { _Log.Log.error("JoseUtil.validateJwt: EC key missing key material", key); return Promise.reject(new Error("EC key missing key material")); } } else { _Log.Log.error("JoseUtil.validateJwt: Unsupported key type", key && key.kty); return Promise.reject(new Error( true && key.kty)); } return JoseUtil._validateJwt(jwt, key, issuer, audience, clockSkew, now, timeInsensitive); } catch (e) { _Log.Log.error(e && e.message || e); return Promise.reject("JWT validation failed"); } }; JoseUtil.validateJwtAttributes = function validateJwtAttributes(jwt, issuer, audience, clockSkew, now, timeInsensitive) { if (!clockSkew) { clockSkew = 0; } if (!now) { now = parseInt(Date.now() / 1000); } var payload = JoseUtil.parseJwt(jwt).payload; if (!payload.iss) { _Log.Log.error("JoseUtil._validateJwt: issuer was not provided"); return Promise.reject(new Error("issuer was not provided")); } if (payload.iss !== issuer) { _Log.Log.error("JoseUtil._validateJwt: Invalid issuer in token", payload.iss); return Promise.reject(new Error("Invalid issuer in token: " + payload.iss)); } if (!payload.aud) { _Log.Log.error("JoseUtil._validateJwt: aud was not provided"); return Promise.reject(new Error("aud was not provided")); } var validAudience = payload.aud === audience || Array.isArray(payload.aud) && payload.aud.indexOf(audience) >= 0; if (!validAudience) { _Log.Log.error("JoseUtil._validateJwt: Invalid audience in token", payload.aud); return Promise.reject(new Error("Invalid audience in token: " + payload.aud)); } if (payload.azp && payload.azp !== audience) { _Log.Log.error("JoseUtil._validateJwt: Invalid azp in token", payload.azp); return Promise.reject(new Error("Invalid azp in token: " + payload.azp)); } if (!timeInsensitive) { var lowerNow = now + clockSkew; var upperNow = now - clockSkew; if (!payload.iat) { _Log.Log.error("JoseUtil._validateJwt: iat was not provided"); return Promise.reject(new Error("iat was not provided")); } if (lowerNow < payload.iat) { _Log.Log.error("JoseUtil._validateJwt: iat is in the future", payload.iat); return Promise.reject(new Error("iat is in the future: " + payload.iat)); } if (payload.nbf && lowerNow < payload.nbf) { _Log.Log.error("JoseUtil._validateJwt: nbf is in the future", payload.nbf); return Promise.reject(new Error("nbf is in the future: " + payload.nbf)); } if (!payload.exp) { _Log.Log.error("JoseUtil._validateJwt: exp was not provided"); return Promise.reject(new Error("exp was not provided")); } if (payload.exp < upperNow) { _Log.Log.error("JoseUtil._validateJwt: exp is in the past", payload.exp); return Promise.reject(new Error("exp is in the past:" + payload.exp)); } } return Promise.resolve(payload); }; JoseUtil._validateJwt = function _validateJwt(jwt, key, issuer, audience, clockSkew, now, timeInsensitive) { return JoseUtil.validateJwtAttributes(jwt, issuer, audience, clockSkew, now, timeInsensitive).then(function (payload) { try { if (!jws.JWS.verify(jwt, key, AllowedSigningAlgs)) { _Log.Log.error("JoseUtil._validateJwt: signature validation failed"); return Promise.reject(new Error("signature validation failed")); } return payload; } catch (e) { _Log.Log.error(e && e.message || e); return Promise.reject(new Error("signature validation failed")); } }); }; JoseUtil.hashString = function hashString(value, alg) { try { return crypto.Util.hashString(value, alg); } catch (e) { _Log.Log.error(e); } }; JoseUtil.hexToBase64Url = function hexToBase64Url(value) { try { return hextob64u(value); } catch (e) { _Log.Log.error(e); } }; return JoseUtil; }(); } module.exports = exports["default"]; /***/ }), /***/ "./src/JsonService.js": /*!****************************!*\ !*** ./src/JsonService.js ***! \****************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.JsonService = undefined; var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); var _Global = __webpack_require__(/*! ./Global.js */ "./src/Global.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var JsonService = exports.JsonService = function () { function JsonService() { var additionalContentTypes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; var XMLHttpRequestCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _Global.Global.XMLHttpRequest; var jwtHandler = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; _classCallCheck(this, JsonService); if (additionalContentTypes && Array.isArray(additionalContentTypes)) { this._contentTypes = additionalContentTypes.slice(); } else { this._contentTypes = []; } this._contentTypes.push('application/json'); if (jwtHandler) { this._contentTypes.push('application/jwt'); } this._XMLHttpRequest = XMLHttpRequestCtor; this._jwtHandler = jwtHandler; } JsonService.prototype.getJson = function getJson(url, token) { var _this = this; if (!url) { _Log.Log.error("JsonService.getJson: No url passed"); throw new Error("url"); } _Log.Log.debug("JsonService.getJson, url: ", url); return new Promise(function (resolve, reject) { var req = new _this._XMLHttpRequest(); req.open('GET', url); var allowedContentTypes = _this._contentTypes; var jwtHandler = _this._jwtHandler; req.onload = function () { _Log.Log.debug("JsonService.getJson: HTTP response received, status", req.status); if (req.status === 200) { var contentType = req.getResponseHeader("Content-Type"); if (contentType) { var found = allowedContentTypes.find(function (item) { if (contentType.startsWith(item)) { return true; } }); if (found == "application/jwt") { jwtHandler(req).then(resolve, reject); return; } if (found) { try { resolve(JSON.parse(req.responseText)); return; } catch (e) { _Log.Log.error("JsonService.getJson: Error parsing JSON response", e.message); reject(e); return; } } } reject(Error("Invalid response Content-Type: " + contentType + ", from URL: " + url)); } else { reject(Error(req.statusText + " (" + req.status + ")")); } }; req.onerror = function () { _Log.Log.error("JsonService.getJson: network error"); reject(Error("Network Error")); }; if (token) { _Log.Log.debug("JsonService.getJson: token passed, setting Authorization header"); req.setRequestHeader("Authorization", "Bearer " + token); } req.send(); }); }; JsonService.prototype.postForm = function postForm(url, payload, basicAuth) { var _this2 = this; if (!url) { _Log.Log.error("JsonService.postForm: No url passed"); throw new Error("url"); } _Log.Log.debug("JsonService.postForm, url: ", url); return new Promise(function (resolve, reject) { var req = new _this2._XMLHttpRequest(); req.open('POST', url); var allowedContentTypes = _this2._contentTypes; req.onload = function () { _Log.Log.debug("JsonService.postForm: HTTP response received, status", req.status); if (req.status === 200) { var contentType = req.getResponseHeader("Content-Type"); if (contentType) { var found = allowedContentTypes.find(function (item) { if (contentType.startsWith(item)) { return true; } }); if (found) { try { resolve(JSON.parse(req.responseText)); return; } catch (e) { _Log.Log.error("JsonService.postForm: Error parsing JSON response", e.message); reject(e); return; } } } reject(Error("Invalid response Content-Type: " + contentType + ", from URL: " + url)); return; } if (req.status === 400) { var contentType = req.getResponseHeader("Content-Type"); if (contentType) { var found = allowedContentTypes.find(function (item) { if (contentType.startsWith(item)) { return true; } }); if (found) { try { var payload = JSON.parse(req.responseText); if (payload && payload.error) { _Log.Log.error("JsonService.postForm: Error from server: ", payload.error); reject(new Error(payload.error)); return; } } catch (e) { _Log.Log.error("JsonService.postForm: Error parsing JSON response", e.message); reject(e); return; } } } } reject(Error(req.statusText + " (" + req.status + ")")); }; req.onerror = function () { _Log.Log.error("JsonService.postForm: network error"); reject(Error("Network Error")); }; var body = ""; for (var key in payload) { var value = payload[key]; if (value) { if (body.length > 0) { body += "&"; } body += encodeURIComponent(key); body += "="; body += encodeURIComponent(value); } } req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); if (basicAuth !== undefined) { req.setRequestHeader("Authorization", "Basic " + btoa(basicAuth)); } req.send(body); }); }; return JsonService; }(); /***/ }), /***/ "./src/Log.js": /*!********************!*\ !*** ./src/Log.js ***! \********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var nopLogger = { debug: function debug() {}, info: function info() {}, warn: function warn() {}, error: function error() {} }; var NONE = 0; var ERROR = 1; var WARN = 2; var INFO = 3; var DEBUG = 4; var logger = void 0; var level = void 0; var Log = exports.Log = function () { function Log() { _classCallCheck(this, Log); } Log.reset = function reset() { level = INFO; logger = nopLogger; }; Log.debug = function debug() { if (level >= DEBUG) { for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } logger.debug.apply(logger, Array.from(args)); } }; Log.info = function info() { if (level >= INFO) { for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } logger.info.apply(logger, Array.from(args)); } }; Log.warn = function warn() { if (level >= WARN) { for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { args[_key3] = arguments[_key3]; } logger.warn.apply(logger, Array.from(args)); } }; Log.error = function error() { if (level >= ERROR) { for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { args[_key4] = arguments[_key4]; } logger.error.apply(logger, Array.from(args)); } }; _createClass(Log, null, [{ key: "NONE", get: function get() { return NONE; } }, { key: "ERROR", get: function get() { return ERROR; } }, { key: "WARN", get: function get() { return WARN; } }, { key: "INFO", get: function get() { return INFO; } }, { key: "DEBUG", get: function get() { return DEBUG; } }, { key: "level", get: function get() { return level; }, set: function set(value) { if (NONE <= value && value <= DEBUG) { level = value; } else { throw new Error("Invalid log level"); } } }, { key: "logger", get: function get() { return logger; }, set: function set(value) { if (!value.debug && value.info) { // just to stay backwards compat. can remove in 2.0 value.debug = value.info; } if (value.debug && value.info && value.warn && value.error) { logger = value; } else { throw new Error("Invalid logger"); } } }]); return Log; }(); Log.reset(); /***/ }), /***/ "./src/MetadataService.js": /*!********************************!*\ !*** ./src/MetadataService.js ***! \********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MetadataService = undefined; var _createClass = function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); var _JsonService = __webpack_require__(/*! ./JsonService.js */ "./src/JsonService.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var OidcMetadataUrlPath = '.well-known/openid-configuration'; var MetadataService = exports.MetadataService = function () { function MetadataService(settings) { var JsonServiceCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _JsonService.JsonService; _classCallCheck(this, MetadataService); if (!settings) { _Log.Log.error("MetadataService: No settings passed to MetadataService"); throw new Error("settings"); } this._settings = settings; this._jsonService = new JsonServiceCtor(['application/jwk-set+json']); } MetadataService.prototype.resetSigningKeys = function resetSigningKeys() { this._settings = this._settings || {}; this._settings.signingKeys = undefined; }; MetadataService.prototype.getMetadata = function getMetadata() { var _this = this; if (this._settings.metadata) { _Log.Log.debug("MetadataService.getMetadata: Returning metadata from settings"); return Promise.resolve(this._settings.metadata); } if (!this.metadataUrl) { _Log.Log.error("MetadataService.getMetadata: No authority or metadataUrl configured on settings"); return Promise.reject(new Error("No authority or metadataUrl configured on settings")); } _Log.Log.debug("MetadataService.getMetadata: getting metadata from", this.metadataUrl); return this._jsonService.getJson(this.metadataUrl).then(function (metadata) { _Log.Log.debug("MetadataService.getMetadata: json received"); var seed = _this._settings.metadataSeed || {}; _this._settings.metadata = Object.assign({}, seed, metadata); return _this._settings.metadata; }); }; MetadataService.prototype.getIssuer = function getIssuer() { return this._getMetadataProperty("issuer"); }; MetadataService.prototype.getAuthorizationEndpoint = function getAuthorizationEndpoint() { return this._getMetadataProperty("authorization_endpoint"); }; MetadataService.prototype.getUserInfoEndpoint = function getUserInfoEndpoint() { return this._getMetadataProperty("userinfo_endpoint"); }; MetadataService.prototype.getTokenEndpoint = function getTokenEndpoint() { var optional = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; return this._getMetadataProperty("token_endpoint", optional); }; MetadataService.prototype.getCheckSessionIframe = function getCheckSessionIframe() { return this._getMetadataProperty("check_session_iframe", true); }; MetadataService.prototype.getEndSessionEndpoint = function getEndSessionEndpoint() { return this._getMetadataProperty("end_session_endpoint", true); }; MetadataService.prototype.getRevocationEndpoint = function getRevocationEndpoint() { return this._getMetadataProperty("revocation_endpoint", true); }; MetadataService.prototype.getKeysEndpoint = function getKeysEndpoint() { return this._getMetadataProperty("jwks_uri", true); }; MetadataService.prototype._getMetadataProperty = function _getMetadataProperty(name) { var optional = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; _Log.Log.debug("MetadataService.getMetadataProperty for: " + name); return this.getMetadata().then(function (metadata) { _Log.Log.debug("MetadataService.getMetadataProperty: metadata recieved"); if (metadata[name] === undefined) { if (optional === true) { _Log.Log.warn("MetadataService.getMetadataProperty: Metadata does not contain optional property " + name); return undefined; } else { _Log.Log.error("MetadataService.getMetadataProperty: Metadata does not contain property " + name); throw new Error("Metadata does not contain property " + name); } } return metadata[name]; }); }; MetadataService.prototype.getSigningKeys = function getSigningKeys() { var _this2 = this; if (this._settings.signingKeys) { _Log.Log.debug("MetadataService.getSigningKeys: Returning signingKeys from settings"); return Promise.resolve(this._settings.signingKeys); } return this._getMetadataProperty("jwks_uri").then(function (jwks_uri) { _Log.Log.debug("MetadataService.getSigningKeys: jwks_uri received", jwks_uri); return _this2._jsonService.getJson(jwks_uri).then(function (keySet) { _Log.Log.debug("MetadataService.getSigningKeys: key set received", keySet); if (!keySet.keys) { _Log.Log.error("MetadataService.getSigningKeys: Missing keys on keyset"); throw new Error("Missing keys on keyset"); } _this2._settings.signingKeys = keySet.keys; return _this2._settings.signingKeys; }); }); }; _createClass(MetadataService, [{ key: 'metadataUrl', get: function get() { if (!this._metadataUrl) { if (this._settings.metadataUrl) { this._metadataUrl = this._settings.metadataUrl; } else { this._metadataUrl = this._settings.authority; if (this._metadataUrl && this._metadataUrl.indexOf(OidcMetadataUrlPath) < 0) { if (this._metadataUrl[this._metadataUrl.length - 1] !== '/') { this._metadataUrl += '/'; } this._metadataUrl += OidcMetadataUrlPath; } } } return this._metadataUrl; } }]); return MetadataService; }(); /***/ }), /***/ "./src/OidcClient.js": /*!***************************!*\ !*** ./src/OidcClient.js ***! \***************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.OidcClient = undefined; var _createClass = function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); var _OidcClientSettings = __webpack_require__(/*! ./OidcClientSettings.js */ "./src/OidcClientSettings.js"); var _ErrorResponse = __webpack_require__(/*! ./ErrorResponse.js */ "./src/ErrorResponse.js"); var _SigninRequest = __webpack_require__(/*! ./SigninRequest.js */ "./src/SigninRequest.js"); var _SigninResponse = __webpack_require__(/*! ./SigninResponse.js */ "./src/SigninResponse.js"); var _SignoutRequest = __webpack_require__(/*! ./SignoutRequest.js */ "./src/SignoutRequest.js"); var _SignoutResponse = __webpack_require__(/*! ./SignoutResponse.js */ "./src/SignoutResponse.js"); var _SigninState = __webpack_require__(/*! ./SigninState.js */ "./src/SigninState.js"); var _State = __webpack_require__(/*! ./State.js */ "./src/State.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var OidcClient = exports.OidcClient = function () { function OidcClient() { var settings = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, OidcClient); if (settings instanceof _OidcClientSettings.OidcClientSettings) { this._settings = settings; } else { this._settings = new _OidcClientSettings.OidcClientSettings(settings); } } OidcClient.prototype.createSigninRequest = function createSigninRequest() { var _this = this; var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, response_type = _ref.response_type, scope = _ref.scope, redirect_uri = _ref.redirect_uri, data = _ref.data, state = _ref.state, prompt = _ref.prompt, display = _ref.display, max_age = _ref.max_age, ui_locales = _ref.ui_locales, id_token_hint = _ref.id_token_hint, login_hint = _ref.login_hint, acr_values = _ref.acr_values, resource = _ref.resource, request = _ref.request, request_uri = _ref.request_uri, response_mode = _ref.response_mode, extraQueryParams = _ref.extraQueryParams, extraTokenParams = _ref.extraTokenParams, request_type = _ref.request_type, skipUserInfo = _ref.skipUserInfo; var stateStore = arguments[1]; _Log.Log.debug("OidcClient.createSigninRequest"); var client_id = this._settings.client_id; response_type = response_type || this._settings.response_type; scope = scope || this._settings.scope; redirect_uri = redirect_uri || this._settings.redirect_uri; // id_token_hint, login_hint aren't allowed on _settings prompt = prompt || this._settings.prompt; display = display || this._settings.display; max_age = max_age || this._settings.max_age; ui_locales = ui_locales || this._settings.ui_locales; acr_values = acr_values || this._settings.acr_values; resource = resource || this._settings.resource; response_mode = response_mode || this._settings.response_mode; extraQueryParams = extraQueryParams || this._settings.extraQueryParams; extraTokenParams = extraTokenParams || this._settings.extraTokenParams; var authority = this._settings.authority; if (_SigninRequest.SigninRequest.isCode(response_type) && response_type !== "code") { return Promise.reject(new Error("OpenID Connect hybrid flow is not supported")); } return this._metadataService.getAuthorizationEndpoint().then(function (url) { _Log.Log.debug("OidcClient.createSigninRequest: Received authorization endpoint", url); var signinRequest = new _SigninRequest.SigninRequest({ url: url, client_id: client_id, redirect_uri: redirect_uri, response_type: response_type, scope: scope, data: data || state, authority: authority, prompt: prompt, display: display, max_age: max_age, ui_locales: ui_locales, id_token_hint: id_token_hint, login_hint: login_hint, acr_values: acr_values, resource: resource, request: request, request_uri: request_uri, extraQueryParams: extraQueryParams, extraTokenParams: extraTokenParams, request_type: request_type, response_mode: response_mode, client_secret: _this._settings.client_secret, skipUserInfo: skipUserInfo }); var signinState = signinRequest.state; stateStore = stateStore || _this._stateStore; return stateStore.set(signinState.id, signinState.toStorageString()).then(function () { return signinRequest; }); }); }; OidcClient.prototype.readSigninResponseState = function readSigninResponseState(url, stateStore) { var removeState = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; _Log.Log.debug("OidcClient.readSigninResponseState"); var useQuery = this._settings.response_mode === "query" || !this._settings.response_mode && _SigninRequest.SigninRequest.isCode(this._settings.response_type); var delimiter = useQuery ? "?" : "#"; var response = new _SigninResponse.SigninResponse(url, delimiter); if (!response.state) { _Log.Log.error("OidcClient.readSigninResponseState: No state in response"); return Promise.reject(new Error("No state in response")); } stateStore = stateStore || this._stateStore; var stateApi = removeState ? stateStore.remove.bind(stateStore) : stateStore.get.bind(stateStore); return stateApi(response.state).then(function (storedStateString) { if (!storedStateString) { _Log.Log.error("OidcClient.readSigninResponseState: No matching state found in storage"); throw new Error("No matching state found in storage"); } var state = _SigninState.SigninState.fromStorageString(storedStateString); return { state: state, response: response }; }); }; OidcClient.prototype.processSigninResponse = function processSigninResponse(url, stateStore) { var _this2 = this; _Log.Log.debug("OidcClient.processSigninResponse"); return this.readSigninResponseState(url, stateStore, true).then(function (_ref2) { var state = _ref2.state, response = _ref2.response; _Log.Log.debug("OidcClient.processSigninResponse: Received state from storage; validating response"); return _this2._validator.validateSigninResponse(state, response); }); }; OidcClient.prototype.createSignoutRequest = function createSignoutRequest() { var _this3 = this; var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, id_token_hint = _ref3.id_token_hint, data = _ref3.data, state = _ref3.state, post_logout_redirect_uri = _ref3.post_logout_redirect_uri, extraQueryParams = _ref3.extraQueryParams, request_type = _ref3.request_type; var stateStore = arguments[1]; _Log.Log.debug("OidcClient.createSignoutRequest"); post_logout_redirect_uri = post_logout_redirect_uri || this._settings.post_logout_redirect_uri; extraQueryParams = extraQueryParams || this._settings.extraQueryParams; return this._metadataService.getEndSessionEndpoint().then(function (url) { if (!url) { _Log.Log.error("OidcClient.createSignoutRequest: No end session endpoint url returned"); throw new Error("no end session endpoint"); } _Log.Log.debug("OidcClient.createSignoutRequest: Received end session endpoint", url); var request = new _SignoutRequest.SignoutRequest({ url: url, id_token_hint: id_token_hint, post_logout_redirect_uri: post_logout_redirect_uri, data: data || state, extraQueryParams: extraQueryParams, request_type: request_type }); var signoutState = request.state; if (signoutState) { _Log.Log.debug("OidcClient.createSignoutRequest: Signout request has state to persist"); stateStore = stateStore || _this3._stateStore; stateStore.set(signoutState.id, signoutState.toStorageString()); } return request; }); }; OidcClient.prototype.readSignoutResponseState = function readSignoutResponseState(url, stateStore) { var removeState = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; _Log.Log.debug("OidcClient.readSignoutResponseState"); var response = new _SignoutResponse.SignoutResponse(url); if (!response.state) { _Log.Log.debug("OidcClient.readSignoutResponseState: No state in response"); if (response.error) { _Log.Log.warn("OidcClient.readSignoutResponseState: Response was error: ", response.error); return Promise.reject(new _ErrorResponse.ErrorResponse(response)); } return Promise.resolve({ state: undefined, response: response }); } var stateKey = response.state; stateStore = stateStore || this._stateStore; var stateApi = removeState ? stateStore.remove.bind(stateStore) : stateStore.get.bind(stateStore); return stateApi(stateKey).then(function (storedStateString) { if (!storedStateString) { _Log.Log.error("OidcClient.readSignoutResponseState: No matching state found in storage"); throw new Error("No matching state found in storage"); } var state = _State.State.fromStorageString(storedStateString); return { state: state, response: response }; }); }; OidcClient.prototype.processSignoutResponse = function processSignoutResponse(url, stateStore) { var _this4 = this; _Log.Log.debug("OidcClient.processSignoutResponse"); return this.readSignoutResponseState(url, stateStore, true).then(function (_ref4) { var state = _ref4.state, response = _ref4.response; if (state) { _Log.Log.debug("OidcClient.processSignoutResponse: Received state from storage; validating response"); return _this4._validator.validateSignoutResponse(state, response); } else { _Log.Log.debug("OidcClient.processSignoutResponse: No state from storage; skipping validating response"); return response; } }); }; OidcClient.prototype.clearStaleState = function clearStaleState(stateStore) { _Log.Log.debug("OidcClient.clearStaleState"); stateStore = stateStore || this._stateStore; return _State.State.clearStaleState(stateStore, this.settings.staleStateAge); }; _createClass(OidcClient, [{ key: '_stateStore', get: function get() { return this.settings.stateStore; } }, { key: '_validator', get: function get() { return this.settings.validator; } }, { key: '_metadataService', get: function get() { return this.settings.metadataService; } }, { key: 'settings', get: function get() { return this._settings; } }, { key: 'metadataService', get: function get() { return this._metadataService; } }]); return OidcClient; }(); /***/ }), /***/ "./src/OidcClientSettings.js": /*!***********************************!*\ !*** ./src/OidcClientSettings.js ***! \***********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.OidcClientSettings = undefined; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var _createClass = function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); var _ClockService = __webpack_require__(/*! ./ClockService.js */ "./src/ClockService.js"); var _WebStorageStateStore = __webpack_require__(/*! ./WebStorageStateStore.js */ "./src/WebStorageStateStore.js"); var _ResponseValidator = __webpack_require__(/*! ./ResponseValidator.js */ "./src/ResponseValidator.js"); var _MetadataService = __webpack_require__(/*! ./MetadataService.js */ "./src/MetadataService.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var OidcMetadataUrlPath = '.well-known/openid-configuration'; var DefaultResponseType = "id_token"; var DefaultScope = "openid"; var DefaultClientAuthentication = "client_secret_post"; // The default value must be client_secret_basic, as explained in https://openid.net/specs/openid-connect-core-1_0.html#ClientAuthentication var DefaultStaleStateAge = 60 * 15; // seconds var DefaultClockSkewInSeconds = 60 * 5; var OidcClientSettings = exports.OidcClientSettings = function () { function OidcClientSettings() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, authority = _ref.authority, metadataUrl = _ref.metadataUrl, metadata = _ref.metadata, signingKeys = _ref.signingKeys, metadataSeed = _ref.metadataSeed, client_id = _ref.client_id, client_secret = _ref.client_secret, _ref$response_type = _ref.response_type, response_type = _ref$response_type === undefined ? DefaultResponseType : _ref$response_type, _ref$scope = _ref.scope, scope = _ref$scope === undefined ? DefaultScope : _ref$scope, redirect_uri = _ref.redirect_uri, post_logout_redirect_uri = _ref.post_logout_redirect_uri, _ref$client_authentic = _ref.client_authentication, client_authentication = _ref$client_authentic === undefined ? DefaultClientAuthentication : _ref$client_authentic, prompt = _ref.prompt, display = _ref.display, max_age = _ref.max_age, ui_locales = _ref.ui_locales, acr_values = _ref.acr_values, resource = _ref.resource, response_mode = _ref.response_mode, _ref$filterProtocolCl = _ref.filterProtocolClaims, filterProtocolClaims = _ref$filterProtocolCl === undefined ? true : _ref$filterProtocolCl, _ref$loadUserInfo = _ref.loadUserInfo, loadUserInfo = _ref$loadUserInfo === undefined ? true : _ref$loadUserInfo, _ref$staleStateAge = _ref.staleStateAge, staleStateAge = _ref$staleStateAge === undefined ? DefaultStaleStateAge : _ref$staleStateAge, _ref$clockSkew = _ref.clockSkew, clockSkew = _ref$clockSkew === undefined ? DefaultClockSkewInSeconds : _ref$clockSkew, _ref$clockService = _ref.clockService, clockService = _ref$clockService === undefined ? new _ClockService.ClockService() : _ref$clockService, _ref$userInfoJwtIssue = _ref.userInfoJwtIssuer, userInfoJwtIssuer = _ref$userInfoJwtIssue === undefined ? 'OP' : _ref$userInfoJwtIssue, _ref$mergeClaims = _ref.mergeClaims, mergeClaims = _ref$mergeClaims === undefined ? false : _ref$mergeClaims, _ref$stateStore = _ref.stateStore, stateStore = _ref$stateStore === undefined ? new _WebStorageStateStore.WebStorageStateStore() : _ref$stateStore, _ref$ResponseValidato = _ref.ResponseValidatorCtor, ResponseValidatorCtor = _ref$ResponseValidato === undefined ? _ResponseValidator.ResponseValidator : _ref$ResponseValidato, _ref$MetadataServiceC = _ref.MetadataServiceCtor, MetadataServiceCtor = _ref$MetadataServiceC === undefined ? _MetadataService.MetadataService : _ref$MetadataServiceC, _ref$extraQueryParams = _ref.extraQueryParams, extraQueryParams = _ref$extraQueryParams === undefined ? {} : _ref$extraQueryParams, _ref$extraTokenParams = _ref.extraTokenParams, extraTokenParams = _ref$extraTokenParams === undefined ? {} : _ref$extraTokenParams; _classCallCheck(this, OidcClientSettings); this._authority = authority; this._metadataUrl = metadataUrl; this._metadata = metadata; this._metadataSeed = metadataSeed; this._signingKeys = signingKeys; this._client_id = client_id; this._client_secret = client_secret; this._response_type = response_type; this._scope = scope; this._redirect_uri = redirect_uri; this._post_logout_redirect_uri = post_logout_redirect_uri; this._client_authentication = client_authentication; this._prompt = prompt; this._display = display; this._max_age = max_age; this._ui_locales = ui_locales; this._acr_values = acr_values; this._resource = resource; this._response_mode = response_mode; this._filterProtocolClaims = !!filterProtocolClaims; this._loadUserInfo = !!loadUserInfo; this._staleStateAge = staleStateAge; this._clockSkew = clockSkew; this._clockService = clockService; this._userInfoJwtIssuer = userInfoJwtIssuer; this._mergeClaims = !!mergeClaims; this._stateStore = stateStore; this._validator = new ResponseValidatorCtor(this); this._metadataService = new MetadataServiceCtor(this); this._extraQueryParams = (typeof extraQueryParams === 'undefined' ? 'undefined' : _typeof(extraQueryParams)) === 'object' ? extraQueryParams : {}; this._extraTokenParams = (typeof extraTokenParams === 'undefined' ? 'undefined' : _typeof(extraTokenParams)) === 'object' ? extraTokenParams : {}; } // client config // get the time OidcClientSettings.prototype.getEpochTime = function getEpochTime() { return this._clockService.getEpochTime(); }; _createClass(OidcClientSettings, [{ key: 'client_id', get: function get() { return this._client_id; }, set: function set(value) { if (!this._client_id) { // one-time set only this._client_id = value; } else { _Log.Log.error("OidcClientSettings.set_client_id: client_id has already been assigned."); throw new Error("client_id has already been assigned."); } } }, { key: 'client_secret', get: function get() { return this._client_secret; } }, { key: 'response_type', get: function get() { return this._response_type; } }, { key: 'scope', get: function get() { return this._scope; } }, { key: 'redirect_uri', get: function get() { return this._redirect_uri; } }, { key: 'post_logout_redirect_uri', get: function get() { return this._post_logout_redirect_uri; } }, { key: 'client_authentication', get: function get() { return this._client_authentication; } // optional protocol params }, { key: 'prompt', get: function get() { return this._prompt; } }, { key: 'display', get: function get() { return this._display; } }, { key: 'max_age', get: function get() { return this._max_age; } }, { key: 'ui_locales', get: function get() { return this._ui_locales; } }, { key: 'acr_values', get: function get() { return this._acr_values; } }, { key: 'resource', get: function get() { return this._resource; } }, { key: 'response_mode', get: function get() { return this._response_mode; } // metadata }, { key: 'authority', get: function get() { return this._authority; }, set: function set(value) { if (!this._authority) { // one-time set only this._authority = value; } else { _Log.Log.error("OidcClientSettings.set_authority: authority has already been assigned."); throw new Error("authority has already been assigned."); } } }, { key: 'metadataUrl', get: function get() { if (!this._metadataUrl) { this._metadataUrl = this.authority; if (this._metadataUrl && this._metadataUrl.indexOf(OidcMetadataUrlPath) < 0) { if (this._metadataUrl[this._metadataUrl.length - 1] !== '/') { this._metadataUrl += '/'; } this._metadataUrl += OidcMetadataUrlPath; } } return this._metadataUrl; } // settable/cachable metadata values }, { key: 'metadata', get: function get() { return this._metadata; }, set: function set(value) { this._metadata = value; } }, { key: 'metadataSeed', get: function get() { return this._metadataSeed; }, set: function set(value) { this._metadataSeed = value; } }, { key: 'signingKeys', get: function get() { return this._signingKeys; }, set: function set(value) { this._signingKeys = value; } // behavior flags }, { key: 'filterProtocolClaims', get: function get() { return this._filterProtocolClaims; } }, { key: 'loadUserInfo', get: function get() { return this._loadUserInfo; } }, { key: 'staleStateAge', get: function get() { return this._staleStateAge; } }, { key: 'clockSkew', get: function get() { return this._clockSkew; } }, { key: 'userInfoJwtIssuer', get: function get() { return this._userInfoJwtIssuer; } }, { key: 'mergeClaims', get: function get() { return this._mergeClaims; } }, { key: 'stateStore', get: function get() { return this._stateStore; } }, { key: 'validator', get: function get() { return this._validator; } }, { key: 'metadataService', get: function get() { return this._metadataService; } // extra query params }, { key: 'extraQueryParams', get: function get() { return this._extraQueryParams; }, set: function set(value) { if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object') { this._extraQueryParams = value; } else { this._extraQueryParams = {}; } } // extra token params }, { key: 'extraTokenParams', get: function get() { return this._extraTokenParams; }, set: function set(value) { if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object') { this._extraTokenParams = value; } else { this._extraTokenParams = {}; } } }]); return OidcClientSettings; }(); /***/ }), /***/ "./src/PopupNavigator.js": /*!*******************************!*\ !*** ./src/PopupNavigator.js ***! \*******************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PopupNavigator = undefined; var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); var _PopupWindow = __webpack_require__(/*! ./PopupWindow.js */ "./src/PopupWindow.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var PopupNavigator = exports.PopupNavigator = function () { function PopupNavigator() { _classCallCheck(this, PopupNavigator); } PopupNavigator.prototype.prepare = function prepare(params) { var popup = new _PopupWindow.PopupWindow(params); return Promise.resolve(popup); }; PopupNavigator.prototype.callback = function callback(url, keepOpen, delimiter) { _Log.Log.debug("PopupNavigator.callback"); try { _PopupWindow.PopupWindow.notifyOpener(url, keepOpen, delimiter); return Promise.resolve(); } catch (e) { return Promise.reject(e); } }; return PopupNavigator; }(); /***/ }), /***/ "./src/PopupWindow.js": /*!****************************!*\ !*** ./src/PopupWindow.js ***! \****************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PopupWindow = undefined; var _createClass = function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); var _UrlUtility = __webpack_require__(/*! ./UrlUtility.js */ "./src/UrlUtility.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var CheckForPopupClosedInterval = 500; var DefaultPopupFeatures = 'location=no,toolbar=no,width=500,height=500,left=100,top=100;'; //const DefaultPopupFeatures = 'location=no,toolbar=no,width=500,height=500,left=100,top=100;resizable=yes'; var DefaultPopupTarget = "_blank"; var PopupWindow = exports.PopupWindow = function () { function PopupWindow(params) { var _this = this; _classCallCheck(this, PopupWindow); this._promise = new Promise(function (resolve, reject) { _this._resolve = resolve; _this._reject = reject; }); var target = params.popupWindowTarget || DefaultPopupTarget; var features = params.popupWindowFeatures || DefaultPopupFeatures; this._popup = window.open('', target, features); if (this._popup) { _Log.Log.debug("PopupWindow.ctor: popup successfully created"); this._checkForPopupClosedTimer = window.setInterval(this._checkForPopupClosed.bind(this), CheckForPopupClosedInterval); } } PopupWindow.prototype.navigate = function navigate(params) { if (!this._popup) { this._error("PopupWindow.navigate: Error opening popup window"); } else if (!params || !params.url) { this._error("PopupWindow.navigate: no url provided"); this._error("No url provided"); } else { _Log.Log.debug("PopupWindow.navigate: Setting URL in popup"); this._id = params.id; if (this._id) { window["popupCallback_" + params.id] = this._callback.bind(this); } this._popup.focus(); this._popup.window.location = params.url; } return this.promise; }; PopupWindow.prototype._success = function _success(data) { _Log.Log.debug("PopupWindow.callback: Successful response from popup window"); this._cleanup(); this._resolve(data); }; PopupWindow.prototype._error = function _error(message) { _Log.Log.error("PopupWindow.error: ", message); this._cleanup(); this._reject(new Error(message)); }; PopupWindow.prototype.close = function close() { this._cleanup(false); }; PopupWindow.prototype._cleanup = function _cleanup(keepOpen) { _Log.Log.debug("PopupWindow.cleanup"); window.clearInterval(this._checkForPopupClosedTimer); this._checkForPopupClosedTimer = null; delete window["popupCallback_" + this._id]; if (this._popup && !keepOpen) { this._popup.close(); } this._popup = null; }; PopupWindow.prototype._checkForPopupClosed = function _checkForPopupClosed() { if (!this._popup || this._popup.closed) { this._error("Popup window closed"); } }; PopupWindow.prototype._callback = function _callback(url, keepOpen) { this._cleanup(keepOpen); if (url) { _Log.Log.debug("PopupWindow.callback success"); this._success({ url: url }); } else { _Log.Log.debug("PopupWindow.callback: Invalid response from popup"); this._error("Invalid response from popup"); } }; PopupWindow.notifyOpener = function notifyOpener(url, keepOpen, delimiter) { if (window.opener) { url = url || window.location.href; if (url) { var data = _UrlUtility.UrlUtility.parseUrlFragment(url, delimiter); if (data.state) { var name = "popupCallback_" + data.state; var callback = window.opener[name]; if (callback) { _Log.Log.debug("PopupWindow.notifyOpener: passing url message to opener"); callback(url, keepOpen); } else { _Log.Log.warn("PopupWindow.notifyOpener: no matching callback found on opener"); } } else { _Log.Log.warn("PopupWindow.notifyOpener: no state found in response url"); } } } else { _Log.Log.warn("PopupWindow.notifyOpener: no window.opener. Can't complete notification."); } }; _createClass(PopupWindow, [{ key: 'promise', get: function get() { return this._promise; } }]); return PopupWindow; }(); /***/ }), /***/ "./src/RedirectNavigator.js": /*!**********************************!*\ !*** ./src/RedirectNavigator.js ***! \**********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RedirectNavigator = undefined; var _createClass = function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var RedirectNavigator = exports.RedirectNavigator = function () { function RedirectNavigator() { _classCallCheck(this, RedirectNavigator); } RedirectNavigator.prototype.prepare = function prepare() { return Promise.resolve(this); }; RedirectNavigator.prototype.navigate = function navigate(params) { if (!params || !params.url) { _Log.Log.error("RedirectNavigator.navigate: No url provided"); return Promise.reject(new Error("No url provided")); } if (params.useReplaceToNavigate) { window.location.replace(params.url); } else { window.location = params.url; } return Promise.resolve(); }; _createClass(RedirectNavigator, [{ key: "url", get: function get() { return window.location.href; } }]); return RedirectNavigator; }(); /***/ }), /***/ "./src/ResponseValidator.js": /*!**********************************!*\ !*** ./src/ResponseValidator.js ***! \**********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ResponseValidator = undefined; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); var _MetadataService = __webpack_require__(/*! ./MetadataService.js */ "./src/MetadataService.js"); var _UserInfoService = __webpack_require__(/*! ./UserInfoService.js */ "./src/UserInfoService.js"); var _TokenClient = __webpack_require__(/*! ./TokenClient.js */ "./src/TokenClient.js"); var _ErrorResponse = __webpack_require__(/*! ./ErrorResponse.js */ "./src/ErrorResponse.js"); var _JoseUtil = __webpack_require__(/*! ./JoseUtil.js */ "./src/JoseUtil.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var ProtocolClaims = ["nonce", "at_hash", "iat", "nbf", "exp", "aud", "iss", "c_hash"]; var ResponseValidator = exports.ResponseValidator = function () { function ResponseValidator(settings) { var MetadataServiceCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _MetadataService.MetadataService; var UserInfoServiceCtor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _UserInfoService.UserInfoService; var joseUtil = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _JoseUtil.JoseUtil; var TokenClientCtor = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : _TokenClient.TokenClient; _classCallCheck(this, ResponseValidator); if (!settings) { _Log.Log.error("ResponseValidator.ctor: No settings passed to ResponseValidator"); throw new Error("settings"); } this._settings = settings; this._metadataService = new MetadataServiceCtor(this._settings); this._userInfoService = new UserInfoServiceCtor(this._settings); this._joseUtil = joseUtil; this._tokenClient = new TokenClientCtor(this._settings); } ResponseValidator.prototype.validateSigninResponse = function validateSigninResponse(state, response) { var _this = this; _Log.Log.debug("ResponseValidator.validateSigninResponse"); return this._processSigninParams(state, response).then(function (response) { _Log.Log.debug("ResponseValidator.validateSigninResponse: state processed"); return _this._validateTokens(state, response).then(function (response) { _Log.Log.debug("ResponseValidator.validateSigninResponse: tokens validated"); return _this._processClaims(state, response).then(function (response) { _Log.Log.debug("ResponseValidator.validateSigninResponse: claims processed"); return response; }); }); }); }; ResponseValidator.prototype.validateSignoutResponse = function validateSignoutResponse(state, response) { if (state.id !== response.state) { _Log.Log.error("ResponseValidator.validateSignoutResponse: State does not match"); return Promise.reject(new Error("State does not match")); } // now that we know the state matches, take the stored data // and set it into the response so callers can get their state // this is important for both success & error outcomes _Log.Log.debug("ResponseValidator.validateSignoutResponse: state validated"); response.state = state.data; if (response.error) { _Log.Log.warn("ResponseValidator.validateSignoutResponse: Response was error", response.error); return Promise.reject(new _ErrorResponse.ErrorResponse(response)); } return Promise.resolve(response); }; ResponseValidator.prototype._processSigninParams = function _processSigninParams(state, response) { if (state.id !== response.state) { _Log.Log.error("ResponseValidator._processSigninParams: State does not match"); return Promise.reject(new Error("State does not match")); } if (!state.client_id) { _Log.Log.error("ResponseValidator._processSigninParams: No client_id on state"); return Promise.reject(new Error("No client_id on state")); } if (!state.authority) { _Log.Log.error("ResponseValidator._processSigninParams: No authority on state"); return Promise.reject(new Error("No authority on state")); } // this allows the authority to be loaded from the signin state if (!this._settings.authority) { this._settings.authority = state.authority; } // ensure we're using the correct authority if the authority is not loaded from signin state else if (this._settings.authority && this._settings.authority !== state.authority) { _Log.Log.error("ResponseValidator._processSigninParams: authority mismatch on settings vs. signin state"); return Promise.reject(new Error("authority mismatch on settings vs. signin state")); } // this allows the client_id to be loaded from the signin state if (!this._settings.client_id) { this._settings.client_id = state.client_id; } // ensure we're using the correct client_id if the client_id is not loaded from signin state else if (this._settings.client_id && this._settings.client_id !== state.client_id) { _Log.Log.error("ResponseValidator._processSigninParams: client_id mismatch on settings vs. signin state"); return Promise.reject(new Error("client_id mismatch on settings vs. signin state")); } // now that we know the state matches, take the stored data // and set it into the response so callers can get their state // this is important for both success & error outcomes _Log.Log.debug("ResponseValidator._processSigninParams: state validated"); response.state = state.data; if (response.error) { _Log.Log.warn("ResponseValidator._processSigninParams: Response was error", response.error); return Promise.reject(new _ErrorResponse.ErrorResponse(response)); } if (state.nonce && !response.id_token) { _Log.Log.error("ResponseValidator._processSigninParams: Expecting id_token in response"); return Promise.reject(new Error("No id_token in response")); } if (!state.nonce && response.id_token) { _Log.Log.error("ResponseValidator._processSigninParams: Not expecting id_token in response"); return Promise.reject(new Error("Unexpected id_token in response")); } if (state.code_verifier && !response.code) { _Log.Log.error("ResponseValidator._processSigninParams: Expecting code in response"); return Promise.reject(new Error("No code in response")); } if (!state.code_verifier && response.code) { _Log.Log.error("ResponseValidator._processSigninParams: Not expecting code in response"); return Promise.reject(new Error("Unexpected code in response")); } if (!response.scope) { // if there's no scope on the response, then assume all scopes granted (per-spec) and copy over scopes from original request response.scope = state.scope; } return Promise.resolve(response); }; ResponseValidator.prototype._processClaims = function _processClaims(state, response) { var _this2 = this; if (response.isOpenIdConnect) { _Log.Log.debug("ResponseValidator._processClaims: response is OIDC, processing claims"); response.profile = this._filterProtocolClaims(response.profile); if (state.skipUserInfo !== true && this._settings.loadUserInfo && response.access_token) { _Log.Log.debug("ResponseValidator._processClaims: loading user info"); return this._userInfoService.getClaims(response.access_token).then(function (claims) { _Log.Log.debug("ResponseValidator._processClaims: user info claims received from user info endpoint"); if (claims.sub !== response.profile.sub) { _Log.Log.error("ResponseValidator._processClaims: sub from user info endpoint does not match sub in id_token"); return Promise.reject(new Error("sub from user info endpoint does not match sub in id_token")); } response.profile = _this2._mergeClaims(response.profile, claims); _Log.Log.debug("ResponseValidator._processClaims: user info claims received, updated profile:", response.profile); return response; }); } else { _Log.Log.debug("ResponseValidator._processClaims: not loading user info"); } } else { _Log.Log.debug("ResponseValidator._processClaims: response is not OIDC, not processing claims"); } return Promise.resolve(response); }; ResponseValidator.prototype._mergeClaims = function _mergeClaims(claims1, claims2) { var result = Object.assign({}, claims1); for (var name in claims2) { var values = claims2[name]; if (!Array.isArray(values)) { values = [values]; } for (var i = 0; i < values.length; i++) { var value = values[i]; if (!result[name]) { result[name] = value; } else if (Array.isArray(result[name])) { if (result[name].indexOf(value) < 0) { result[name].push(value); } } else if (result[name] !== value) { if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && this._settings.mergeClaims) { result[name] = this._mergeClaims(result[name], value); } else { result[name] = [result[name], value]; } } } } return result; }; ResponseValidator.prototype._filterProtocolClaims = function _filterProtocolClaims(claims) { _Log.Log.debug("ResponseValidator._filterProtocolClaims, incoming claims:", claims); var result = Object.assign({}, claims); if (this._settings._filterProtocolClaims) { ProtocolClaims.forEach(function (type) { delete result[type]; }); _Log.Log.debug("ResponseValidator._filterProtocolClaims: protocol claims filtered", result); } else { _Log.Log.debug("ResponseValidator._filterProtocolClaims: protocol claims not filtered"); } return result; }; ResponseValidator.prototype._validateTokens = function _validateTokens(state, response) { if (response.code) { _Log.Log.debug("ResponseValidator._validateTokens: Validating code"); return this._processCode(state, response); } if (response.id_token) { if (response.access_token) { _Log.Log.debug("ResponseValidator._validateTokens: Validating id_token and access_token"); return this._validateIdTokenAndAccessToken(state, response); } _Log.Log.debug("ResponseValidator._validateTokens: Validating id_token"); return this._validateIdToken(state, response); } _Log.Log.debug("ResponseValidator._validateTokens: No code to process or id_token to validate"); return Promise.resolve(response); }; ResponseValidator.prototype._processCode = function _processCode(state, response) { var _this3 = this; var request = { client_id: state.client_id, client_secret: state.client_secret, code: response.code, redirect_uri: state.redirect_uri, code_verifier: state.code_verifier }; if (state.extraTokenParams && _typeof(state.extraTokenParams) === 'object') { Object.assign(request, state.extraTokenParams); } return this._tokenClient.exchangeCode(request).then(function (tokenResponse) { for (var key in tokenResponse) { response[key] = tokenResponse[key]; } if (response.id_token) { _Log.Log.debug("ResponseValidator._processCode: token response successful, processing id_token"); return _this3._validateIdTokenAttributes(state, response); } else { _Log.Log.debug("ResponseValidator._processCode: token response successful, returning response"); } return response; }); }; ResponseValidator.prototype._validateIdTokenAttributes = function _validateIdTokenAttributes(state, response) { var _this4 = this; return this._metadataService.getIssuer().then(function (issuer) { var audience = state.client_id; var clockSkewInSeconds = _this4._settings.clockSkew; _Log.Log.debug("ResponseValidator._validateIdTokenAttributes: Validaing JWT attributes; using clock skew (in seconds) of: ", clockSkewInSeconds); return _this4._settings.getEpochTime().then(function (now) { return _this4._joseUtil.validateJwtAttributes(response.id_token, issuer, audience, clockSkewInSeconds, now).then(function (payload) { if (state.nonce && state.nonce !== payload.nonce) { _Log.Log.error("ResponseValidator._validateIdTokenAttributes: Invalid nonce in id_token"); return Promise.reject(new Error("Invalid nonce in id_token")); } if (!payload.sub) { _Log.Log.error("ResponseValidator._validateIdTokenAttributes: No sub present in id_token"); return Promise.reject(new Error("No sub present in id_token")); } response.profile = payload; return response; }); }); }); }; ResponseValidator.prototype._validateIdTokenAndAccessToken = function _validateIdTokenAndAccessToken(state, response) { var _this5 = this; return this._validateIdToken(state, response).then(function (response) { return _this5._validateAccessToken(response); }); }; ResponseValidator.prototype._getSigningKeyForJwt = function _getSigningKeyForJwt(jwt) { var _this6 = this; return this._metadataService.getSigningKeys().then(function (keys) { var kid = jwt.header.kid; if (!keys) { _Log.Log.error("ResponseValidator._validateIdToken: No signing keys from metadata"); return Promise.reject(new Error("No signing keys from metadata")); } _Log.Log.debug("ResponseValidator._validateIdToken: Received signing keys"); var key = void 0; if (!kid) { keys = _this6._filterByAlg(keys, jwt.header.alg); if (keys.length > 1) { _Log.Log.error("ResponseValidator._validateIdToken: No kid found in id_token and more than one key found in metadata"); return Promise.reject(new Error("No kid found in id_token and more than one key found in metadata")); } else { // kid is mandatory only when there are multiple keys in the referenced JWK Set document // see http://openid.net/specs/openid-connect-core-1_0.html#Signing key = keys[0]; } } else { key = keys.filter(function (key) { return key.kid === kid; })[0]; } return Promise.resolve(key); }); }; ResponseValidator.prototype._getSigningKeyForJwtWithSingleRetry = function _getSigningKeyForJwtWithSingleRetry(jwt) { var _this7 = this; return this._getSigningKeyForJwt(jwt).then(function (key) { // Refreshing signingKeys if no suitable verification key is present for given jwt header. if (!key) { // set to undefined, to trigger network call to jwks_uri. _this7._metadataService.resetSigningKeys(); return _this7._getSigningKeyForJwt(jwt); } else { return Promise.resolve(key); } }); }; ResponseValidator.prototype._validateIdToken = function _validateIdToken(state, response) { var _this8 = this; if (!state.nonce) { _Log.Log.error("ResponseValidator._validateIdToken: No nonce on state"); return Promise.reject(new Error("No nonce on state")); } var jwt = this._joseUtil.parseJwt(response.id_token); if (!jwt || !jwt.header || !jwt.payload) { _Log.Log.error("ResponseValidator._validateIdToken: Failed to parse id_token", jwt); return Promise.reject(new Error("Failed to parse id_token")); } if (state.nonce !== jwt.payload.nonce) { _Log.Log.error("ResponseValidator._validateIdToken: Invalid nonce in id_token"); return Promise.reject(new Error("Invalid nonce in id_token")); } return this._metadataService.getIssuer().then(function (issuer) { _Log.Log.debug("ResponseValidator._validateIdToken: Received issuer"); return _this8._getSigningKeyForJwtWithSingleRetry(jwt).then(function (key) { if (!key) { _Log.Log.error("ResponseValidator._validateIdToken: No key matching kid or alg found in signing keys"); return Promise.reject(new Error("No key matching kid or alg found in signing keys")); } var audience = state.client_id; var clockSkewInSeconds = _this8._settings.clockSkew; _Log.Log.debug("ResponseValidator._validateIdToken: Validaing JWT; using clock skew (in seconds) of: ", clockSkewInSeconds); return _this8._joseUtil.validateJwt(response.id_token, key, issuer, audience, clockSkewInSeconds).then(function () { _Log.Log.debug("ResponseValidator._validateIdToken: JWT validation successful"); if (!jwt.payload.sub) { _Log.Log.error("ResponseValidator._validateIdToken: No sub present in id_token"); return Promise.reject(new Error("No sub present in id_token")); } response.profile = jwt.payload; return response; }); }); }); }; ResponseValidator.prototype._filterByAlg = function _filterByAlg(keys, alg) { var kty = null; if (alg.startsWith("RS")) { kty = "RSA"; } else if (alg.startsWith("PS")) { kty = "PS"; } else if (alg.startsWith("ES")) { kty = "EC"; } else { _Log.Log.debug("ResponseValidator._filterByAlg: alg not supported: ", alg); return []; } _Log.Log.debug("ResponseValidator._filterByAlg: Looking for keys that match kty: ", kty); keys = keys.filter(function (key) { return key.kty === kty; }); _Log.Log.debug("ResponseValidator._filterByAlg: Number of keys that match kty: ", kty, keys.length); return keys; }; ResponseValidator.prototype._validateAccessToken = function _validateAccessToken(response) { if (!response.profile) { _Log.Log.error("ResponseValidator._validateAccessToken: No profile loaded from id_token"); return Promise.reject(new Error("No profile loaded from id_token")); } if (!response.profile.at_hash) { _Log.Log.error("ResponseValidator._validateAccessToken: No at_hash in id_token"); return Promise.reject(new Error("No at_hash in id_token")); } if (!response.id_token) { _Log.Log.error("ResponseValidator._validateAccessToken: No id_token"); return Promise.reject(new Error("No id_token")); } var jwt = this._joseUtil.parseJwt(response.id_token); if (!jwt || !jwt.header) { _Log.Log.error("ResponseValidator._validateAccessToken: Failed to parse id_token", jwt); return Promise.reject(new Error("Failed to parse id_token")); } var hashAlg = jwt.header.alg; if (!hashAlg || hashAlg.length !== 5) { _Log.Log.error("ResponseValidator._validateAccessToken: Unsupported alg:", hashAlg); return Promise.reject(new Error("Unsupported alg: " + hashAlg)); } var hashBits = hashAlg.substr(2, 3); if (!hashBits) { _Log.Log.error("ResponseValidator._validateAccessToken: Unsupported alg:", hashAlg, hashBits); return Promise.reject(new Error("Unsupported alg: " + hashAlg)); } hashBits = parseInt(hashBits); if (hashBits !== 256 && hashBits !== 384 && hashBits !== 512) { _Log.Log.error("ResponseValidator._validateAccessToken: Unsupported alg:", hashAlg, hashBits); return Promise.reject(new Error("Unsupported alg: " + hashAlg)); } var sha = "sha" + hashBits; var hash = this._joseUtil.hashString(response.access_token, sha); if (!hash) { _Log.Log.error("ResponseValidator._validateAccessToken: access_token hash failed:", sha); return Promise.reject(new Error("Failed to validate at_hash")); } var left = hash.substr(0, hash.length / 2); var left_b64u = this._joseUtil.hexToBase64Url(left); if (left_b64u !== response.profile.at_hash) { _Log.Log.error("ResponseValidator._validateAccessToken: Failed to validate at_hash", left_b64u, response.profile.at_hash); return Promise.reject(new Error("Failed to validate at_hash")); } _Log.Log.debug("ResponseValidator._validateAccessToken: success"); return Promise.resolve(response); }; return ResponseValidator; }(); /***/ }), /***/ "./src/SessionMonitor.js": /*!*******************************!*\ !*** ./src/SessionMonitor.js ***! \*******************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SessionMonitor = undefined; var _createClass = function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); var _CheckSessionIFrame = __webpack_require__(/*! ./CheckSessionIFrame.js */ "./src/CheckSessionIFrame.js"); var _Global = __webpack_require__(/*! ./Global.js */ "./src/Global.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var SessionMonitor = exports.SessionMonitor = function () { function SessionMonitor(userManager) { var _this = this; var CheckSessionIFrameCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _CheckSessionIFrame.CheckSessionIFrame; var timer = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _Global.Global.timer; _classCallCheck(this, SessionMonitor); if (!userManager) { _Log.Log.error("SessionMonitor.ctor: No user manager passed to SessionMonitor"); throw new Error("userManager"); } this._userManager = userManager; this._CheckSessionIFrameCtor = CheckSessionIFrameCtor; this._timer = timer; this._userManager.events.addUserLoaded(this._start.bind(this)); this._userManager.events.addUserUnloaded(this._stop.bind(this)); Promise.resolve(this._userManager.getUser().then(function (user) { // doing this manually here since calling getUser // doesn't trigger load event. if (user) { _this._start(user); } else if (_this._settings.monitorAnonymousSession) { _this._userManager.querySessionStatus().then(function (session) { var tmpUser = { session_state: session.session_state }; if (session.sub && session.sid) { tmpUser.profile = { sub: session.sub, sid: session.sid }; } _this._start(tmpUser); }).catch(function (err) { // catch to suppress errors since we're in a ctor _Log.Log.error("SessionMonitor ctor: error from querySessionStatus:", err.message); }); } }).catch(function (err) { // catch to suppress errors since we're in a ctor _Log.Log.error("SessionMonitor ctor: error from getUser:", err.message); })); } SessionMonitor.prototype._start = function _start(user) { var _this2 = this; var session_state = user.session_state; if (session_state) { if (user.profile) { this._sub = user.profile.sub; this._sid = user.profile.sid; _Log.Log.debug("SessionMonitor._start: session_state:", session_state, ", sub:", this._sub); } else { this._sub = undefined; this._sid = undefined; _Log.Log.debug("SessionMonitor._start: session_state:", session_state, ", anonymous user"); } if (!this._checkSessionIFrame) { this._metadataService.getCheckSessionIframe().then(function (url) { if (url) { _Log.Log.debug("SessionMonitor._start: Initializing check session iframe"); var client_id = _this2._client_id; var interval = _this2._checkSessionInterval; var stopOnError = _this2._stopCheckSessionOnError; _this2._checkSessionIFrame = new _this2._CheckSessionIFrameCtor(_this2._callback.bind(_this2), client_id, url, interval, stopOnError); _this2._checkSessionIFrame.load().then(function () { _this2._checkSessionIFrame.start(session_state); }); } else { _Log.Log.warn("SessionMonitor._start: No check session iframe found in the metadata"); } }).catch(function (err) { // catch to suppress errors since we're in non-promise callback _Log.Log.error("SessionMonitor._start: Error from getCheckSessionIframe:", err.message); }); } else { this._checkSessionIFrame.start(session_state); } } }; SessionMonitor.prototype._stop = function _stop() { var _this3 = this; this._sub = undefined; this._sid = undefined; if (this._checkSessionIFrame) { _Log.Log.debug("SessionMonitor._stop"); this._checkSessionIFrame.stop(); } if (this._settings.monitorAnonymousSession) { // using a timer to delay re-initialization to avoid race conditions during signout var timerHandle = this._timer.setInterval(function () { _this3._timer.clearInterval(timerHandle); _this3._userManager.querySessionStatus().then(function (session) { var tmpUser = { session_state: session.session_state }; if (session.sub && session.sid) { tmpUser.profile = { sub: session.sub, sid: session.sid }; } _this3._start(tmpUser); }).catch(function (err) { // catch to suppress errors since we're in a callback _Log.Log.error("SessionMonitor: error from querySessionStatus:", err.message); }); }, 1000); } }; SessionMonitor.prototype._callback = function _callback() { var _this4 = this; this._userManager.querySessionStatus().then(function (session) { var raiseEvent = true; if (session) { if (session.sub === _this4._sub) { raiseEvent = false; _this4._checkSessionIFrame.start(session.session_state); if (session.sid === _this4._sid) { _Log.Log.debug("SessionMonitor._callback: Same sub still logged in at OP, restarting check session iframe; session_state:", session.session_state); } else { _Log.Log.debug("SessionMonitor._callback: Same sub still logged in at OP, session state has changed, restarting check session iframe; session_state:", session.session_state); _this4._userManager.events._raiseUserSessionChanged(); } } else { _Log.Log.debug("SessionMonitor._callback: Different subject signed into OP:", session.sub); } } else { _Log.Log.debug("SessionMonitor._callback: Subject no longer signed into OP"); } if (raiseEvent) { if (_this4._sub) { _Log.Log.debug("SessionMonitor._callback: SessionMonitor._callback; raising signed out event"); _this4._userManager.events._raiseUserSignedOut(); } else { _Log.Log.debug("SessionMonitor._callback: SessionMonitor._callback; raising signed in event"); _this4._userManager.events._raiseUserSignedIn(); } } }).catch(function (err) { if (_this4._sub) { _Log.Log.debug("SessionMonitor._callback: Error calling queryCurrentSigninSession; raising signed out event", err.message); _this4._userManager.events._raiseUserSignedOut(); } }); }; _createClass(SessionMonitor, [{ key: '_settings', get: function get() { return this._userManager.settings; } }, { key: '_metadataService', get: function get() { return this._userManager.metadataService; } }, { key: '_client_id', get: function get() { return this._settings.client_id; } }, { key: '_checkSessionInterval', get: function get() { return this._settings.checkSessionInterval; } }, { key: '_stopCheckSessionOnError', get: function get() { return this._settings.stopCheckSessionOnError; } }]); return SessionMonitor; }(); /***/ }), /***/ "./src/SigninRequest.js": /*!******************************!*\ !*** ./src/SigninRequest.js ***! \******************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SigninRequest = undefined; var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); var _UrlUtility = __webpack_require__(/*! ./UrlUtility.js */ "./src/UrlUtility.js"); var _SigninState = __webpack_require__(/*! ./SigninState.js */ "./src/SigninState.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var SigninRequest = exports.SigninRequest = function () { function SigninRequest(_ref) { var url = _ref.url, client_id = _ref.client_id, redirect_uri = _ref.redirect_uri, response_type = _ref.response_type, scope = _ref.scope, authority = _ref.authority, data = _ref.data, prompt = _ref.prompt, display = _ref.display, max_age = _ref.max_age, ui_locales = _ref.ui_locales, id_token_hint = _ref.id_token_hint, login_hint = _ref.login_hint, acr_values = _ref.acr_values, resource = _ref.resource, response_mode = _ref.response_mode, request = _ref.request, request_uri = _ref.request_uri, extraQueryParams = _ref.extraQueryParams, request_type = _ref.request_type, client_secret = _ref.client_secret, extraTokenParams = _ref.extraTokenParams, skipUserInfo = _ref.skipUserInfo; _classCallCheck(this, SigninRequest); if (!url) { _Log.Log.error("SigninRequest.ctor: No url passed"); throw new Error("url"); } if (!client_id) { _Log.Log.error("SigninRequest.ctor: No client_id passed"); throw new Error("client_id"); } if (!redirect_uri) { _Log.Log.error("SigninRequest.ctor: No redirect_uri passed"); throw new Error("redirect_uri"); } if (!response_type) { _Log.Log.error("SigninRequest.ctor: No response_type passed"); throw new Error("response_type"); } if (!scope) { _Log.Log.error("SigninRequest.ctor: No scope passed"); throw new Error("scope"); } if (!authority) { _Log.Log.error("SigninRequest.ctor: No authority passed"); throw new Error("authority"); } var oidc = SigninRequest.isOidc(response_type); var code = SigninRequest.isCode(response_type); if (!response_mode) { response_mode = SigninRequest.isCode(response_type) ? "query" : null; } this.state = new _SigninState.SigninState({ nonce: oidc, data: data, client_id: client_id, authority: authority, redirect_uri: redirect_uri, code_verifier: code, request_type: request_type, response_mode: response_mode, client_secret: client_secret, scope: scope, extraTokenParams: extraTokenParams, skipUserInfo: skipUserInfo }); url = _UrlUtility.UrlUtility.addQueryParam(url, "client_id", client_id); url = _UrlUtility.UrlUtility.addQueryParam(url, "redirect_uri", redirect_uri); url = _UrlUtility.UrlUtility.addQueryParam(url, "response_type", response_type); url = _UrlUtility.UrlUtility.addQueryParam(url, "scope", scope); url = _UrlUtility.UrlUtility.addQueryParam(url, "state", this.state.id); if (oidc) { url = _UrlUtility.UrlUtility.addQueryParam(url, "nonce", this.state.nonce); } if (code) { url = _UrlUtility.UrlUtility.addQueryParam(url, "code_challenge", this.state.code_challenge); url = _UrlUtility.UrlUtility.addQueryParam(url, "code_challenge_method", "S256"); } var optional = { prompt: prompt, display: display, max_age: max_age, ui_locales: ui_locales, id_token_hint: id_token_hint, login_hint: login_hint, acr_values: acr_values, resource: resource, request: request, request_uri: request_uri, response_mode: response_mode }; for (var key in optional) { if (optional[key]) { url = _UrlUtility.UrlUtility.addQueryParam(url, key, optional[key]); } } for (var _key in extraQueryParams) { url = _UrlUtility.UrlUtility.addQueryParam(url, _key, extraQueryParams[_key]); } this.url = url; } SigninRequest.isOidc = function isOidc(response_type) { var result = response_type.split(/\s+/g).filter(function (item) { return item === "id_token"; }); return !!result[0]; }; SigninRequest.isOAuth = function isOAuth(response_type) { var result = response_type.split(/\s+/g).filter(function (item) { return item === "token"; }); return !!result[0]; }; SigninRequest.isCode = function isCode(response_type) { var result = response_type.split(/\s+/g).filter(function (item) { return item === "code"; }); return !!result[0]; }; return SigninRequest; }(); /***/ }), /***/ "./src/SigninResponse.js": /*!*******************************!*\ !*** ./src/SigninResponse.js ***! \*******************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SigninResponse = undefined; var _createClass = function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var _UrlUtility = __webpack_require__(/*! ./UrlUtility.js */ "./src/UrlUtility.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var OidcScope = "openid"; var SigninResponse = exports.SigninResponse = function () { function SigninResponse(url) { var delimiter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "#"; _classCallCheck(this, SigninResponse); var values = _UrlUtility.UrlUtility.parseUrlFragment(url, delimiter); this.error = values.error; this.error_description = values.error_description; this.error_uri = values.error_uri; this.code = values.code; this.state = values.state; this.id_token = values.id_token; this.session_state = values.session_state; this.access_token = values.access_token; this.token_type = values.token_type; this.scope = values.scope; this.profile = undefined; // will be set from ResponseValidator this.expires_in = values.expires_in; } _createClass(SigninResponse, [{ key: "expires_in", get: function get() { if (this.expires_at) { var now = parseInt(Date.now() / 1000); return this.expires_at - now; } return undefined; }, set: function set(value) { var expires_in = parseInt(value); if (typeof expires_in === 'number' && expires_in > 0) { var now = parseInt(Date.now() / 1000); this.expires_at = now + expires_in; } } }, { key: "expired", get: function get() { var expires_in = this.expires_in; if (expires_in !== undefined) { return expires_in <= 0; } return undefined; } }, { key: "scopes", get: function get() { return (this.scope || "").split(" "); } }, { key: "isOpenIdConnect", get: function get() { return this.scopes.indexOf(OidcScope) >= 0 || !!this.id_token; } }]); return SigninResponse; }(); /***/ }), /***/ "./src/SigninState.js": /*!****************************!*\ !*** ./src/SigninState.js ***! \****************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SigninState = undefined; var _createClass = function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); var _State2 = __webpack_require__(/*! ./State.js */ "./src/State.js"); var _JoseUtil = __webpack_require__(/*! ./JoseUtil.js */ "./src/JoseUtil.js"); var _random = __webpack_require__(/*! ./random.js */ "./src/random.js"); var _random2 = _interopRequireDefault(_random); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var SigninState = exports.SigninState = function (_State) { _inherits(SigninState, _State); function SigninState() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, nonce = _ref.nonce, authority = _ref.authority, client_id = _ref.client_id, redirect_uri = _ref.redirect_uri, code_verifier = _ref.code_verifier, response_mode = _ref.response_mode, client_secret = _ref.client_secret, scope = _ref.scope, extraTokenParams = _ref.extraTokenParams, skipUserInfo = _ref.skipUserInfo; _classCallCheck(this, SigninState); var _this = _possibleConstructorReturn(this, _State.call(this, arguments[0])); if (nonce === true) { _this._nonce = (0, _random2.default)(); } else if (nonce) { _this._nonce = nonce; } if (code_verifier === true) { // random() produces 32 length _this._code_verifier = (0, _random2.default)() + (0, _random2.default)() + (0, _random2.default)(); } else if (code_verifier) { _this._code_verifier = code_verifier; } if (_this.code_verifier) { var hash = _JoseUtil.JoseUtil.hashString(_this.code_verifier, "SHA256"); _this._code_challenge = _JoseUtil.JoseUtil.hexToBase64Url(hash); } _this._redirect_uri = redirect_uri; _this._authority = authority; _this._client_id = client_id; _this._response_mode = response_mode; _this._client_secret = client_secret; _this._scope = scope; _this._extraTokenParams = extraTokenParams; _this._skipUserInfo = skipUserInfo; return _this; } SigninState.prototype.toStorageString = function toStorageString() { _Log.Log.debug("SigninState.toStorageString"); return JSON.stringify({ id: this.id, data: this.data, created: this.created, request_type: this.request_type, nonce: this.nonce, code_verifier: this.code_verifier, redirect_uri: this.redirect_uri, authority: this.authority, client_id: this.client_id, response_mode: this.response_mode, client_secret: this.client_secret, scope: this.scope, extraTokenParams: this.extraTokenParams, skipUserInfo: this.skipUserInfo }); }; SigninState.fromStorageString = function fromStorageString(storageString) { _Log.Log.debug("SigninState.fromStorageString"); var data = JSON.parse(storageString); return new SigninState(data); }; _createClass(SigninState, [{ key: 'nonce', get: function get() { return this._nonce; } }, { key: 'authority', get: function get() { return this._authority; } }, { key: 'client_id', get: function get() { return this._client_id; } }, { key: 'redirect_uri', get: function get() { return this._redirect_uri; } }, { key: 'code_verifier', get: function get() { return this._code_verifier; } }, { key: 'code_challenge', get: function get() { return this._code_challenge; } }, { key: 'response_mode', get: function get() { return this._response_mode; } }, { key: 'client_secret', get: function get() { return this._client_secret; } }, { key: 'scope', get: function get() { return this._scope; } }, { key: 'extraTokenParams', get: function get() { return this._extraTokenParams; } }, { key: 'skipUserInfo', get: function get() { return this._skipUserInfo; } }]); return SigninState; }(_State2.State); /***/ }), /***/ "./src/SignoutRequest.js": /*!*******************************!*\ !*** ./src/SignoutRequest.js ***! \*******************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SignoutRequest = undefined; var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); var _UrlUtility = __webpack_require__(/*! ./UrlUtility.js */ "./src/UrlUtility.js"); var _State = __webpack_require__(/*! ./State.js */ "./src/State.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var SignoutRequest = exports.SignoutRequest = function SignoutRequest(_ref) { var url = _ref.url, id_token_hint = _ref.id_token_hint, post_logout_redirect_uri = _ref.post_logout_redirect_uri, data = _ref.data, extraQueryParams = _ref.extraQueryParams, request_type = _ref.request_type; _classCallCheck(this, SignoutRequest); if (!url) { _Log.Log.error("SignoutRequest.ctor: No url passed"); throw new Error("url"); } if (id_token_hint) { url = _UrlUtility.UrlUtility.addQueryParam(url, "id_token_hint", id_token_hint); } if (post_logout_redirect_uri) { url = _UrlUtility.UrlUtility.addQueryParam(url, "post_logout_redirect_uri", post_logout_redirect_uri); if (data) { this.state = new _State.State({ data: data, request_type: request_type }); url = _UrlUtility.UrlUtility.addQueryParam(url, "state", this.state.id); } } for (var key in extraQueryParams) { url = _UrlUtility.UrlUtility.addQueryParam(url, key, extraQueryParams[key]); } this.url = url; }; /***/ }), /***/ "./src/SignoutResponse.js": /*!********************************!*\ !*** ./src/SignoutResponse.js ***! \********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SignoutResponse = undefined; var _UrlUtility = __webpack_require__(/*! ./UrlUtility.js */ "./src/UrlUtility.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var SignoutResponse = exports.SignoutResponse = function SignoutResponse(url) { _classCallCheck(this, SignoutResponse); var values = _UrlUtility.UrlUtility.parseUrlFragment(url, "?"); this.error = values.error; this.error_description = values.error_description; this.error_uri = values.error_uri; this.state = values.state; }; /***/ }), /***/ "./src/SilentRenewService.js": /*!***********************************!*\ !*** ./src/SilentRenewService.js ***! \***********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SilentRenewService = undefined; var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var SilentRenewService = exports.SilentRenewService = function () { function SilentRenewService(userManager) { _classCallCheck(this, SilentRenewService); this._userManager = userManager; } SilentRenewService.prototype.start = function start() { if (!this._callback) { this._callback = this._tokenExpiring.bind(this); this._userManager.events.addAccessTokenExpiring(this._callback); // this will trigger loading of the user so the expiring events can be initialized this._userManager.getUser().then(function (user) { // deliberate nop }).catch(function (err) { // catch to suppress errors since we're in a ctor _Log.Log.error("SilentRenewService.start: Error from getUser:", err.message); }); } }; SilentRenewService.prototype.stop = function stop() { if (this._callback) { this._userManager.events.removeAccessTokenExpiring(this._callback); delete this._callback; } }; SilentRenewService.prototype._tokenExpiring = function _tokenExpiring() { var _this = this; this._userManager.signinSilent().then(function (user) { _Log.Log.debug("SilentRenewService._tokenExpiring: Silent token renewal successful"); }, function (err) { _Log.Log.error("SilentRenewService._tokenExpiring: Error from signinSilent:", err.message); _this._userManager.events._raiseSilentRenewError(err); }); }; return SilentRenewService; }(); /***/ }), /***/ "./src/State.js": /*!**********************!*\ !*** ./src/State.js ***! \**********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.State = undefined; var _createClass = function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); var _random = __webpack_require__(/*! ./random.js */ "./src/random.js"); var _random2 = _interopRequireDefault(_random); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var State = exports.State = function () { function State() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, id = _ref.id, data = _ref.data, created = _ref.created, request_type = _ref.request_type; _classCallCheck(this, State); this._id = id || (0, _random2.default)(); this._data = data; if (typeof created === 'number' && created > 0) { this._created = created; } else { this._created = parseInt(Date.now() / 1000); } this._request_type = request_type; } State.prototype.toStorageString = function toStorageString() { _Log.Log.debug("State.toStorageString"); return JSON.stringify({ id: this.id, data: this.data, created: this.created, request_type: this.request_type }); }; State.fromStorageString = function fromStorageString(storageString) { _Log.Log.debug("State.fromStorageString"); return new State(JSON.parse(storageString)); }; State.clearStaleState = function clearStaleState(storage, age) { var cutoff = Date.now() / 1000 - age; return storage.getAllKeys().then(function (keys) { _Log.Log.debug("State.clearStaleState: got keys", keys); var promises = []; var _loop = function _loop(i) { var key = keys[i]; p = storage.get(key).then(function (item) { var remove = false; if (item) { try { var state = State.fromStorageString(item); _Log.Log.debug("State.clearStaleState: got item from key: ", key, state.created); if (state.created <= cutoff) { remove = true; } } catch (e) { _Log.Log.error("State.clearStaleState: Error parsing state for key", key, e.message); remove = true; } } else { _Log.Log.debug("State.clearStaleState: no item in storage for key: ", key); remove = true; } if (remove) { _Log.Log.debug("State.clearStaleState: removed item for key: ", key); return storage.remove(key); } }); promises.push(p); }; for (var i = 0; i < keys.length; i++) { var p; _loop(i); } _Log.Log.debug("State.clearStaleState: waiting on promise count:", promises.length); return Promise.all(promises); }); }; _createClass(State, [{ key: 'id', get: function get() { return this._id; } }, { key: 'data', get: function get() { return this._data; } }, { key: 'created', get: function get() { return this._created; } }, { key: 'request_type', get: function get() { return this._request_type; } }]); return State; }(); /***/ }), /***/ "./src/Timer.js": /*!**********************!*\ !*** ./src/Timer.js ***! \**********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Timer = undefined; var _createClass = function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); var _Global = __webpack_require__(/*! ./Global.js */ "./src/Global.js"); var _Event2 = __webpack_require__(/*! ./Event.js */ "./src/Event.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var TimerDuration = 5; // seconds var Timer = exports.Timer = function (_Event) { _inherits(Timer, _Event); function Timer(name) { var timer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _Global.Global.timer; var nowFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; _classCallCheck(this, Timer); var _this = _possibleConstructorReturn(this, _Event.call(this, name)); _this._timer = timer; if (nowFunc) { _this._nowFunc = nowFunc; } else { _this._nowFunc = function () { return Date.now() / 1000; }; } return _this; } Timer.prototype.init = function init(duration) { if (duration <= 0) { duration = 1; } duration = parseInt(duration); var expiration = this.now + duration; if (this.expiration === expiration && this._timerHandle) { // no need to reinitialize to same expiration, so bail out _Log.Log.debug("Timer.init timer " + this._name + " skipping initialization since already initialized for expiration:", this.expiration); return; } this.cancel(); _Log.Log.debug("Timer.init timer " + this._name + " for duration:", duration); this._expiration = expiration; // we're using a fairly short timer and then checking the expiration in the // callback to handle scenarios where the browser device sleeps, and then // the timers end up getting delayed. var timerDuration = TimerDuration; if (duration < timerDuration) { timerDuration = duration; } this._timerHandle = this._timer.setInterval(this._callback.bind(this), timerDuration * 1000); }; Timer.prototype.cancel = function cancel() { if (this._timerHandle) { _Log.Log.debug("Timer.cancel: ", this._name); this._timer.clearInterval(this._timerHandle); this._timerHandle = null; } }; Timer.prototype._callback = function _callback() { var diff = this._expiration - this.now; _Log.Log.debug("Timer.callback; " + this._name + " timer expires in:", diff); if (this._expiration <= this.now) { this.cancel(); _Event.prototype.raise.call(this); } }; _createClass(Timer, [{ key: 'now', get: function get() { return parseInt(this._nowFunc()); } }, { key: 'expiration', get: function get() { return this._expiration; } }]); return Timer; }(_Event2.Event); /***/ }), /***/ "./src/TokenClient.js": /*!****************************!*\ !*** ./src/TokenClient.js ***! \****************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TokenClient = undefined; var _JsonService = __webpack_require__(/*! ./JsonService.js */ "./src/JsonService.js"); var _MetadataService = __webpack_require__(/*! ./MetadataService.js */ "./src/MetadataService.js"); var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var TokenClient = exports.TokenClient = function () { function TokenClient(settings) { var JsonServiceCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _JsonService.JsonService; var MetadataServiceCtor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _MetadataService.MetadataService; _classCallCheck(this, TokenClient); if (!settings) { _Log.Log.error("TokenClient.ctor: No settings passed"); throw new Error("settings"); } this._settings = settings; this._jsonService = new JsonServiceCtor(); this._metadataService = new MetadataServiceCtor(this._settings); } TokenClient.prototype.exchangeCode = function exchangeCode() { var _this = this; var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; args = Object.assign({}, args); args.grant_type = args.grant_type || "authorization_code"; args.client_id = args.client_id || this._settings.client_id; args.client_secret = args.client_secret || this._settings.client_secret; args.redirect_uri = args.redirect_uri || this._settings.redirect_uri; var basicAuth = undefined; var client_authentication = args._client_authentication || this._settings._client_authentication; delete args._client_authentication; if (!args.code) { _Log.Log.error("TokenClient.exchangeCode: No code passed"); return Promise.reject(new Error("A code is required")); } if (!args.redirect_uri) { _Log.Log.error("TokenClient.exchangeCode: No redirect_uri passed"); return Promise.reject(new Error("A redirect_uri is required")); } if (!args.code_verifier) { _Log.Log.error("TokenClient.exchangeCode: No code_verifier passed"); return Promise.reject(new Error("A code_verifier is required")); } if (!args.client_id) { _Log.Log.error("TokenClient.exchangeCode: No client_id passed"); return Promise.reject(new Error("A client_id is required")); } if (!args.client_secret && client_authentication == "client_secret_basic") { _Log.Log.error("TokenClient.exchangeCode: No client_secret passed"); return Promise.reject(new Error("A client_secret is required")); } // Sending the client credentials using the Basic Auth method if (client_authentication == "client_secret_basic") { basicAuth = args.client_id + ':' + args.client_secret; delete args.client_id; delete args.client_secret; } return this._metadataService.getTokenEndpoint(false).then(function (url) { _Log.Log.debug("TokenClient.exchangeCode: Received token endpoint"); return _this._jsonService.postForm(url, args, basicAuth).then(function (response) { _Log.Log.debug("TokenClient.exchangeCode: response received"); return response; }); }); }; TokenClient.prototype.exchangeRefreshToken = function exchangeRefreshToken() { var _this2 = this; var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; args = Object.assign({}, args); args.grant_type = args.grant_type || "refresh_token"; args.client_id = args.client_id || this._settings.client_id; args.client_secret = args.client_secret || this._settings.client_secret; var basicAuth = undefined; var client_authentication = args._client_authentication || this._settings._client_authentication; delete args._client_authentication; if (!args.refresh_token) { _Log.Log.error("TokenClient.exchangeRefreshToken: No refresh_token passed"); return Promise.reject(new Error("A refresh_token is required")); } if (!args.client_id) { _Log.Log.error("TokenClient.exchangeRefreshToken: No client_id passed"); return Promise.reject(new Error("A client_id is required")); } // Sending the client credentials using the Basic Auth method if (client_authentication == "client_secret_basic") { basicAuth = args.client_id + ':' + args.client_secret; delete args.client_id; delete args.client_secret; } return this._metadataService.getTokenEndpoint(false).then(function (url) { _Log.Log.debug("TokenClient.exchangeRefreshToken: Received token endpoint"); return _this2._jsonService.postForm(url, args, basicAuth).then(function (response) { _Log.Log.debug("TokenClient.exchangeRefreshToken: response received"); return response; }); }); }; return TokenClient; }(); /***/ }), /***/ "./src/TokenRevocationClient.js": /*!**************************************!*\ !*** ./src/TokenRevocationClient.js ***! \**************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TokenRevocationClient = undefined; var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); var _MetadataService = __webpack_require__(/*! ./MetadataService.js */ "./src/MetadataService.js"); var _Global = __webpack_require__(/*! ./Global.js */ "./src/Global.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var AccessTokenTypeHint = "access_token"; var RefreshTokenTypeHint = "refresh_token"; var TokenRevocationClient = exports.TokenRevocationClient = function () { function TokenRevocationClient(settings) { var XMLHttpRequestCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _Global.Global.XMLHttpRequest; var MetadataServiceCtor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _MetadataService.MetadataService; _classCallCheck(this, TokenRevocationClient); if (!settings) { _Log.Log.error("TokenRevocationClient.ctor: No settings provided"); throw new Error("No settings provided."); } this._settings = settings; this._XMLHttpRequestCtor = XMLHttpRequestCtor; this._metadataService = new MetadataServiceCtor(this._settings); } TokenRevocationClient.prototype.revoke = function revoke(token, required) { var _this = this; var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "access_token"; if (!token) { _Log.Log.error("TokenRevocationClient.revoke: No token provided"); throw new Error("No token provided."); } if (type !== AccessTokenTypeHint && type != RefreshTokenTypeHint) { _Log.Log.error("TokenRevocationClient.revoke: Invalid token type"); throw new Error("Invalid token type."); } return this._metadataService.getRevocationEndpoint().then(function (url) { if (!url) { if (required) { _Log.Log.error("TokenRevocationClient.revoke: Revocation not supported"); throw new Error("Revocation not supported"); } // not required, so don't error and just return return; } _Log.Log.debug("TokenRevocationClient.revoke: Revoking " + type); var client_id = _this._settings.client_id; var client_secret = _this._settings.client_secret; return _this._revoke(url, client_id, client_secret, token, type); }); }; TokenRevocationClient.prototype._revoke = function _revoke(url, client_id, client_secret, token, type) { var _this2 = this; return new Promise(function (resolve, reject) { var xhr = new _this2._XMLHttpRequestCtor(); xhr.open("POST", url); xhr.onload = function () { _Log.Log.debug("TokenRevocationClient.revoke: HTTP response received, status", xhr.status); if (xhr.status === 200) { resolve(); } else { reject(Error(xhr.statusText + " (" + xhr.status + ")")); } }; xhr.onerror = function () { _Log.Log.debug("TokenRevocationClient.revoke: Network Error."); reject("Network Error"); }; var body = "client_id=" + encodeURIComponent(client_id); if (client_secret) { body += "&client_secret=" + encodeURIComponent(client_secret); } body += "&token_type_hint=" + encodeURIComponent(type); body += "&token=" + encodeURIComponent(token); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.send(body); }); }; return TokenRevocationClient; }(); /***/ }), /***/ "./src/UrlUtility.js": /*!***************************!*\ !*** ./src/UrlUtility.js ***! \***************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.UrlUtility = undefined; var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); var _Global = __webpack_require__(/*! ./Global.js */ "./src/Global.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var UrlUtility = exports.UrlUtility = function () { function UrlUtility() { _classCallCheck(this, UrlUtility); } UrlUtility.addQueryParam = function addQueryParam(url, name, value) { if (url.indexOf('?') < 0) { url += "?"; } if (url[url.length - 1] !== "?") { url += "&"; } url += encodeURIComponent(name); url += "="; url += encodeURIComponent(value); return url; }; UrlUtility.parseUrlFragment = function parseUrlFragment(value) { var delimiter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "#"; var global = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _Global.Global; if (typeof value !== 'string') { value = global.location.href; } var idx = value.lastIndexOf(delimiter); if (idx >= 0) { value = value.substr(idx + 1); } if (delimiter === "?") { // if we're doing query, then strip off hash fragment before we parse idx = value.indexOf('#'); if (idx >= 0) { value = value.substr(0, idx); } } var params = {}, regex = /([^&=]+)=([^&]*)/g, m; var counter = 0; while (m = regex.exec(value)) { params[decodeURIComponent(m[1])] = decodeURIComponent(m[2].replace(/\+/g, ' ')); if (counter++ > 50) { _Log.Log.error("UrlUtility.parseUrlFragment: response exceeded expected number of parameters", value); return { error: "Response exceeded expected number of parameters" }; } } for (var prop in params) { return params; } return {}; }; return UrlUtility; }(); /***/ }), /***/ "./src/User.js": /*!*********************!*\ !*** ./src/User.js ***! \*********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.User = undefined; var _createClass = function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var User = exports.User = function () { function User(_ref) { var id_token = _ref.id_token, session_state = _ref.session_state, access_token = _ref.access_token, refresh_token = _ref.refresh_token, token_type = _ref.token_type, scope = _ref.scope, profile = _ref.profile, expires_at = _ref.expires_at, state = _ref.state; _classCallCheck(this, User); this.id_token = id_token; this.session_state = session_state; this.access_token = access_token; this.refresh_token = refresh_token; this.token_type = token_type; this.scope = scope; this.profile = profile; this.expires_at = expires_at; this.state = state; } User.prototype.toStorageString = function toStorageString() { _Log.Log.debug("User.toStorageString"); return JSON.stringify({ id_token: this.id_token, session_state: this.session_state, access_token: this.access_token, refresh_token: this.refresh_token, token_type: this.token_type, scope: this.scope, profile: this.profile, expires_at: this.expires_at }); }; User.fromStorageString = function fromStorageString(storageString) { _Log.Log.debug("User.fromStorageString"); return new User(JSON.parse(storageString)); }; _createClass(User, [{ key: 'expires_in', get: function get() { if (this.expires_at) { var now = parseInt(Date.now() / 1000); return this.expires_at - now; } return undefined; }, set: function set(value) { var expires_in = parseInt(value); if (typeof expires_in === 'number' && expires_in > 0) { var now = parseInt(Date.now() / 1000); this.expires_at = now + expires_in; } } }, { key: 'expired', get: function get() { var expires_in = this.expires_in; if (expires_in !== undefined) { return expires_in <= 0; } return undefined; } }, { key: 'scopes', get: function get() { return (this.scope || "").split(" "); } }]); return User; }(); /***/ }), /***/ "./src/UserInfoService.js": /*!********************************!*\ !*** ./src/UserInfoService.js ***! \********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.UserInfoService = undefined; var _JsonService = __webpack_require__(/*! ./JsonService.js */ "./src/JsonService.js"); var _MetadataService = __webpack_require__(/*! ./MetadataService.js */ "./src/MetadataService.js"); var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); var _JoseUtil = __webpack_require__(/*! ./JoseUtil.js */ "./src/JoseUtil.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var UserInfoService = exports.UserInfoService = function () { function UserInfoService(settings) { var JsonServiceCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _JsonService.JsonService; var MetadataServiceCtor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _MetadataService.MetadataService; var joseUtil = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _JoseUtil.JoseUtil; _classCallCheck(this, UserInfoService); if (!settings) { _Log.Log.error("UserInfoService.ctor: No settings passed"); throw new Error("settings"); } this._settings = settings; this._jsonService = new JsonServiceCtor(undefined, undefined, this._getClaimsFromJwt.bind(this)); this._metadataService = new MetadataServiceCtor(this._settings); this._joseUtil = joseUtil; } UserInfoService.prototype.getClaims = function getClaims(token) { var _this = this; if (!token) { _Log.Log.error("UserInfoService.getClaims: No token passed"); return Promise.reject(new Error("A token is required")); } return this._metadataService.getUserInfoEndpoint().then(function (url) { _Log.Log.debug("UserInfoService.getClaims: received userinfo url", url); return _this._jsonService.getJson(url, token).then(function (claims) { _Log.Log.debug("UserInfoService.getClaims: claims received", claims); return claims; }); }); }; UserInfoService.prototype._getClaimsFromJwt = function _getClaimsFromJwt(req) { var _this2 = this; try { var jwt = this._joseUtil.parseJwt(req.responseText); if (!jwt || !jwt.header || !jwt.payload) { _Log.Log.error("UserInfoService._getClaimsFromJwt: Failed to parse JWT", jwt); return Promise.reject(new Error("Failed to parse id_token")); } var kid = jwt.header.kid; var issuerPromise = void 0; switch (this._settings.userInfoJwtIssuer) { case 'OP': issuerPromise = this._metadataService.getIssuer(); break; case 'ANY': issuerPromise = Promise.resolve(jwt.payload.iss); break; default: issuerPromise = Promise.resolve(this._settings.userInfoJwtIssuer); break; } return issuerPromise.then(function (issuer) { _Log.Log.debug("UserInfoService._getClaimsFromJwt: Received issuer:" + issuer); return _this2._metadataService.getSigningKeys().then(function (keys) { if (!keys) { _Log.Log.error("UserInfoService._getClaimsFromJwt: No signing keys from metadata"); return Promise.reject(new Error("No signing keys from metadata")); } _Log.Log.debug("UserInfoService._getClaimsFromJwt: Received signing keys"); var key = void 0; if (!kid) { keys = _this2._filterByAlg(keys, jwt.header.alg); if (keys.length > 1) { _Log.Log.error("UserInfoService._getClaimsFromJwt: No kid found in id_token and more than one key found in metadata"); return Promise.reject(new Error("No kid found in id_token and more than one key found in metadata")); } else { // kid is mandatory only when there are multiple keys in the referenced JWK Set document // see http://openid.net/specs/openid-connect-core-1_0.html#Signing key = keys[0]; } } else { key = keys.filter(function (key) { return key.kid === kid; })[0]; } if (!key) { _Log.Log.error("UserInfoService._getClaimsFromJwt: No key matching kid or alg found in signing keys"); return Promise.reject(new Error("No key matching kid or alg found in signing keys")); } var audience = _this2._settings.client_id; var clockSkewInSeconds = _this2._settings.clockSkew; _Log.Log.debug("UserInfoService._getClaimsFromJwt: Validaing JWT; using clock skew (in seconds) of: ", clockSkewInSeconds); return _this2._joseUtil.validateJwt(req.responseText, key, issuer, audience, clockSkewInSeconds, undefined, true).then(function () { _Log.Log.debug("UserInfoService._getClaimsFromJwt: JWT validation successful"); return jwt.payload; }); }); }); return; } catch (e) { _Log.Log.error("UserInfoService._getClaimsFromJwt: Error parsing JWT response", e.message); reject(e); return; } }; UserInfoService.prototype._filterByAlg = function _filterByAlg(keys, alg) { var kty = null; if (alg.startsWith("RS")) { kty = "RSA"; } else if (alg.startsWith("PS")) { kty = "PS"; } else if (alg.startsWith("ES")) { kty = "EC"; } else { _Log.Log.debug("UserInfoService._filterByAlg: alg not supported: ", alg); return []; } _Log.Log.debug("UserInfoService._filterByAlg: Looking for keys that match kty: ", kty); keys = keys.filter(function (key) { return key.kty === kty; }); _Log.Log.debug("UserInfoService._filterByAlg: Number of keys that match kty: ", kty, keys.length); return keys; }; return UserInfoService; }(); /***/ }), /***/ "./src/UserManager.js": /*!****************************!*\ !*** ./src/UserManager.js ***! \****************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.UserManager = undefined; var _createClass = function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); var _OidcClient2 = __webpack_require__(/*! ./OidcClient.js */ "./src/OidcClient.js"); var _UserManagerSettings = __webpack_require__(/*! ./UserManagerSettings.js */ "./src/UserManagerSettings.js"); var _User = __webpack_require__(/*! ./User.js */ "./src/User.js"); var _UserManagerEvents = __webpack_require__(/*! ./UserManagerEvents.js */ "./src/UserManagerEvents.js"); var _SilentRenewService = __webpack_require__(/*! ./SilentRenewService.js */ "./src/SilentRenewService.js"); var _SessionMonitor = __webpack_require__(/*! ./SessionMonitor.js */ "./src/SessionMonitor.js"); var _SigninRequest = __webpack_require__(/*! ./SigninRequest */ "./src/SigninRequest.js"); var _TokenRevocationClient = __webpack_require__(/*! ./TokenRevocationClient.js */ "./src/TokenRevocationClient.js"); var _TokenClient = __webpack_require__(/*! ./TokenClient.js */ "./src/TokenClient.js"); var _JoseUtil = __webpack_require__(/*! ./JoseUtil.js */ "./src/JoseUtil.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var UserManager = exports.UserManager = function (_OidcClient) { _inherits(UserManager, _OidcClient); function UserManager() { var settings = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var SilentRenewServiceCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _SilentRenewService.SilentRenewService; var SessionMonitorCtor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _SessionMonitor.SessionMonitor; var TokenRevocationClientCtor = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _TokenRevocationClient.TokenRevocationClient; var TokenClientCtor = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : _TokenClient.TokenClient; var joseUtil = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : _JoseUtil.JoseUtil; _classCallCheck(this, UserManager); if (!(settings instanceof _UserManagerSettings.UserManagerSettings)) { settings = new _UserManagerSettings.UserManagerSettings(settings); } var _this = _possibleConstructorReturn(this, _OidcClient.call(this, settings)); _this._events = new _UserManagerEvents.UserManagerEvents(settings); _this._silentRenewService = new SilentRenewServiceCtor(_this); // order is important for the following properties; these services depend upon the events. if (_this.settings.automaticSilentRenew) { _Log.Log.debug("UserManager.ctor: automaticSilentRenew is configured, setting up silent renew"); _this.startSilentRenew(); } if (_this.settings.monitorSession) { _Log.Log.debug("UserManager.ctor: monitorSession is configured, setting up session monitor"); _this._sessionMonitor = new SessionMonitorCtor(_this); } _this._tokenRevocationClient = new TokenRevocationClientCtor(_this._settings); _this._tokenClient = new TokenClientCtor(_this._settings); _this._joseUtil = joseUtil; return _this; } UserManager.prototype.getUser = function getUser() { var _this2 = this; return this._loadUser().then(function (user) { if (user) { _Log.Log.info("UserManager.getUser: user loaded"); _this2._events.load(user, false); return user; } else { _Log.Log.info("UserManager.getUser: user not found in storage"); return null; } }); }; UserManager.prototype.removeUser = function removeUser() { var _this3 = this; return this.storeUser(null).then(function () { _Log.Log.info("UserManager.removeUser: user removed from storage"); _this3._events.unload(); }); }; UserManager.prototype.signinRedirect = function signinRedirect() { var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; args = Object.assign({}, args); args.request_type = "si:r"; var navParams = { useReplaceToNavigate: args.useReplaceToNavigate }; return this._signinStart(args, this._redirectNavigator, navParams).then(function () { _Log.Log.info("UserManager.signinRedirect: successful"); }); }; UserManager.prototype.signinRedirectCallback = function signinRedirectCallback(url) { return this._signinEnd(url || this._redirectNavigator.url).then(function (user) { if (user.profile && user.profile.sub) { _Log.Log.info("UserManager.signinRedirectCallback: successful, signed in sub: ", user.profile.sub); } else { _Log.Log.info("UserManager.signinRedirectCallback: no sub"); } return user; }); }; UserManager.prototype.signinPopup = function signinPopup() { var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; args = Object.assign({}, args); args.request_type = "si:p"; var url = args.redirect_uri || this.settings.popup_redirect_uri || this.settings.redirect_uri; if (!url) { _Log.Log.error("UserManager.signinPopup: No popup_redirect_uri or redirect_uri configured"); return Promise.reject(new Error("No popup_redirect_uri or redirect_uri configured")); } args.redirect_uri = url; args.display = "popup"; return this._signin(args, this._popupNavigator, { startUrl: url, popupWindowFeatures: args.popupWindowFeatures || this.settings.popupWindowFeatures, popupWindowTarget: args.popupWindowTarget || this.settings.popupWindowTarget }).then(function (user) { if (user) { if (user.profile && user.profile.sub) { _Log.Log.info("UserManager.signinPopup: signinPopup successful, signed in sub: ", user.profile.sub); } else { _Log.Log.info("UserManager.signinPopup: no sub"); } } return user; }); }; UserManager.prototype.signinPopupCallback = function signinPopupCallback(url) { return this._signinCallback(url, this._popupNavigator).then(function (user) { if (user) { if (user.profile && user.profile.sub) { _Log.Log.info("UserManager.signinPopupCallback: successful, signed in sub: ", user.profile.sub); } else { _Log.Log.info("UserManager.signinPopupCallback: no sub"); } } return user; }).catch(function (err) { _Log.Log.error( true && err.message); }); }; UserManager.prototype.signinSilent = function signinSilent() { var _this4 = this; var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; args = Object.assign({}, args); // first determine if we have a refresh token, or need to use iframe return this._loadUser().then(function (user) { if (user && user.refresh_token) { args.refresh_token = user.refresh_token; return _this4._useRefreshToken(args); } else { args.request_type = "si:s"; args.id_token_hint = args.id_token_hint || _this4.settings.includeIdTokenInSilentRenew && user && user.id_token; if (user && _this4._settings.validateSubOnSilentRenew) { _Log.Log.debug("UserManager.signinSilent, subject prior to silent renew: ", user.profile.sub); args.current_sub = user.profile.sub; } return _this4._signinSilentIframe(args); } }); }; UserManager.prototype._useRefreshToken = function _useRefreshToken() { var _this5 = this; var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; return this._tokenClient.exchangeRefreshToken(args).then(function (result) { if (!result) { _Log.Log.error("UserManager._useRefreshToken: No response returned from token endpoint"); return Promise.reject("No response returned from token endpoint"); } if (!result.access_token) { _Log.Log.error("UserManager._useRefreshToken: No access token returned from token endpoint"); return Promise.reject("No access token returned from token endpoint"); } return _this5._loadUser().then(function (user) { if (user) { var idTokenValidation = Promise.resolve(); if (result.id_token) { idTokenValidation = _this5._validateIdTokenFromTokenRefreshToken(user.profile, result.id_token); } return idTokenValidation.then(function () { _Log.Log.debug("UserManager._useRefreshToken: refresh token response success"); user.id_token = result.id_token || user.id_token; user.access_token = result.access_token; user.refresh_token = result.refresh_token || user.refresh_token; user.expires_in = result.expires_in; return _this5.storeUser(user).then(function () { _this5._events.load(user); return user; }); }); } else { return null; } }); }); }; UserManager.prototype._validateIdTokenFromTokenRefreshToken = function _validateIdTokenFromTokenRefreshToken(profile, id_token) { var _this6 = this; return this._metadataService.getIssuer().then(function (issuer) { return _this6.settings.getEpochTime().then(function (now) { return _this6._joseUtil.validateJwtAttributes(id_token, issuer, _this6._settings.client_id, _this6._settings.clockSkew, now).then(function (payload) { if (!payload) { _Log.Log.error("UserManager._validateIdTokenFromTokenRefreshToken: Failed to validate id_token"); return Promise.reject(new Error("Failed to validate id_token")); } if (payload.sub !== profile.sub) { _Log.Log.error("UserManager._validateIdTokenFromTokenRefreshToken: sub in id_token does not match current sub"); return Promise.reject(new Error("sub in id_token does not match current sub")); } if (payload.auth_time && payload.auth_time !== profile.auth_time) { _Log.Log.error("UserManager._validateIdTokenFromTokenRefreshToken: auth_time in id_token does not match original auth_time"); return Promise.reject(new Error("auth_time in id_token does not match original auth_time")); } if (payload.azp && payload.azp !== profile.azp) { _Log.Log.error("UserManager._validateIdTokenFromTokenRefreshToken: azp in id_token does not match original azp"); return Promise.reject(new Error("azp in id_token does not match original azp")); } if (!payload.azp && profile.azp) { _Log.Log.error("UserManager._validateIdTokenFromTokenRefreshToken: azp not in id_token, but present in original id_token"); return Promise.reject(new Error("azp not in id_token, but present in original id_token")); } }); }); }); }; UserManager.prototype._signinSilentIframe = function _signinSilentIframe() { var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var url = args.redirect_uri || this.settings.silent_redirect_uri || this.settings.redirect_uri; if (!url) { _Log.Log.error("UserManager.signinSilent: No silent_redirect_uri configured"); return Promise.reject(new Error("No silent_redirect_uri configured")); } args.redirect_uri = url; args.prompt = args.prompt || "none"; return this._signin(args, this._iframeNavigator, { startUrl: url, silentRequestTimeout: args.silentRequestTimeout || this.settings.silentRequestTimeout }).then(function (user) { if (user) { if (user.profile && user.profile.sub) { _Log.Log.info("UserManager.signinSilent: successful, signed in sub: ", user.profile.sub); } else { _Log.Log.info("UserManager.signinSilent: no sub"); } } return user; }); }; UserManager.prototype.signinSilentCallback = function signinSilentCallback(url) { return this._signinCallback(url, this._iframeNavigator).then(function (user) { if (user) { if (user.profile && user.profile.sub) { _Log.Log.info("UserManager.signinSilentCallback: successful, signed in sub: ", user.profile.sub); } else { _Log.Log.info("UserManager.signinSilentCallback: no sub"); } } return user; }); }; UserManager.prototype.signinCallback = function signinCallback(url) { var _this7 = this; return this.readSigninResponseState(url).then(function (_ref) { var state = _ref.state, response = _ref.response; if (state.request_type === "si:r") { return _this7.signinRedirectCallback(url); } if (state.request_type === "si:p") { return _this7.signinPopupCallback(url); } if (state.request_type === "si:s") { return _this7.signinSilentCallback(url); } return Promise.reject(new Error("invalid response_type in state")); }); }; UserManager.prototype.signoutCallback = function signoutCallback(url, keepOpen) { var _this8 = this; return this.readSignoutResponseState(url).then(function (_ref2) { var state = _ref2.state, response = _ref2.response; if (state) { if (state.request_type === "so:r") { return _this8.signoutRedirectCallback(url); } if (state.request_type === "so:p") { return _this8.signoutPopupCallback(url, keepOpen); } return Promise.reject(new Error("invalid response_type in state")); } return response; }); }; UserManager.prototype.querySessionStatus = function querySessionStatus() { var _this9 = this; var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; args = Object.assign({}, args); args.request_type = "si:s"; // this acts like a signin silent var url = args.redirect_uri || this.settings.silent_redirect_uri || this.settings.redirect_uri; if (!url) { _Log.Log.error("UserManager.querySessionStatus: No silent_redirect_uri configured"); return Promise.reject(new Error("No silent_redirect_uri configured")); } args.redirect_uri = url; args.prompt = "none"; args.response_type = args.response_type || this.settings.query_status_response_type; args.scope = args.scope || "openid"; args.skipUserInfo = true; return this._signinStart(args, this._iframeNavigator, { startUrl: url, silentRequestTimeout: args.silentRequestTimeout || this.settings.silentRequestTimeout }).then(function (navResponse) { return _this9.processSigninResponse(navResponse.url).then(function (signinResponse) { _Log.Log.debug("UserManager.querySessionStatus: got signin response"); if (signinResponse.session_state && signinResponse.profile.sub) { _Log.Log.info("UserManager.querySessionStatus: querySessionStatus success for sub: ", signinResponse.profile.sub); return { session_state: signinResponse.session_state, sub: signinResponse.profile.sub, sid: signinResponse.profile.sid }; } else { _Log.Log.info("querySessionStatus successful, user not authenticated"); } }).catch(function (err) { if (err.session_state && _this9.settings.monitorAnonymousSession) { if (err.message == "login_required" || err.message == "consent_required" || err.message == "interaction_required" || err.message == "account_selection_required") { _Log.Log.info("UserManager.querySessionStatus: querySessionStatus success for anonymous user"); return { session_state: err.session_state }; } } throw err; }); }); }; UserManager.prototype._signin = function _signin(args, navigator) { var _this10 = this; var navigatorParams = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; return this._signinStart(args, navigator, navigatorParams).then(function (navResponse) { return _this10._signinEnd(navResponse.url, args); }); }; UserManager.prototype._signinStart = function _signinStart(args, navigator) { var _this11 = this; var navigatorParams = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; return navigator.prepare(navigatorParams).then(function (handle) { _Log.Log.debug("UserManager._signinStart: got navigator window handle"); return _this11.createSigninRequest(args).then(function (signinRequest) { _Log.Log.debug("UserManager._signinStart: got signin request"); navigatorParams.url = signinRequest.url; navigatorParams.id = signinRequest.state.id; return handle.navigate(navigatorParams); }).catch(function (err) { if (handle.close) { _Log.Log.debug("UserManager._signinStart: Error after preparing navigator, closing navigator window"); handle.close(); } throw err; }); }); }; UserManager.prototype._signinEnd = function _signinEnd(url) { var _this12 = this; var args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; return this.processSigninResponse(url).then(function (signinResponse) { _Log.Log.debug("UserManager._signinEnd: got signin response"); var user = new _User.User(signinResponse); if (args.current_sub) { if (args.current_sub !== user.profile.sub) { _Log.Log.debug("UserManager._signinEnd: current user does not match user returned from signin. sub from signin: ", user.profile.sub); return Promise.reject(new Error("login_required")); } else { _Log.Log.debug("UserManager._signinEnd: current user matches user returned from signin"); } } return _this12.storeUser(user).then(function () { _Log.Log.debug("UserManager._signinEnd: user stored"); _this12._events.load(user); return user; }); }); }; UserManager.prototype._signinCallback = function _signinCallback(url, navigator) { _Log.Log.debug("UserManager._signinCallback"); var useQuery = this._settings.response_mode === "query" || !this._settings.response_mode && _SigninRequest.SigninRequest.isCode(this._settings.response_type); var delimiter = useQuery ? "?" : "#"; return navigator.callback(url, undefined, delimiter); }; UserManager.prototype.signoutRedirect = function signoutRedirect() { var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; args = Object.assign({}, args); args.request_type = "so:r"; var postLogoutRedirectUri = args.post_logout_redirect_uri || this.settings.post_logout_redirect_uri; if (postLogoutRedirectUri) { args.post_logout_redirect_uri = postLogoutRedirectUri; } var navParams = { useReplaceToNavigate: args.useReplaceToNavigate }; return this._signoutStart(args, this._redirectNavigator, navParams).then(function () { _Log.Log.info("UserManager.signoutRedirect: successful"); }); }; UserManager.prototype.signoutRedirectCallback = function signoutRedirectCallback(url) { return this._signoutEnd(url || this._redirectNavigator.url).then(function (response) { _Log.Log.info("UserManager.signoutRedirectCallback: successful"); return response; }); }; UserManager.prototype.signoutPopup = function signoutPopup() { var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; args = Object.assign({}, args); args.request_type = "so:p"; var url = args.post_logout_redirect_uri || this.settings.popup_post_logout_redirect_uri || this.settings.post_logout_redirect_uri; args.post_logout_redirect_uri = url; args.display = "popup"; if (args.post_logout_redirect_uri) { // we're putting a dummy entry in here because we // need a unique id from the state for notification // to the parent window, which is necessary if we // plan to return back to the client after signout // and so we can close the popup after signout args.state = args.state || {}; } return this._signout(args, this._popupNavigator, { startUrl: url, popupWindowFeatures: args.popupWindowFeatures || this.settings.popupWindowFeatures, popupWindowTarget: args.popupWindowTarget || this.settings.popupWindowTarget }).then(function () { _Log.Log.info("UserManager.signoutPopup: successful"); }); }; UserManager.prototype.signoutPopupCallback = function signoutPopupCallback(url, keepOpen) { if (typeof keepOpen === 'undefined' && typeof url === 'boolean') { keepOpen = url; url = null; } var delimiter = '?'; return this._popupNavigator.callback(url, keepOpen, delimiter).then(function () { _Log.Log.info("UserManager.signoutPopupCallback: successful"); }); }; UserManager.prototype._signout = function _signout(args, navigator) { var _this13 = this; var navigatorParams = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; return this._signoutStart(args, navigator, navigatorParams).then(function (navResponse) { return _this13._signoutEnd(navResponse.url); }); }; UserManager.prototype._signoutStart = function _signoutStart() { var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var _this14 = this; var navigator = arguments[1]; var navigatorParams = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; return navigator.prepare(navigatorParams).then(function (handle) { _Log.Log.debug("UserManager._signoutStart: got navigator window handle"); return _this14._loadUser().then(function (user) { _Log.Log.debug("UserManager._signoutStart: loaded current user from storage"); var revokePromise = _this14._settings.revokeAccessTokenOnSignout ? _this14._revokeInternal(user) : Promise.resolve(); return revokePromise.then(function () { var id_token = args.id_token_hint || user && user.id_token; if (id_token) { _Log.Log.debug("UserManager._signoutStart: Setting id_token into signout request"); args.id_token_hint = id_token; } return _this14.removeUser().then(function () { _Log.Log.debug("UserManager._signoutStart: user removed, creating signout request"); return _this14.createSignoutRequest(args).then(function (signoutRequest) { _Log.Log.debug("UserManager._signoutStart: got signout request"); navigatorParams.url = signoutRequest.url; if (signoutRequest.state) { navigatorParams.id = signoutRequest.state.id; } return handle.navigate(navigatorParams); }); }); }); }).catch(function (err) { if (handle.close) { _Log.Log.debug("UserManager._signoutStart: Error after preparing navigator, closing navigator window"); handle.close(); } throw err; }); }); }; UserManager.prototype._signoutEnd = function _signoutEnd(url) { return this.processSignoutResponse(url).then(function (signoutResponse) { _Log.Log.debug("UserManager._signoutEnd: got signout response"); return signoutResponse; }); }; UserManager.prototype.revokeAccessToken = function revokeAccessToken() { var _this15 = this; return this._loadUser().then(function (user) { return _this15._revokeInternal(user, true).then(function (success) { if (success) { _Log.Log.debug("UserManager.revokeAccessToken: removing token properties from user and re-storing"); user.access_token = null; user.refresh_token = null; user.expires_at = null; user.token_type = null; return _this15.storeUser(user).then(function () { _Log.Log.debug("UserManager.revokeAccessToken: user stored"); _this15._events.load(user); }); } }); }).then(function () { _Log.Log.info("UserManager.revokeAccessToken: access token revoked successfully"); }); }; UserManager.prototype._revokeInternal = function _revokeInternal(user, required) { var _this16 = this; if (user) { var access_token = user.access_token; var refresh_token = user.refresh_token; return this._revokeAccessTokenInternal(access_token, required).then(function (atSuccess) { return _this16._revokeRefreshTokenInternal(refresh_token, required).then(function (rtSuccess) { if (!atSuccess && !rtSuccess) { _Log.Log.debug("UserManager.revokeAccessToken: no need to revoke due to no token(s), or JWT format"); } return atSuccess || rtSuccess; }); }); } return Promise.resolve(false); }; UserManager.prototype._revokeAccessTokenInternal = function _revokeAccessTokenInternal(access_token, required) { // check for JWT vs. reference token if (!access_token || access_token.indexOf('.') >= 0) { return Promise.resolve(false); } return this._tokenRevocationClient.revoke(access_token, required).then(function () { return true; }); }; UserManager.prototype._revokeRefreshTokenInternal = function _revokeRefreshTokenInternal(refresh_token, required) { if (!refresh_token) { return Promise.resolve(false); } return this._tokenRevocationClient.revoke(refresh_token, required, "refresh_token").then(function () { return true; }); }; UserManager.prototype.startSilentRenew = function startSilentRenew() { this._silentRenewService.start(); }; UserManager.prototype.stopSilentRenew = function stopSilentRenew() { this._silentRenewService.stop(); }; UserManager.prototype._loadUser = function _loadUser() { return this._userStore.get(this._userStoreKey).then(function (storageString) { if (storageString) { _Log.Log.debug("UserManager._loadUser: user storageString loaded"); return _User.User.fromStorageString(storageString); } _Log.Log.debug("UserManager._loadUser: no user storageString"); return null; }); }; UserManager.prototype.storeUser = function storeUser(user) { if (user) { _Log.Log.debug("UserManager.storeUser: storing user"); var storageString = user.toStorageString(); return this._userStore.set(this._userStoreKey, storageString); } else { _Log.Log.debug("storeUser.storeUser: removing user"); return this._userStore.remove(this._userStoreKey); } }; _createClass(UserManager, [{ key: '_redirectNavigator', get: function get() { return this.settings.redirectNavigator; } }, { key: '_popupNavigator', get: function get() { return this.settings.popupNavigator; } }, { key: '_iframeNavigator', get: function get() { return this.settings.iframeNavigator; } }, { key: '_userStore', get: function get() { return this.settings.userStore; } }, { key: 'events', get: function get() { return this._events; } }, { key: '_userStoreKey', get: function get() { return 'user:' + this.settings.authority + ':' + this.settings.client_id; } }]); return UserManager; }(_OidcClient2.OidcClient); /***/ }), /***/ "./src/UserManagerEvents.js": /*!**********************************!*\ !*** ./src/UserManagerEvents.js ***! \**********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.UserManagerEvents = undefined; var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); var _AccessTokenEvents2 = __webpack_require__(/*! ./AccessTokenEvents.js */ "./src/AccessTokenEvents.js"); var _Event = __webpack_require__(/*! ./Event.js */ "./src/Event.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var UserManagerEvents = exports.UserManagerEvents = function (_AccessTokenEvents) { _inherits(UserManagerEvents, _AccessTokenEvents); function UserManagerEvents(settings) { _classCallCheck(this, UserManagerEvents); var _this = _possibleConstructorReturn(this, _AccessTokenEvents.call(this, settings)); _this._userLoaded = new _Event.Event("User loaded"); _this._userUnloaded = new _Event.Event("User unloaded"); _this._silentRenewError = new _Event.Event("Silent renew error"); _this._userSignedIn = new _Event.Event("User signed in"); _this._userSignedOut = new _Event.Event("User signed out"); _this._userSessionChanged = new _Event.Event("User session changed"); return _this; } UserManagerEvents.prototype.load = function load(user) { var raiseEvent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; _Log.Log.debug("UserManagerEvents.load"); _AccessTokenEvents.prototype.load.call(this, user); if (raiseEvent) { this._userLoaded.raise(user); } }; UserManagerEvents.prototype.unload = function unload() { _Log.Log.debug("UserManagerEvents.unload"); _AccessTokenEvents.prototype.unload.call(this); this._userUnloaded.raise(); }; UserManagerEvents.prototype.addUserLoaded = function addUserLoaded(cb) { this._userLoaded.addHandler(cb); }; UserManagerEvents.prototype.removeUserLoaded = function removeUserLoaded(cb) { this._userLoaded.removeHandler(cb); }; UserManagerEvents.prototype.addUserUnloaded = function addUserUnloaded(cb) { this._userUnloaded.addHandler(cb); }; UserManagerEvents.prototype.removeUserUnloaded = function removeUserUnloaded(cb) { this._userUnloaded.removeHandler(cb); }; UserManagerEvents.prototype.addSilentRenewError = function addSilentRenewError(cb) { this._silentRenewError.addHandler(cb); }; UserManagerEvents.prototype.removeSilentRenewError = function removeSilentRenewError(cb) { this._silentRenewError.removeHandler(cb); }; UserManagerEvents.prototype._raiseSilentRenewError = function _raiseSilentRenewError(e) { _Log.Log.debug("UserManagerEvents._raiseSilentRenewError", e.message); this._silentRenewError.raise(e); }; UserManagerEvents.prototype.addUserSignedIn = function addUserSignedIn(cb) { this._userSignedIn.addHandler(cb); }; UserManagerEvents.prototype.removeUserSignedIn = function removeUserSignedIn(cb) { this._userSignedIn.removeHandler(cb); }; UserManagerEvents.prototype._raiseUserSignedIn = function _raiseUserSignedIn() { _Log.Log.debug("UserManagerEvents._raiseUserSignedIn"); this._userSignedIn.raise(); }; UserManagerEvents.prototype.addUserSignedOut = function addUserSignedOut(cb) { this._userSignedOut.addHandler(cb); }; UserManagerEvents.prototype.removeUserSignedOut = function removeUserSignedOut(cb) { this._userSignedOut.removeHandler(cb); }; UserManagerEvents.prototype._raiseUserSignedOut = function _raiseUserSignedOut() { _Log.Log.debug("UserManagerEvents._raiseUserSignedOut"); this._userSignedOut.raise(); }; UserManagerEvents.prototype.addUserSessionChanged = function addUserSessionChanged(cb) { this._userSessionChanged.addHandler(cb); }; UserManagerEvents.prototype.removeUserSessionChanged = function removeUserSessionChanged(cb) { this._userSessionChanged.removeHandler(cb); }; UserManagerEvents.prototype._raiseUserSessionChanged = function _raiseUserSessionChanged() { _Log.Log.debug("UserManagerEvents._raiseUserSessionChanged"); this._userSessionChanged.raise(); }; return UserManagerEvents; }(_AccessTokenEvents2.AccessTokenEvents); /***/ }), /***/ "./src/UserManagerSettings.js": /*!************************************!*\ !*** ./src/UserManagerSettings.js ***! \************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.UserManagerSettings = undefined; var _createClass = function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); var _OidcClientSettings2 = __webpack_require__(/*! ./OidcClientSettings.js */ "./src/OidcClientSettings.js"); var _RedirectNavigator = __webpack_require__(/*! ./RedirectNavigator.js */ "./src/RedirectNavigator.js"); var _PopupNavigator = __webpack_require__(/*! ./PopupNavigator.js */ "./src/PopupNavigator.js"); var _IFrameNavigator = __webpack_require__(/*! ./IFrameNavigator.js */ "./src/IFrameNavigator.js"); var _WebStorageStateStore = __webpack_require__(/*! ./WebStorageStateStore.js */ "./src/WebStorageStateStore.js"); var _Global = __webpack_require__(/*! ./Global.js */ "./src/Global.js"); var _SigninRequest = __webpack_require__(/*! ./SigninRequest.js */ "./src/SigninRequest.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var DefaultAccessTokenExpiringNotificationTime = 60; var DefaultCheckSessionInterval = 2000; var UserManagerSettings = exports.UserManagerSettings = function (_OidcClientSettings) { _inherits(UserManagerSettings, _OidcClientSettings); function UserManagerSettings() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, popup_redirect_uri = _ref.popup_redirect_uri, popup_post_logout_redirect_uri = _ref.popup_post_logout_redirect_uri, popupWindowFeatures = _ref.popupWindowFeatures, popupWindowTarget = _ref.popupWindowTarget, silent_redirect_uri = _ref.silent_redirect_uri, silentRequestTimeout = _ref.silentRequestTimeout, _ref$automaticSilentR = _ref.automaticSilentRenew, automaticSilentRenew = _ref$automaticSilentR === undefined ? false : _ref$automaticSilentR, _ref$validateSubOnSil = _ref.validateSubOnSilentRenew, validateSubOnSilentRenew = _ref$validateSubOnSil === undefined ? false : _ref$validateSubOnSil, _ref$includeIdTokenIn = _ref.includeIdTokenInSilentRenew, includeIdTokenInSilentRenew = _ref$includeIdTokenIn === undefined ? true : _ref$includeIdTokenIn, _ref$monitorSession = _ref.monitorSession, monitorSession = _ref$monitorSession === undefined ? true : _ref$monitorSession, _ref$monitorAnonymous = _ref.monitorAnonymousSession, monitorAnonymousSession = _ref$monitorAnonymous === undefined ? false : _ref$monitorAnonymous, _ref$checkSessionInte = _ref.checkSessionInterval, checkSessionInterval = _ref$checkSessionInte === undefined ? DefaultCheckSessionInterval : _ref$checkSessionInte, _ref$stopCheckSession = _ref.stopCheckSessionOnError, stopCheckSessionOnError = _ref$stopCheckSession === undefined ? true : _ref$stopCheckSession, query_status_response_type = _ref.query_status_response_type, _ref$revokeAccessToke = _ref.revokeAccessTokenOnSignout, revokeAccessTokenOnSignout = _ref$revokeAccessToke === undefined ? false : _ref$revokeAccessToke, _ref$accessTokenExpir = _ref.accessTokenExpiringNotificationTime, accessTokenExpiringNotificationTime = _ref$accessTokenExpir === undefined ? DefaultAccessTokenExpiringNotificationTime : _ref$accessTokenExpir, _ref$redirectNavigato = _ref.redirectNavigator, redirectNavigator = _ref$redirectNavigato === undefined ? new _RedirectNavigator.RedirectNavigator() : _ref$redirectNavigato, _ref$popupNavigator = _ref.popupNavigator, popupNavigator = _ref$popupNavigator === undefined ? new _PopupNavigator.PopupNavigator() : _ref$popupNavigator, _ref$iframeNavigator = _ref.iframeNavigator, iframeNavigator = _ref$iframeNavigator === undefined ? new _IFrameNavigator.IFrameNavigator() : _ref$iframeNavigator, _ref$userStore = _ref.userStore, userStore = _ref$userStore === undefined ? new _WebStorageStateStore.WebStorageStateStore({ store: _Global.Global.sessionStorage }) : _ref$userStore; _classCallCheck(this, UserManagerSettings); var _this = _possibleConstructorReturn(this, _OidcClientSettings.call(this, arguments[0])); _this._popup_redirect_uri = popup_redirect_uri; _this._popup_post_logout_redirect_uri = popup_post_logout_redirect_uri; _this._popupWindowFeatures = popupWindowFeatures; _this._popupWindowTarget = popupWindowTarget; _this._silent_redirect_uri = silent_redirect_uri; _this._silentRequestTimeout = silentRequestTimeout; _this._automaticSilentRenew = automaticSilentRenew; _this._validateSubOnSilentRenew = validateSubOnSilentRenew; _this._includeIdTokenInSilentRenew = includeIdTokenInSilentRenew; _this._accessTokenExpiringNotificationTime = accessTokenExpiringNotificationTime; _this._monitorSession = monitorSession; _this._monitorAnonymousSession = monitorAnonymousSession; _this._checkSessionInterval = checkSessionInterval; _this._stopCheckSessionOnError = stopCheckSessionOnError; if (query_status_response_type) { _this._query_status_response_type = query_status_response_type; } else if (arguments[0] && arguments[0].response_type) { _this._query_status_response_type = _SigninRequest.SigninRequest.isOidc(arguments[0].response_type) ? "id_token" : "code"; } else { _this._query_status_response_type = "id_token"; } _this._revokeAccessTokenOnSignout = revokeAccessTokenOnSignout; _this._redirectNavigator = redirectNavigator; _this._popupNavigator = popupNavigator; _this._iframeNavigator = iframeNavigator; _this._userStore = userStore; return _this; } _createClass(UserManagerSettings, [{ key: 'popup_redirect_uri', get: function get() { return this._popup_redirect_uri; } }, { key: 'popup_post_logout_redirect_uri', get: function get() { return this._popup_post_logout_redirect_uri; } }, { key: 'popupWindowFeatures', get: function get() { return this._popupWindowFeatures; } }, { key: 'popupWindowTarget', get: function get() { return this._popupWindowTarget; } }, { key: 'silent_redirect_uri', get: function get() { return this._silent_redirect_uri; } }, { key: 'silentRequestTimeout', get: function get() { return this._silentRequestTimeout; } }, { key: 'automaticSilentRenew', get: function get() { return this._automaticSilentRenew; } }, { key: 'validateSubOnSilentRenew', get: function get() { return this._validateSubOnSilentRenew; } }, { key: 'includeIdTokenInSilentRenew', get: function get() { return this._includeIdTokenInSilentRenew; } }, { key: 'accessTokenExpiringNotificationTime', get: function get() { return this._accessTokenExpiringNotificationTime; } }, { key: 'monitorSession', get: function get() { return this._monitorSession; } }, { key: 'monitorAnonymousSession', get: function get() { return this._monitorAnonymousSession; } }, { key: 'checkSessionInterval', get: function get() { return this._checkSessionInterval; } }, { key: 'stopCheckSessionOnError', get: function get() { return this._stopCheckSessionOnError; } }, { key: 'query_status_response_type', get: function get() { return this._query_status_response_type; } }, { key: 'revokeAccessTokenOnSignout', get: function get() { return this._revokeAccessTokenOnSignout; } }, { key: 'redirectNavigator', get: function get() { return this._redirectNavigator; } }, { key: 'popupNavigator', get: function get() { return this._popupNavigator; } }, { key: 'iframeNavigator', get: function get() { return this._iframeNavigator; } }, { key: 'userStore', get: function get() { return this._userStore; } }]); return UserManagerSettings; }(_OidcClientSettings2.OidcClientSettings); /***/ }), /***/ "./src/WebStorageStateStore.js": /*!*************************************!*\ !*** ./src/WebStorageStateStore.js ***! \*************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.WebStorageStateStore = undefined; var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js"); var _Global = __webpack_require__(/*! ./Global.js */ "./src/Global.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved. // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. var WebStorageStateStore = exports.WebStorageStateStore = function () { function WebStorageStateStore() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$prefix = _ref.prefix, prefix = _ref$prefix === undefined ? "oidc." : _ref$prefix, _ref$store = _ref.store, store = _ref$store === undefined ? _Global.Global.localStorage : _ref$store; _classCallCheck(this, WebStorageStateStore); this._store = store; this._prefix = prefix; } WebStorageStateStore.prototype.set = function set(key, value) { _Log.Log.debug("WebStorageStateStore.set", key); key = this._prefix + key; this._store.setItem(key, value); return Promise.resolve(); }; WebStorageStateStore.prototype.get = function get(key) { _Log.Log.debug("WebStorageStateStore.get", key); key = this._prefix + key; var item = this._store.getItem(key); return Promise.resolve(item); }; WebStorageStateStore.prototype.remove = function remove(key) { _Log.Log.debug("WebStorageStateStore.remove", key); key = this._prefix + key; var item = this._store.getItem(key); this._store.removeItem(key); return Promise.resolve(item); }; WebStorageStateStore.prototype.getAllKeys = function getAllKeys() { _Log.Log.debug("WebStorageStateStore.getAllKeys"); var keys = []; for (var index = 0; index < this._store.length; index++) { var key = this._store.key(index); if (key.indexOf(this._prefix) === 0) { keys.push(key.substr(this._prefix.length)); } } return Promise.resolve(keys); }; return WebStorageStateStore; }(); /***/ }), /***/ "./src/crypto/jsrsasign.js": /*!*********************************!*\ !*** ./src/crypto/jsrsasign.js ***! \*********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AllowedSigningAlgs = exports.b64tohex = exports.hextob64u = exports.crypto = exports.X509 = exports.KeyUtil = exports.jws = undefined; var _jsrsasign = __webpack_require__(/*! ../../jsrsasign/dist/jsrsasign.js */ "./jsrsasign/dist/jsrsasign.js"); var AllowedSigningAlgs = ['RS256', 'RS384', 'RS512', 'PS256', 'PS384', 'PS512', 'ES256', 'ES384', 'ES512']; exports.jws = _jsrsasign.jws; exports.KeyUtil = _jsrsasign.KEYUTIL; exports.X509 = _jsrsasign.X509; exports.crypto = _jsrsasign.crypto; exports.hextob64u = _jsrsasign.hextob64u; exports.b64tohex = _jsrsasign.b64tohex; exports.AllowedSigningAlgs = AllowedSigningAlgs; /***/ }), /***/ "./src/random.js": /*!***********************!*\ !*** ./src/random.js ***! \***********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = random; /** * Generates RFC4122 version 4 guid () */ var crypto = typeof window !== 'undefined' ? window.crypto || window.msCrypto : null; function _cryptoUuidv4() { return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, function (c) { return (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16); }); } function _uuidv4() { return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, function (c) { return (c ^ Math.random() * 16 >> c / 4).toString(16); }); } function random() { var hasCrypto = crypto != 'undefined' && crypto !== null; var hasRandomValues = hasCrypto && typeof crypto.getRandomValues != 'undefined'; var uuid = hasRandomValues ? _cryptoUuidv4 : _uuidv4; return uuid().replace(/-/g, ''); } module.exports = exports['default']; /***/ }), /***/ "./version.js": /*!********************!*\ !*** ./version.js ***! \********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Version = "1.11.5";exports.Version = Version; /***/ }), /***/ 0: /*!***************************************!*\ !*** multi ./polyfills.js ./index.js ***! \***************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(/*! ./polyfills.js */"./polyfills.js"); module.exports = __webpack_require__(/*! ./index.js */"./index.js"); /***/ }) /******/ }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9PaWRjL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL09pZGMvLi9pbmRleC5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vanNyc2FzaWduL2Rpc3QvanNyc2FzaWduLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvYmFzZTY0LWpzL2luZGV4LmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9hcnJheS9maW5kLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9hcnJheS9pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvYXJyYXkvc29tZS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvYXJyYXkvc3BsaWNlLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9mdW5jdGlvbi9iaW5kLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9vYmplY3QvYXNzaWduLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9wcm9taXNlL2luZGV4LmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9mZWF0dXJlcy9hcnJheS9maW5kLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9mZWF0dXJlcy9hcnJheS9pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZmVhdHVyZXMvYXJyYXkvc29tZS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZmVhdHVyZXMvYXJyYXkvc3BsaWNlLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9mZWF0dXJlcy9mdW5jdGlvbi9iaW5kLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9mZWF0dXJlcy9vYmplY3QvYXNzaWduLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9mZWF0dXJlcy9wcm9taXNlL2luZGV4LmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0LmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWlzLXN0cmljdC5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LW1ldGhvZC11c2VzLXRvLWxlbmd0aC5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50LmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9tLWl0ZXJhYmxlcy5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy13ZWJvcy13ZWJraXQuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudC5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW50cnktdW5iaW5kLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRkZW4ta2V5cy5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycy5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2h0bWwuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pZTgtZG9tLWRlZmluZS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0LmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvci1jbG9zZS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWljcm90YXNrLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtc3ltYm9sLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGF0aC5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BlcmZvcm0uanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS1hbGwuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtc3BlY2llcy5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1zdG9yZS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdGFzay5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0LmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdWlkLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hZ2dyZWdhdGUtZXJyb3IuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zb21lLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNwbGljZS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5mdW5jdGlvbi5iaW5kLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuYW55LmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuZmluYWxseS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYWdncmVnYXRlLWVycm9yLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5wcm9taXNlLmFsbC1zZXR0bGVkLmpzIiwid2VicGFjazovL09pZGMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5wcm9taXNlLmFueS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQucHJvbWlzZS50cnkuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL25vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiwid2VicGFjazovL09pZGMvKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovL09pZGMvLi9wb2x5ZmlsbHMuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL3NyYy9BY2Nlc3NUb2tlbkV2ZW50cy5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vc3JjL0NoZWNrU2Vzc2lvbklGcmFtZS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vc3JjL0Nsb2NrU2VydmljZS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vc3JjL0NvcmRvdmFJRnJhbWVOYXZpZ2F0b3IuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL3NyYy9Db3Jkb3ZhUG9wdXBOYXZpZ2F0b3IuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL3NyYy9Db3Jkb3ZhUG9wdXBXaW5kb3cuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL3NyYy9FcnJvclJlc3BvbnNlLmpzIiwid2VicGFjazovL09pZGMvLi9zcmMvRXZlbnQuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL3NyYy9HbG9iYWwuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL3NyYy9JRnJhbWVOYXZpZ2F0b3IuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL3NyYy9JRnJhbWVXaW5kb3cuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL3NyYy9Jbk1lbW9yeVdlYlN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL3NyYy9Kb3NlVXRpbC5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vc3JjL0pvc2VVdGlsSW1wbC5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vc3JjL0pzb25TZXJ2aWNlLmpzIiwid2VicGFjazovL09pZGMvLi9zcmMvTG9nLmpzIiwid2VicGFjazovL09pZGMvLi9zcmMvTWV0YWRhdGFTZXJ2aWNlLmpzIiwid2VicGFjazovL09pZGMvLi9zcmMvT2lkY0NsaWVudC5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vc3JjL09pZGNDbGllbnRTZXR0aW5ncy5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vc3JjL1BvcHVwTmF2aWdhdG9yLmpzIiwid2VicGFjazovL09pZGMvLi9zcmMvUG9wdXBXaW5kb3cuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL3NyYy9SZWRpcmVjdE5hdmlnYXRvci5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vc3JjL1Jlc3BvbnNlVmFsaWRhdG9yLmpzIiwid2VicGFjazovL09pZGMvLi9zcmMvU2Vzc2lvbk1vbml0b3IuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL3NyYy9TaWduaW5SZXF1ZXN0LmpzIiwid2VicGFjazovL09pZGMvLi9zcmMvU2lnbmluUmVzcG9uc2UuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL3NyYy9TaWduaW5TdGF0ZS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vc3JjL1NpZ25vdXRSZXF1ZXN0LmpzIiwid2VicGFjazovL09pZGMvLi9zcmMvU2lnbm91dFJlc3BvbnNlLmpzIiwid2VicGFjazovL09pZGMvLi9zcmMvU2lsZW50UmVuZXdTZXJ2aWNlLmpzIiwid2VicGFjazovL09pZGMvLi9zcmMvU3RhdGUuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL3NyYy9UaW1lci5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vc3JjL1Rva2VuQ2xpZW50LmpzIiwid2VicGFjazovL09pZGMvLi9zcmMvVG9rZW5SZXZvY2F0aW9uQ2xpZW50LmpzIiwid2VicGFjazovL09pZGMvLi9zcmMvVXJsVXRpbGl0eS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vc3JjL1VzZXIuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL3NyYy9Vc2VySW5mb1NlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vT2lkYy8uL3NyYy9Vc2VyTWFuYWdlci5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vc3JjL1VzZXJNYW5hZ2VyRXZlbnRzLmpzIiwid2VicGFjazovL09pZGMvLi9zcmMvVXNlck1hbmFnZXJTZXR0aW5ncy5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vc3JjL1dlYlN0b3JhZ2VTdGF0ZVN0b3JlLmpzIiwid2VicGFjazovL09pZGMvLi9zcmMvY3J5cHRvL2pzcnNhc2lnbi5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vc3JjL3JhbmRvbS5qcyIsIndlYnBhY2s6Ly9PaWRjLy4vdmVyc2lvbi5qcyJdLCJuYW1lcyI6WyJWZXJzaW9uIiwiTG9nIiwiT2lkY0NsaWVudCIsIk9pZGNDbGllbnRTZXR0aW5ncyIsIldlYlN0b3JhZ2VTdGF0ZVN0b3JlIiwiSW5NZW1vcnlXZWJTdG9yYWdlIiwiVXNlck1hbmFnZXIiLCJBY2Nlc3NUb2tlbkV2ZW50cyIsIk1ldGFkYXRhU2VydmljZSIsIkNvcmRvdmFQb3B1cE5hdmlnYXRvciIsIkNvcmRvdmFJRnJhbWVOYXZpZ2F0b3IiLCJDaGVja1Nlc3Npb25JRnJhbWUiLCJUb2tlblJldm9jYXRpb25DbGllbnQiLCJTZXNzaW9uTW9uaXRvciIsIkdsb2JhbCIsIlVzZXIiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJ3aW5kb3ciLCJZQUhPTyIsInVuZGVmaW5lZCIsImxhbmciLCJleHRlbmQiLCJnIiwiaCIsImYiLCJFcnJvciIsImQiLCJwcm90b3R5cGUiLCJjb25zdHJ1Y3RvciIsInN1cGVyY2xhc3MiLCJPYmplY3QiLCJiIiwiZSIsImMiLCJ0ZXN0IiwiaiIsImkiLCJsZW5ndGgiLCJsIiwiayIsImEiLCJDcnlwdG9KUyIsImxpYiIsIkJhc2UiLCJuIiwicCIsIm8iLCJtaXhJbiIsImhhc093blByb3BlcnR5IiwiaW5pdCIsIiRzdXBlciIsImFwcGx5IiwiYXJndW1lbnRzIiwiY3JlYXRlIiwidG9TdHJpbmciLCJjbG9uZSIsIldvcmRBcnJheSIsIndvcmRzIiwic2lnQnl0ZXMiLCJzdHJpbmdpZnkiLCJjb25jYXQiLCJ0IiwicSIsInMiLCJjbGFtcCIsInIiLCJjZWlsIiwiY2FsbCIsInNsaWNlIiwicmFuZG9tIiwicHVzaCIsIm0iLCJlbmMiLCJIZXgiLCJqb2luIiwicGFyc2UiLCJwYXJzZUludCIsInN1YnN0ciIsIkxhdGluMSIsIlN0cmluZyIsImZyb21DaGFyQ29kZSIsImNoYXJDb2RlQXQiLCJVdGY4IiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiZXNjYXBlIiwidW5lc2NhcGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJCdWZmZXJlZEJsb2NrQWxnb3JpdGhtIiwicmVzZXQiLCJfZGF0YSIsIl9uRGF0YUJ5dGVzIiwiX2FwcGVuZCIsIl9wcm9jZXNzIiwidyIsIngiLCJibG9ja1NpemUiLCJ2IiwidSIsIm1heCIsIl9taW5CdWZmZXJTaXplIiwibWluIiwiX2RvUHJvY2Vzc0Jsb2NrIiwic3BsaWNlIiwiSGFzaGVyIiwiY2ZnIiwiX2RvUmVzZXQiLCJ1cGRhdGUiLCJmaW5hbGl6ZSIsIl9kb0ZpbmFsaXplIiwiX2NyZWF0ZUhlbHBlciIsIl9jcmVhdGVIbWFjSGVscGVyIiwiSE1BQyIsImFsZ28iLCJNYXRoIiwieDY0IiwiV29yZCIsImhpZ2giLCJsb3ciLCJ0b1gzMiIsIkJhc2U2NCIsIl9tYXAiLCJjaGFyQXQiLCJpbmRleE9mIiwic3FydCIsInBvdyIsIlNIQTI1NiIsIl9oYXNoIiwiZmxvb3IiLCJIbWFjU0hBMjU2IiwiVCIsImVhIiwiU0hBNTEyIiwiRiIsIkciLCJIIiwiSSIsIkoiLCJYIiwiSyIsIlkiLCJMIiwiWiIsIk0iLCIkIiwiTiIsImFhIiwiTyIsImJhIiwiUCIsImNhIiwiUSIsInoiLCJBIiwieSIsIlUiLCJCIiwiUiIsIkMiLCJTIiwiRCIsIlYiLCJFIiwiVyIsImZhIiwiZGEiLCJIbWFjU0hBNTEyIiwiU0hBMzg0IiwiSG1hY1NIQTM4NCIsImI2NG1hcCIsImI2NHBhZCIsImhleDJiNjQiLCJzdWJzdHJpbmciLCJiNjR0b2hleCIsImludDJjaGFyIiwiYjY0dG9CQSIsIkFycmF5IiwiZGJpdHMiLCJjYW5hcnkiLCJqX2xtIiwiQmlnSW50ZWdlciIsImZyb21OdW1iZXIiLCJmcm9tU3RyaW5nIiwibmJpIiwiYW0xIiwiYW0yIiwiYW0zIiwiYXBwTmFtZSIsImFtIiwiREIiLCJETSIsIkRWIiwiQklfRlAiLCJGViIsIkYxIiwiRjIiLCJCSV9STSIsIkJJX1JDIiwicnIiLCJ2diIsImludEF0IiwiYm5wQ29weVRvIiwiYm5wRnJvbUludCIsIm5idiIsImZyb21JbnQiLCJibnBGcm9tU3RyaW5nIiwiZnJvbVJhZGl4IiwiWkVSTyIsInN1YlRvIiwiYm5wQ2xhbXAiLCJiblRvU3RyaW5nIiwibmVnYXRlIiwidG9SYWRpeCIsImJuTmVnYXRlIiwiYm5BYnMiLCJibkNvbXBhcmVUbyIsIm5iaXRzIiwiYm5CaXRMZW5ndGgiLCJibnBETFNoaWZ0VG8iLCJibnBEUlNoaWZ0VG8iLCJibnBMU2hpZnRUbyIsImJucFJTaGlmdFRvIiwiYm5wU3ViVG8iLCJibnBNdWx0aXBseVRvIiwiYWJzIiwiYm5wU3F1YXJlVG8iLCJibnBEaXZSZW1UbyIsImNvcHlUbyIsImxTaGlmdFRvIiwiZGxTaGlmdFRvIiwiY29tcGFyZVRvIiwiT05FIiwiZHJTaGlmdFRvIiwiclNoaWZ0VG8iLCJibk1vZCIsImRpdlJlbVRvIiwiQ2xhc3NpYyIsImNDb252ZXJ0IiwibW9kIiwiY1JldmVydCIsImNSZWR1Y2UiLCJjTXVsVG8iLCJtdWx0aXBseVRvIiwicmVkdWNlIiwiY1NxclRvIiwic3F1YXJlVG8iLCJjb252ZXJ0IiwicmV2ZXJ0IiwibXVsVG8iLCJzcXJUbyIsImJucEludkRpZ2l0IiwiTW9udGdvbWVyeSIsIm1wIiwiaW52RGlnaXQiLCJtcGwiLCJtcGgiLCJ1bSIsIm10MiIsIm1vbnRDb252ZXJ0IiwibW9udFJldmVydCIsIm1vbnRSZWR1Y2UiLCJtb250U3FyVG8iLCJtb250TXVsVG8iLCJibnBJc0V2ZW4iLCJibnBFeHAiLCJibk1vZFBvd0ludCIsImlzRXZlbiIsImV4cCIsImJpdExlbmd0aCIsIm1vZFBvd0ludCIsImJuQ2xvbmUiLCJibkludFZhbHVlIiwiYm5CeXRlVmFsdWUiLCJiblNob3J0VmFsdWUiLCJibnBDaHVua1NpemUiLCJMTjIiLCJsb2ciLCJiblNpZ051bSIsImJucFRvUmFkaXgiLCJzaWdudW0iLCJjaHVua1NpemUiLCJpbnRWYWx1ZSIsImJucEZyb21SYWRpeCIsImRNdWx0aXBseSIsImRBZGRPZmZzZXQiLCJibnBGcm9tTnVtYmVyIiwidGVzdEJpdCIsImJpdHdpc2VUbyIsInNoaWZ0TGVmdCIsIm9wX29yIiwiaXNQcm9iYWJsZVByaW1lIiwibmV4dEJ5dGVzIiwiYm5Ub0J5dGVBcnJheSIsImJuRXF1YWxzIiwiYm5NaW4iLCJibk1heCIsImJucEJpdHdpc2VUbyIsIm9wX2FuZCIsImJuQW5kIiwiYm5PciIsIm9wX3hvciIsImJuWG9yIiwib3BfYW5kbm90IiwiYm5BbmROb3QiLCJibk5vdCIsImJuU2hpZnRMZWZ0IiwiYm5TaGlmdFJpZ2h0IiwibGJpdCIsImJuR2V0TG93ZXN0U2V0Qml0IiwiY2JpdCIsImJuQml0Q291bnQiLCJiblRlc3RCaXQiLCJibnBDaGFuZ2VCaXQiLCJiblNldEJpdCIsImNoYW5nZUJpdCIsImJuQ2xlYXJCaXQiLCJibkZsaXBCaXQiLCJibnBBZGRUbyIsImJuQWRkIiwiYWRkVG8iLCJiblN1YnRyYWN0IiwiYm5NdWx0aXBseSIsImJuU3F1YXJlIiwiYm5EaXZpZGUiLCJiblJlbWFpbmRlciIsImJuRGl2aWRlQW5kUmVtYWluZGVyIiwiYm5wRE11bHRpcGx5IiwiYm5wREFkZE9mZnNldCIsIk51bGxFeHAiLCJuTm9wIiwibk11bFRvIiwiblNxclRvIiwiYm5Qb3ciLCJibnBNdWx0aXBseUxvd2VyVG8iLCJibnBNdWx0aXBseVVwcGVyVG8iLCJCYXJyZXR0IiwicjIiLCJxMyIsIm11IiwiZGl2aWRlIiwiYmFycmV0dENvbnZlcnQiLCJiYXJyZXR0UmV2ZXJ0IiwiYmFycmV0dFJlZHVjZSIsIm11bHRpcGx5VXBwZXJUbyIsIm11bHRpcGx5TG93ZXJUbyIsImJhcnJldHRTcXJUbyIsImJhcnJldHRNdWxUbyIsImJuTW9kUG93IiwiYm5HQ0QiLCJnZXRMb3dlc3RTZXRCaXQiLCJibnBNb2RJbnQiLCJibk1vZEludmVyc2UiLCJzdWJ0cmFjdCIsImFkZCIsImxvd3ByaW1lcyIsImxwbGltIiwiYm5Jc1Byb2JhYmxlUHJpbWUiLCJtb2RJbnQiLCJtaWxsZXJSYWJpbiIsImJucE1pbGxlclJhYmluIiwic2hpZnRSaWdodCIsIm1vZFBvdyIsImJ5dGVWYWx1ZSIsInNob3J0VmFsdWUiLCJ0b0J5dGVBcnJheSIsImVxdWFscyIsImFuZCIsIm9yIiwieG9yIiwiYW5kTm90Iiwibm90IiwiYml0Q291bnQiLCJzZXRCaXQiLCJjbGVhckJpdCIsImZsaXBCaXQiLCJtdWx0aXBseSIsInJlbWFpbmRlciIsImRpdmlkZUFuZFJlbWFpbmRlciIsIm1vZEludmVyc2UiLCJnY2QiLCJzcXVhcmUiLCJBcmNmb3VyIiwiQVJDNGluaXQiLCJBUkM0bmV4dCIsIm5leHQiLCJwcm5nX25ld3N0YXRlIiwicm5nX3BzaXplIiwicm5nX3N0YXRlIiwicm5nX3Bvb2wiLCJybmdfcHB0ciIsInJuZ19zZWVkX2ludCIsInJuZ19zZWVkX3RpbWUiLCJEYXRlIiwiZ2V0VGltZSIsImNyeXB0byIsIm1zQ3J5cHRvIiwiZ2V0UmFuZG9tVmFsdWVzIiwidWEiLCJVaW50OEFycmF5IiwiYXBwVmVyc2lvbiIsInJuZ19nZXRfYnl0ZSIsInJuZ19nZXRfYnl0ZXMiLCJTZWN1cmVSYW5kb20iLCJwYXJzZUJpZ0ludCIsImxpbmVicmsiLCJieXRlMkhleCIsInBrY3MxcGFkMiIsIm9hZXBfbWdmMV9hcnIiLCJvYWVwX3BhZCIsIktKVVIiLCJNZXNzYWdlRGlnZXN0IiwiVXRpbCIsImdldENhbm9uaWNhbEFsZ05hbWUiLCJnZXRIYXNoTGVuZ3RoIiwiaGV4dG9yc3RyIiwiaGFzaEhleCIsInJzdHJ0b2hleCIsIlJTQUtleSIsImRtcDEiLCJkbXExIiwiY29lZmYiLCJSU0FTZXRQdWJsaWMiLCJpc1B1YmxpYyIsImlzUHJpdmF0ZSIsIlJTQURvUHVibGljIiwiUlNBRW5jcnlwdCIsImRvUHVibGljIiwiUlNBRW5jcnlwdE9BRVAiLCJzZXRQdWJsaWMiLCJlbmNyeXB0IiwiZW5jcnlwdE9BRVAiLCJ0eXBlIiwiRUNGaWVsZEVsZW1lbnRGcCIsImZlRnBFcXVhbHMiLCJmZUZwVG9CaWdJbnRlZ2VyIiwiZmVGcE5lZ2F0ZSIsImZlRnBBZGQiLCJ0b0JpZ0ludGVnZXIiLCJmZUZwU3VidHJhY3QiLCJmZUZwTXVsdGlwbHkiLCJmZUZwU3F1YXJlIiwiZmVGcERpdmlkZSIsIkVDUG9pbnRGcCIsImN1cnZlIiwiemludiIsInBvaW50RnBHZXRYIiwiZnJvbUJpZ0ludGVnZXIiLCJwb2ludEZwR2V0WSIsInBvaW50RnBFcXVhbHMiLCJpc0luZmluaXR5IiwicG9pbnRGcElzSW5maW5pdHkiLCJwb2ludEZwTmVnYXRlIiwicG9pbnRGcEFkZCIsInR3aWNlIiwiZ2V0SW5maW5pdHkiLCJwb2ludEZwVHdpY2UiLCJwb2ludEZwTXVsdGlwbHkiLCJwb2ludEZwTXVsdGlwbHlUd28iLCJnZXRYIiwiZ2V0WSIsIm11bHRpcGx5VHdvIiwiRUNDdXJ2ZUZwIiwiaW5maW5pdHkiLCJjdXJ2ZUZwR2V0USIsImN1cnZlRnBHZXRBIiwiY3VydmVGcEdldEIiLCJjdXJ2ZUZwRXF1YWxzIiwiY3VydmVGcEdldEluZmluaXR5IiwiY3VydmVGcEZyb21CaWdJbnRlZ2VyIiwiY3VydmVGcERlY29kZVBvaW50SGV4IiwiZ2V0USIsImdldEEiLCJnZXRCIiwiZGVjb2RlUG9pbnRIZXgiLCJnZXRCeXRlTGVuZ3RoIiwiZ2V0RW5jb2RlZCIsInRvQnl0ZUFycmF5VW5zaWduZWQiLCJ1bnNoaWZ0IiwiZGVjb2RlRnJvbSIsImRlY29kZUZyb21IZXgiLCJhZGQyRCIsInR3aWNlMkQiLCJ2YWx1ZU9mIiwibXVsdGlwbHkyRCIsImlzT25DdXJ2ZSIsInZhbGlkYXRlIiwianNvblBhcnNlIiwiUmVnRXhwIiwibWF0Y2giLCJyZXBsYWNlIiwic2hpZnQiLCJhc24xIiwiQVNOMVV0aWwiLCJpbnRlZ2VyVG9CeXRlSGV4IiwiYmlnSW50VG9NaW5Ud29zQ29tcGxlbWVudHNIZXgiLCJnZXRQRU1TdHJpbmdGcm9tSGV4IiwiaGV4dG9wZW0iLCJuZXdPYmplY3QiLCJBU04xT2JqZWN0IiwiREVSQm9vbGVhbiIsIkRFUkludGVnZXIiLCJERVJCaXRTdHJpbmciLCJERVJPY3RldFN0cmluZyIsIkRFUk51bGwiLCJERVJPYmplY3RJZGVudGlmaWVyIiwiREVSRW51bWVyYXRlZCIsIkRFUlVURjhTdHJpbmciLCJERVJOdW1lcmljU3RyaW5nIiwiREVSUHJpbnRhYmxlU3RyaW5nIiwiREVSVGVsZXRleFN0cmluZyIsIkRFUklBNVN0cmluZyIsIkRFUlVUQ1RpbWUiLCJERVJHZW5lcmFsaXplZFRpbWUiLCJERVJWaXNpYmxlU3RyaW5nIiwiREVSQk1QU3RyaW5nIiwiREVSU2VxdWVuY2UiLCJERVJTZXQiLCJERVJUYWdnZWRPYmplY3QiLCJrZXlzIiwiYXJyYXkiLCJ0YWciLCJleHBsaWNpdCIsIm9iaiIsImpzb25Ub0FTTjFIRVgiLCJnZXRFbmNvZGVkSGV4Iiwib2lkSGV4VG9JbnQiLCJvaWRJbnRUb0hleCIsInNwbGl0IiwicGFyYW1zIiwiZ2V0TGVuZ3RoSGV4RnJvbVZhbHVlIiwiaFYiLCJoVExWIiwiaXNNb2RpZmllZCIsImdldEZyZXNoVmFsdWVIZXgiLCJoTCIsImhUIiwiZ2V0VmFsdWVIZXgiLCJzZXRCeVBhcmFtIiwidGx2IiwiREVSQWJzdHJhY3RTdHJpbmciLCJnZXRTdHJpbmciLCJzZXRTdHJpbmciLCJ1dGY4dG9oZXgiLCJ0b0xvd2VyQ2FzZSIsInNldFN0cmluZ0hleCIsInN0ciIsImhleCIsIkRFUkFic3RyYWN0VGltZSIsImxvY2FsRGF0ZVRvVVRDIiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJmb3JtYXREYXRlIiwiemVyb1BhZGRpbmciLCJnZXRGdWxsWWVhciIsImdldE1vbnRoIiwiZ2V0RGF0ZSIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsImdldFNlY29uZHMiLCJnZXRNaWxsaXNlY29uZHMiLCJzdG9oZXgiLCJzZXRCeURhdGVWYWx1ZSIsIlVUQyIsInNldEJ5RGF0ZSIsIkRFUkFic3RyYWN0U3RydWN0dXJlZCIsInNldEJ5QVNOMU9iamVjdEFycmF5IiwiYXNuMUFycmF5IiwiYXBwZW5kQVNOMU9iamVjdCIsInNldEJ5QmlnSW50ZWdlciIsInNldEJ5SW50ZWdlciIsInNldFZhbHVlSGV4IiwiYmlnaW50Iiwic2V0SGV4VmFsdWVJbmNsdWRpbmdVbnVzZWRCaXRzIiwic2V0VW51c2VkQml0c0FuZEhleFZhbHVlIiwic2V0QnlCaW5hcnlTdHJpbmciLCJzZXRCeUJvb2xlYW5BcnJheSIsIm5ld0ZhbHNlQXJyYXkiLCJiaW4iLCJzZXRWYWx1ZU9pZFN0cmluZyIsIm9pZHRvaGV4Iiwic2V0VmFsdWVOYW1lIiwieDUwOSIsIk9JRCIsIm5hbWUyb2lkIiwic2V0VmFsdWVOYW1lT3JPaWQiLCJvaWQiLCJuYW1lIiwiZGF0ZSIsIndpdGhNaWxsaXMiLCJtaWxsaXMiLCJzb3J0RmxhZyIsInNvcnQiLCJzb3J0ZmxhZyIsImlzRXhwbGljaXQiLCJhc24xT2JqZWN0Iiwic2V0QVNOMU9iamVjdCIsInRhZ2UiLCJ0YWdpIiwiQVNOMUhFWCIsImdldExibGVuIiwiZ2V0TCIsImdldFZibGVuIiwiZ2V0VmlkeCIsImdldFYiLCJnZXRUTFYiLCJnZXRUTFZibGVuIiwiZ2V0TmV4dFNpYmxpbmdJZHgiLCJnZXRDaGlsZElkeCIsImdldE50aENoaWxkSWR4IiwiZ2V0SWR4YnlMaXN0IiwiZ2V0SWR4YnlMaXN0RXgiLCJpc0NvbnRleHRUYWciLCJnZXRUTFZieUxpc3QiLCJnZXRUTFZieUxpc3RFeCIsImdldFZieUxpc3QiLCJnZXRWYnlMaXN0RXgiLCJnZXRJbnQiLCJiaXRzdHJ0b2ludCIsImdldE9JRCIsImhleHRvb2lkIiwiZ2V0T0lETmFtZSIsIm9pZDJuYW1lIiwiaGV4dG9vaWRzdHIiLCJkdW1wIiwib21taXRfbG9uZ19vY3RldCIsImlzQVNOMUhFWCIsImhleHRvdXRmOCIsIm9pZG5hbWUiLCJKU09OIiwieDUwOUV4dE5hbWUiLCJjaGVja1N0cmljdERFUiIsImlzSGV4IiwiQmFzZTY0eCIsInN0b0JBIiwiQkF0b3MiLCJCQXRvaGV4Iiwic3RvYjY0Iiwic3RvYjY0dSIsImI2NHRvYjY0dSIsImI2NHV0b3MiLCJiNjR1dG9iNjQiLCJoZXh0b2I2NHUiLCJiNjR1dG9oZXgiLCJ1dGY4dG9iNjR1IiwiYjY0dXRvdXRmOCIsIkJ1ZmZlciIsImZyb20iLCJ1cmljbXB0b2hleCIsImVuY29kZVVSSUNvbXBvbmVudEFsbCIsImhleHRvdXJpY21wIiwidXRmOHRvYjY0IiwiYjY0dG91dGY4IiwiaGV4dG9iNjQiLCJoZXh0b2I2NG5sIiwiYjY0bmx0b2hleCIsInBlbXRvaGV4IiwiaGV4dG9BcnJheUJ1ZmZlciIsIkFycmF5QnVmZmVyIiwiRGF0YVZpZXciLCJzZXRVaW50OCIsIkFycmF5QnVmZmVydG9oZXgiLCJieXRlTGVuZ3RoIiwiZ2V0VWludDgiLCJ6dWx1dG9tc2VjIiwienVsdXRvc2VjIiwienVsdXRvZGF0ZSIsImRhdGV0b3p1bHUiLCJnZXRVVENGdWxsWWVhciIsImdldFVUQ01vbnRoIiwiZ2V0VVRDRGF0ZSIsImdldFVUQ0hvdXJzIiwiZ2V0VVRDTWludXRlcyIsImdldFVUQ1NlY29uZHMiLCJnZXRVVENNaWxsaXNlY29uZHMiLCJpcHY2dG9oZXgiLCJyZXBlYXQiLCJoZXh0b2lwdjYiLCJoZXh0b2lwIiwiaXB0b2hleCIsIm5ld2xpbmVfdG9Vbml4IiwibmV3bGluZV90b0RvcyIsImlzSW50ZWdlciIsImlzaGV4IiwiaXNCYXNlNjQiLCJpc0Jhc2U2NFVSTCIsImlzSW50ZWdlckFycmF5IiwiaXNQcmludGFibGUiLCJpc0lBNSIsImlzTWFpbCIsImhleHRvcG9zaGV4IiwiaW50YXJ5c3RydG9oZXgiLCJtYXAiLCJzdHJkaWZmaWR4Iiwic3RycGFkIiwiaW50dG9iaXRzdHIiLCJOdW1iZXIiLCJESUdFU1RJTkZPSEVBRCIsInNoYTEiLCJzaGEyMjQiLCJzaGEyNTYiLCJzaGEzODQiLCJzaGE1MTIiLCJtZDIiLCJtZDUiLCJyaXBlbWQxNjAiLCJERUZBVUxUUFJPVklERVIiLCJobWFjbWQ1IiwiaG1hY3NoYTEiLCJobWFjc2hhMjI0IiwiaG1hY3NoYTI1NiIsImhtYWNzaGEzODQiLCJobWFjc2hhNTEyIiwiaG1hY3JpcGVtZDE2MCIsIk1ENXdpdGhSU0EiLCJTSEExd2l0aFJTQSIsIlNIQTIyNHdpdGhSU0EiLCJTSEEyNTZ3aXRoUlNBIiwiU0hBMzg0d2l0aFJTQSIsIlNIQTUxMndpdGhSU0EiLCJSSVBFTUQxNjB3aXRoUlNBIiwiTUQ1d2l0aEVDRFNBIiwiU0hBMXdpdGhFQ0RTQSIsIlNIQTIyNHdpdGhFQ0RTQSIsIlNIQTI1NndpdGhFQ0RTQSIsIlNIQTM4NHdpdGhFQ0RTQSIsIlNIQTUxMndpdGhFQ0RTQSIsIlJJUEVNRDE2MHdpdGhFQ0RTQSIsIlNIQTF3aXRoRFNBIiwiU0hBMjI0d2l0aERTQSIsIlNIQTI1NndpdGhEU0EiLCJNRDV3aXRoUlNBYW5kTUdGMSIsIlNIQXdpdGhSU0FhbmRNR0YxIiwiU0hBMXdpdGhSU0FhbmRNR0YxIiwiU0hBMjI0d2l0aFJTQWFuZE1HRjEiLCJTSEEyNTZ3aXRoUlNBYW5kTUdGMSIsIlNIQTM4NHdpdGhSU0FhbmRNR0YxIiwiU0hBNTEyd2l0aFJTQWFuZE1HRjEiLCJSSVBFTUQxNjB3aXRoUlNBYW5kTUdGMSIsIkNSWVBUT0pTTUVTU0FHRURJR0VTVE5BTUUiLCJNRDUiLCJTSEExIiwiU0hBMjI0IiwiUklQRU1EMTYwIiwiZ2V0RGlnZXN0SW5mb0hleCIsImdldFBhZGRlZERpZ2VzdEluZm9IZXgiLCJoYXNoU3RyaW5nIiwiYWxnIiwiZGlnZXN0U3RyaW5nIiwiZGlnZXN0SGV4Iiwic2hhMjU2SGV4Iiwic2hhNTEySGV4IiwiaXNLZXkiLCJEU0EiLCJFQ0RTQSIsInByb3YiLCJTRUNVUkVSQU5ET01HRU4iLCJnZXRSYW5kb21IZXhPZk5ieXRlcyIsImdldFJhbmRvbUJpZ0ludGVnZXJPZk5ieXRlcyIsImdldFJhbmRvbUhleE9mTmJpdHMiLCJnZXRSYW5kb21CaWdJbnRlZ2VyT2ZOYml0cyIsImdldFJhbmRvbUJpZ0ludGVnZXJaZXJvVG9NYXgiLCJnZXRSYW5kb21CaWdJbnRlZ2VyTWluVG9NYXgiLCJzZXRBbGdBbmRQcm92aWRlciIsIm1kIiwidXBkYXRlU3RyaW5nIiwidXBkYXRlSGV4IiwiZGlnZXN0Iiwic2pjbCIsImhhc2giLCJjb2RlYyIsInRvQml0cyIsImZyb21CaXRzIiwiYWxnTmFtZSIsInByb3ZOYW1lIiwiSEFTSExFTkdUSCIsIk1hYyIsImFsZ1Byb3YiLCJtYWMiLCJwYXNzIiwiZG9GaW5hbCIsImRvRmluYWxTdHJpbmciLCJkb0ZpbmFsSGV4Iiwic2V0UGFzc3dvcmQiLCJ1dGY4IiwicnN0ciIsImI2NCIsImI2NHUiLCJTaWduYXR1cmUiLCJfc2V0QWxnTmFtZXMiLCJtZEFsZ05hbWUiLCJwdWJrZXlBbGdOYW1lIiwiX3plcm9QYWRkaW5nT2ZTaWduYXR1cmUiLCJLRVlVVElMIiwiZ2V0S2V5IiwicHJ2S2V5Iiwic3RhdGUiLCJwdWJLZXkiLCJzaWduIiwic0hhc2hIZXgiLCJlY3BydmhleCIsImVjY3VydmVuYW1lIiwicHJ2IiwiaFNpZ24iLCJzaWduV2l0aE1lc3NhZ2VIYXNoUFNTIiwicHNzU2FsdExlbiIsInNpZ25XaXRoTWVzc2FnZUhhc2giLCJzaWduU3RyaW5nIiwic2lnbkhleCIsInZlcmlmeSIsImVjcHViaGV4IiwicHViIiwidmVyaWZ5V2l0aE1lc3NhZ2VIYXNoUFNTIiwidmVyaWZ5V2l0aE1lc3NhZ2VIYXNoIiwiYWxnUHJvdk5hbWUiLCJpbml0UGFyYW1zIiwicHNzc2FsdGxlbiIsInBydmtleXBlbSIsInBydmtleXBhcyIsIkNpcGhlciIsImdldEFsZ0J5S2V5QW5kTmFtZSIsImRlY3J5cHQiLCJkZWNyeXB0T0FFUCIsIm9pZGhleDJuYW1lIiwiRUNQYXJhbWV0ZXJEQiIsImdldE5hbWUiLCJnZXRCaWdSYW5kb20iLCJzZXROYW1lZEN1cnZlIiwiZWNwYXJhbXMiLCJnZXRCeU5hbWUiLCJwcnZLZXlIZXgiLCJwdWJLZXlIZXgiLCJjdXJ2ZU5hbWUiLCJzZXRQcml2YXRlS2V5SGV4Iiwic2V0UHVibGljS2V5SGV4IiwiZ2V0UHVibGljS2V5WFlIZXgiLCJrZXlsZW4iLCJnZXRTaG9ydE5JU1RQQ3VydmVOYW1lIiwiZ2VuZXJhdGVLZXlQYWlySGV4IiwiYmlSU1NpZ1RvQVNOMVNpZyIsImZyb21CeXRlQXJyYXlVbnNpZ25lZCIsInNlcmlhbGl6ZVNpZyIsInZlcmlmeUhleCIsInBhcnNlU2lnSGV4IiwidmVyaWZ5UmF3IiwiQml0Y29pbiIsImlzQXJyYXkiLCJwYXJzZVNpZyIsInRvQnl0ZUFycmF5U2lnbmVkIiwicGFyc2VTaWdDb21wYWN0IiwicmVhZFBLQ1M1UHJ2S2V5SGV4IiwicmVhZFBLQ1M4UHJ2S2V5SGV4IiwicmVhZFBLQ1M4UHViS2V5SGV4IiwicmVhZENlcnRQdWJLZXlIZXgiLCJwYXJzZVNpZ0hleEluSGV4UlMiLCJhc24xU2lnVG9Db25jYXRTaWciLCJjb25jYXRTaWdUb0FTTjFTaWciLCJoZXhSU1NpZ1RvQVNOMVNpZyIsInJlZ2lzdCIsIkFFUyIsIlRyaXBsZURFUyIsIkRFUyIsImtleSIsIml2IiwiY2lwaGVydGV4dCIsInByb2MiLCJlcHJvYyIsIml2bGVuIiwiY2lwaGVyIiwiaXZzYWx0IiwiZGF0YSIsImtleWhleCIsIml2aGV4IiwidmVyc2lvbiIsInBhcnNlUEtDUzVQRU0iLCJnZXRLZXlBbmRVbnVzZWRJdkJ5UGFzc2NvZGVBbmRJdnNhbHQiLCJkZWNyeXB0S2V5QjY0IiwiZ2V0RGVjcnlwdGVkS2V5SGV4IiwiZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUHJ2S2V5SGV4IiwidG9VcHBlckNhc2UiLCJwYXJzZUhleE9mRW5jcnlwdGVkUEtDUzgiLCJlbmNyeXB0aW9uU2NoZW1lQWxnIiwiZW5jcnlwdGlvblNjaGVtZUlWIiwicGJrZGYyU2FsdCIsInBia2RmMkl0ZXIiLCJnZXRQQktERjJLZXlIZXhGcm9tUGFyYW0iLCJQQktERjIiLCJrZXlTaXplIiwiaXRlcmF0aW9ucyIsIl9nZXRQbGFpblBLQ1M4SGV4RnJvbUVuY3J5cHRlZFBLQ1M4UEVNIiwiZ2V0S2V5RnJvbUVuY3J5cHRlZFBLQ1M4UEVNIiwiZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4SGV4IiwicGFyc2VQbGFpblByaXZhdGVQS0NTOEhleCIsImFsZ3BhcmFtIiwiYWxnb2lkIiwia2V5aWR4IiwiZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4UEVNIiwiX2dldEtleUZyb21QdWJsaWNQS0NTOEhleCIsInBhcnNlUHVibGljUmF3UlNBS2V5SGV4IiwicGFyc2VQdWJsaWNQS0NTOEhleCIsInh5Iiwia3R5IiwiZHAiLCJkcSIsImNvIiwicWkiLCJzZXRQcml2YXRlRXgiLCJzZXRQcml2YXRlIiwiY3J2IiwiWDUwOSIsImdldFB1YmxpY0tleUZyb21DZXJ0SGV4IiwiZ2V0UHVibGljS2V5RnJvbUNlcnRQRU0iLCJnZW5lcmF0ZUtleXBhaXIiLCJnZW5lcmF0ZSIsInBydktleU9iaiIsInB1YktleU9iaiIsImdldFBFTSIsIlN1YmplY3RQdWJsaWNLZXlJbmZvIiwic2VxIiwib2N0c3RyIiwiYml0c3RyIiwiZ2V0S2V5RnJvbUNTUlBFTSIsImdldEtleUZyb21DU1JIZXgiLCJwYXJzZUNTUkhleCIsInA4cHVia2V5aGV4IiwiZ2V0S2V5SUQiLCJnZXRKV0tGcm9tS2V5IiwiZ2V0UG9zQXJyYXlPZkNoaWxkcmVuRnJvbUhleCIsImdldEhleFZhbHVlQXJyYXlPZkNoaWxkcmVuRnJvbUhleCIsInJlYWRQcml2YXRlS2V5RnJvbVBFTVN0cmluZyIsInJlYWRQS0NTNVB1YktleUhleCIsInJlYWRDZXJ0SGV4IiwiZ2V0UHVibGljS2V5SGV4IiwiX1JFX0hFWERFQ09OTFkiLCJfcnNhc2lnbl9nZXRIZXhQYWRkZWREaWdlc3RJbmZvRm9yU3RyaW5nIiwiZG9Qcml2YXRlIiwicHNzX21nZjFfc3RyIiwic2lnblBTUyIsIl9yc2FzaWduX2dldERlY3J5cHRTaWduYXR1cmVCSSIsIl9yc2FzaWduX2dldEhleERpZ2VzdEluZm9Gcm9tU2lnIiwiX3JzYXNpZ25fZ2V0QWxnTmFtZUFuZEhhc2hGcm9tSGV4RGlzZ2VzdEluZm8iLCJ2ZXJpZnlQU1MiLCJTQUxUX0xFTl9ITEVOIiwiU0FMVF9MRU5fTUFYIiwiU0FMVF9MRU5fUkVDT1ZFUiIsIkFsZ29yaXRobUlkZW50aWZpZXIiLCJQU1NOQU1FMkFTTjFUTFYiLCJIRVgyU1RBRyIsImZvZmZzZXQiLCJhRXh0SW5mbyIsImdldFZlcnNpb24iLCJnZXRTZXJpYWxOdW1iZXJIZXgiLCJnZXRTaWduYXR1cmVBbGdvcml0aG1GaWVsZCIsImdldEFsZ29yaXRobUlkZW50aWZpZXJOYW1lIiwiZ2V0SXNzdWVyIiwiZ2V0WDUwME5hbWUiLCJnZXRJc3N1ZXJIZXgiLCJnZXRJc3N1ZXJTdHJpbmciLCJoZXgyZG4iLCJnZXRTdWJqZWN0IiwiZ2V0U3ViamVjdEhleCIsImdldFN1YmplY3RTdHJpbmciLCJnZXROb3RCZWZvcmUiLCJnZXROb3RBZnRlciIsImdldFB1YmxpY0tleUlkeCIsImdldFB1YmxpY0tleUNvbnRlbnRJZHgiLCJnZXRQdWJsaWNLZXkiLCJnZXRTaWduYXR1cmVBbGdvcml0aG1OYW1lIiwiZ2V0U2lnbmF0dXJlVmFsdWVIZXgiLCJ2ZXJpZnlTaWduYXR1cmUiLCJwYXJzZUV4dCIsImNyaXRpY2FsIiwidmlkeCIsImdldEV4dEluZm8iLCJnZXRFeHRCYXNpY0NvbnN0cmFpbnRzIiwiZXh0bmFtZSIsImNBIiwicGF0aExlbiIsImdldEV4dEtleVVzYWdlIiwibmFtZXMiLCJnZXRFeHRLZXlVc2FnZVN0cmluZyIsImdldEV4dEtleVVzYWdlQmluIiwiS0VZVVNBR0VfTkFNRSIsImdldEV4dFN1YmplY3RLZXlJZGVudGlmaWVyIiwia2lkIiwiZ2V0RXh0QXV0aG9yaXR5S2V5SWRlbnRpZmllciIsImdldEdlbmVyYWxOYW1lcyIsImlzc3VlciIsInNuIiwiZ2V0RXh0RXh0S2V5VXNhZ2UiLCJnZXRFeHRFeHRLZXlVc2FnZU5hbWUiLCJnZXRFeHRTdWJqZWN0QWx0TmFtZSIsImdldEV4dElzc3VlckFsdE5hbWUiLCJnZXRHZW5lcmFsTmFtZSIsInJmYzgyMiIsImRucyIsInVyaSIsImlwIiwiZG4iLCJnZXRFeHRTdWJqZWN0QWx0TmFtZTIiLCJnZXRFeHRDUkxEaXN0cmlidXRpb25Qb2ludHMiLCJnZXREaXN0cmlidXRpb25Qb2ludCIsImRwbmFtZSIsImdldERpc3RyaWJ1dGlvblBvaW50TmFtZSIsImZ1bGwiLCJnZXRFeHRDUkxEaXN0cmlidXRpb25Qb2ludHNVUkkiLCJnZXRFeHRBSUFJbmZvIiwib2NzcCIsImNhaXNzdWVyIiwiZ2V0RXh0QXV0aG9yaXR5SW5mb0FjY2VzcyIsImdldEV4dENlcnRpZmljYXRlUG9saWNpZXMiLCJnZXRQb2xpY3lJbmZvcm1hdGlvbiIsInBvbGljeW9pZCIsImdldFBvbGljeVF1YWxpZmllckluZm8iLCJjcHMiLCJ1bm90aWNlIiwiZ2V0VXNlck5vdGljZSIsImV4cHRleHQiLCJnZXREaXNwbGF5VGV4dCIsImdldEV4dENSTE51bWJlciIsIm51bSIsImdldEV4dENSTFJlYXNvbiIsImNvZGUiLCJnZXRFeHRPY3NwTm9uY2UiLCJnZXRFeHRPY3NwTm9DaGVjayIsImdldEV4dEFkb2JlVGltZVN0YW1wIiwicmVxYXV0aCIsImdldFg1MDBOYW1lUnVsZSIsImRzIiwidmFsdWUiLCJnZXRYNTAwTmFtZUFycmF5IiwiZG5hcnJheXRvc3RyIiwiZ2V0UkROIiwiZ2V0QXR0clR5cGVBbmRWYWx1ZSIsIm9pZDJhdHlwZSIsInJlYWRDZXJ0UEVNIiwiZ2V0UGFyYW0iLCJzZXJpYWwiLCJzaWdhbGciLCJub3RiZWZvcmUiLCJub3RhZnRlciIsInN1YmplY3QiLCJzYmpwdWJrZXkiLCJleHQiLCJnZXRFeHRQYXJhbUFycmF5Iiwic2lnaGV4IiwiZ2V0RXh0UGFyYW0iLCJleHRuIiwiZmluZEV4dCIsInVwZGF0ZUV4dENEUEZ1bGxVUkkiLCJ1cGRhdGVFeHRBSUFPQ1NQIiwidXBkYXRlRXh0QUlBQ0FJc3N1ZXIiLCJnZXRJbmZvIiwiZG5hbWUiLCJoZXgycmRuIiwiaGV4MmF0dHJUeXBlVmFsdWUiLCJnZXRQdWJsaWNLZXlJbmZvUHJvcE9mQ2VydFBFTSIsImp3cyIsIkpXUyIsImlzU2FmZUpTT05TdHJpbmciLCJwYXJzZUpXUyIsInBhcnNlZEpXUyIsInNpZ3ZhbEgiLCJoZWFkQjY0VSIsInBheWxvYWRCNjRVIiwic2lndmFsQjY0VSIsInNpIiwic2lndmFsQkkiLCJoZWFkUyIsInBheWxvYWRTIiwicmVhZFNhZmVKU09OU3RyaW5nIiwiandzYWxnMnNpZ2FsZyIsImhlYWRlck9iaiIsInBheWxvYWRPYmoiLCJoZWFkZXJQUCIsInBheWxvYWRQUCIsInNpZ0hleCIsInZlcmlmeUpXVCIsImluQXJyYXkiLCJpbmNsdWRlZEFycmF5IiwiaXNzIiwic3ViIiwiYXVkIiwiSW50RGF0ZSIsImdldE5vdyIsInZlcmlmeUF0IiwiZ3JhY2VQZXJpb2QiLCJuYmYiLCJpYXQiLCJqdGkiLCJIUzI1NiIsIkhTMzg0IiwiSFM1MTIiLCJSUzI1NiIsIlJTMzg0IiwiUlM1MTIiLCJFUzI1NiIsIkVTMzg0IiwiUFMyNTYiLCJQUzM4NCIsIlBTNTEyIiwibm9uZSIsImdldEVuY29kZWRTaWduYXR1cmVWYWx1ZUZyb21KV1MiLCJnZXRKV0t0aHVtYnByaW50IiwiZ2V0IiwiZ2V0WnVsdSIsImludERhdGUyVVRDU3RyaW5nIiwidG9VVENTdHJpbmciLCJpbnREYXRlMlp1bHUiLCJFRFNBIiwiX2NyeXB0byIsIkRlZmF1bHRBY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSIsImFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lIiwiYWNjZXNzVG9rZW5FeHBpcmluZ1RpbWVyIiwiVGltZXIiLCJhY2Nlc3NUb2tlbkV4cGlyZWRUaW1lciIsIl9hY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSIsIl9hY2Nlc3NUb2tlbkV4cGlyaW5nIiwiX2FjY2Vzc1Rva2VuRXhwaXJlZCIsImxvYWQiLCJjb250YWluZXIiLCJhY2Nlc3NfdG9rZW4iLCJleHBpcmVzX2luIiwiZHVyYXRpb24iLCJkZWJ1ZyIsImV4cGlyaW5nIiwiY2FuY2VsIiwiZXhwaXJlZCIsInVubG9hZCIsImFkZEFjY2Vzc1Rva2VuRXhwaXJpbmciLCJjYiIsImFkZEhhbmRsZXIiLCJyZW1vdmVBY2Nlc3NUb2tlbkV4cGlyaW5nIiwicmVtb3ZlSGFuZGxlciIsImFkZEFjY2Vzc1Rva2VuRXhwaXJlZCIsInJlbW92ZUFjY2Vzc1Rva2VuRXhwaXJlZCIsIkRlZmF1bHRJbnRlcnZhbCIsImNhbGxiYWNrIiwiY2xpZW50X2lkIiwidXJsIiwiaW50ZXJ2YWwiLCJzdG9wT25FcnJvciIsIl9jYWxsYmFjayIsIl9jbGllbnRfaWQiLCJfdXJsIiwiX2ludGVydmFsIiwiX3N0b3BPbkVycm9yIiwiaWR4IiwiX2ZyYW1lX29yaWdpbiIsIl9mcmFtZSIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInN0eWxlIiwidmlzaWJpbGl0eSIsInBvc2l0aW9uIiwiZGlzcGxheSIsIndpZHRoIiwiaGVpZ2h0Iiwic3JjIiwiUHJvbWlzZSIsInJlc29sdmUiLCJvbmxvYWQiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJfYm91bmRNZXNzYWdlRXZlbnQiLCJfbWVzc2FnZSIsImJpbmQiLCJhZGRFdmVudExpc3RlbmVyIiwib3JpZ2luIiwic291cmNlIiwiY29udGVudFdpbmRvdyIsImVycm9yIiwic3RvcCIsInN0YXJ0Iiwic2Vzc2lvbl9zdGF0ZSIsIl9zZXNzaW9uX3N0YXRlIiwic2VuZCIsInBvc3RNZXNzYWdlIiwiX3RpbWVyIiwic2V0SW50ZXJ2YWwiLCJjbGVhckludGVydmFsIiwiQ2xvY2tTZXJ2aWNlIiwiZ2V0RXBvY2hUaW1lIiwibm93IiwicHJlcGFyZSIsInBvcHVwV2luZG93RmVhdHVyZXMiLCJwb3B1cCIsIkNvcmRvdmFQb3B1cFdpbmRvdyIsIkRlZmF1bHRQb3B1cEZlYXR1cmVzIiwiRGVmYXVsdFBvcHVwVGFyZ2V0IiwiX3Byb21pc2UiLCJyZWplY3QiLCJfcmVzb2x2ZSIsIl9yZWplY3QiLCJmZWF0dXJlcyIsInRhcmdldCIsInBvcHVwV2luZG93VGFyZ2V0IiwicmVkaXJlY3RfdXJpIiwic3RhcnRVcmwiLCJfaXNJbkFwcEJyb3dzZXJJbnN0YWxsZWQiLCJjb3Jkb3ZhTWV0YWRhdGEiLCJzb21lIiwibmF2aWdhdGUiLCJfZXJyb3IiLCJjb3Jkb3ZhIiwicmVxdWlyZSIsIm1ldGFkYXRhIiwiX3BvcHVwIiwiSW5BcHBCcm93c2VyIiwib3BlbiIsIl9leGl0Q2FsbGJhY2tFdmVudCIsIl9leGl0Q2FsbGJhY2siLCJfbG9hZFN0YXJ0Q2FsbGJhY2tFdmVudCIsIl9sb2FkU3RhcnRDYWxsYmFjayIsInByb21pc2UiLCJldmVudCIsIl9zdWNjZXNzIiwibWVzc2FnZSIsIl9jbGVhbnVwIiwiY2xvc2UiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiRXJyb3JSZXNwb25zZSIsImVycm9yX2Rlc2NyaXB0aW9uIiwiZXJyb3JfdXJpIiwiRXZlbnQiLCJfbmFtZSIsIl9jYWxsYmFja3MiLCJmaW5kSW5kZXgiLCJpdGVtIiwicmFpc2UiLCJ0aW1lciIsImhhbmRsZSIsInRlc3RpbmciLCJyZXF1ZXN0IiwiX3Rlc3RpbmciLCJzZXRYTUxIdHRwUmVxdWVzdCIsIm5ld1JlcXVlc3QiLCJsb2NhdGlvbiIsImxvY2FsU3RvcmFnZSIsInNlc3Npb25TdG9yYWdlIiwiWE1MSHR0cFJlcXVlc3QiLCJJRnJhbWVOYXZpZ2F0b3IiLCJmcmFtZSIsIklGcmFtZVdpbmRvdyIsIm5vdGlmeVBhcmVudCIsIkRlZmF1bHRUaW1lb3V0IiwidGltZW91dCIsInNpbGVudFJlcXVlc3RUaW1lb3V0Iiwic2V0VGltZW91dCIsIl90aW1lb3V0IiwiY2xlYXJUaW1lb3V0IiwicmVtb3ZlQ2hpbGQiLCJfb3JpZ2luIiwic3RhcnRzV2l0aCIsImhyZWYiLCJwYXJlbnQiLCJwcm90b2NvbCIsImhvc3QiLCJnZXRJdGVtIiwic2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJpbmRleCIsImdldE93blByb3BlcnR5TmFtZXMiLCJKb3NlVXRpbCIsIktleVV0aWwiLCJBbGxvd2VkU2lnbmluZ0FsZ3MiLCJnZXRKb3NlVXRpbCIsInBhcnNlSnd0Iiwiand0IiwidG9rZW4iLCJoZWFkZXIiLCJwYXlsb2FkIiwidmFsaWRhdGVKd3QiLCJhdWRpZW5jZSIsImNsb2NrU2tldyIsInRpbWVJbnNlbnNpdGl2ZSIsIng1YyIsIl92YWxpZGF0ZUp3dCIsInZhbGlkYXRlSnd0QXR0cmlidXRlcyIsInZhbGlkQXVkaWVuY2UiLCJhenAiLCJsb3dlck5vdyIsInVwcGVyTm93IiwidGhlbiIsImhleFRvQmFzZTY0VXJsIiwiSnNvblNlcnZpY2UiLCJhZGRpdGlvbmFsQ29udGVudFR5cGVzIiwiWE1MSHR0cFJlcXVlc3RDdG9yIiwiand0SGFuZGxlciIsIl9jb250ZW50VHlwZXMiLCJfWE1MSHR0cFJlcXVlc3QiLCJfand0SGFuZGxlciIsImdldEpzb24iLCJyZXEiLCJhbGxvd2VkQ29udGVudFR5cGVzIiwic3RhdHVzIiwiY29udGVudFR5cGUiLCJnZXRSZXNwb25zZUhlYWRlciIsImZvdW5kIiwiZmluZCIsInJlc3BvbnNlVGV4dCIsInN0YXR1c1RleHQiLCJvbmVycm9yIiwic2V0UmVxdWVzdEhlYWRlciIsInBvc3RGb3JtIiwiYmFzaWNBdXRoIiwiYnRvYSIsIm5vcExvZ2dlciIsImluZm8iLCJ3YXJuIiwiTk9ORSIsIkVSUk9SIiwiV0FSTiIsIklORk8iLCJERUJVRyIsImxvZ2dlciIsImxldmVsIiwiYXJncyIsIk9pZGNNZXRhZGF0YVVybFBhdGgiLCJzZXR0aW5ncyIsIkpzb25TZXJ2aWNlQ3RvciIsIl9zZXR0aW5ncyIsIl9qc29uU2VydmljZSIsInJlc2V0U2lnbmluZ0tleXMiLCJzaWduaW5nS2V5cyIsImdldE1ldGFkYXRhIiwibWV0YWRhdGFVcmwiLCJzZWVkIiwibWV0YWRhdGFTZWVkIiwiYXNzaWduIiwiX2dldE1ldGFkYXRhUHJvcGVydHkiLCJnZXRBdXRob3JpemF0aW9uRW5kcG9pbnQiLCJnZXRVc2VySW5mb0VuZHBvaW50IiwiZ2V0VG9rZW5FbmRwb2ludCIsIm9wdGlvbmFsIiwiZ2V0Q2hlY2tTZXNzaW9uSWZyYW1lIiwiZ2V0RW5kU2Vzc2lvbkVuZHBvaW50IiwiZ2V0UmV2b2NhdGlvbkVuZHBvaW50IiwiZ2V0S2V5c0VuZHBvaW50IiwiZ2V0U2lnbmluZ0tleXMiLCJqd2tzX3VyaSIsImtleVNldCIsIl9tZXRhZGF0YVVybCIsImF1dGhvcml0eSIsImNyZWF0ZVNpZ25pblJlcXVlc3QiLCJyZXNwb25zZV90eXBlIiwic2NvcGUiLCJwcm9tcHQiLCJtYXhfYWdlIiwidWlfbG9jYWxlcyIsImlkX3Rva2VuX2hpbnQiLCJsb2dpbl9oaW50IiwiYWNyX3ZhbHVlcyIsInJlc291cmNlIiwicmVxdWVzdF91cmkiLCJyZXNwb25zZV9tb2RlIiwiZXh0cmFRdWVyeVBhcmFtcyIsImV4dHJhVG9rZW5QYXJhbXMiLCJyZXF1ZXN0X3R5cGUiLCJza2lwVXNlckluZm8iLCJzdGF0ZVN0b3JlIiwiU2lnbmluUmVxdWVzdCIsImlzQ29kZSIsIl9tZXRhZGF0YVNlcnZpY2UiLCJzaWduaW5SZXF1ZXN0IiwiY2xpZW50X3NlY3JldCIsInNpZ25pblN0YXRlIiwiX3N0YXRlU3RvcmUiLCJzZXQiLCJpZCIsInRvU3RvcmFnZVN0cmluZyIsInJlYWRTaWduaW5SZXNwb25zZVN0YXRlIiwicmVtb3ZlU3RhdGUiLCJ1c2VRdWVyeSIsImRlbGltaXRlciIsInJlc3BvbnNlIiwiU2lnbmluUmVzcG9uc2UiLCJzdGF0ZUFwaSIsInJlbW92ZSIsInN0b3JlZFN0YXRlU3RyaW5nIiwiU2lnbmluU3RhdGUiLCJmcm9tU3RvcmFnZVN0cmluZyIsInByb2Nlc3NTaWduaW5SZXNwb25zZSIsIl92YWxpZGF0b3IiLCJ2YWxpZGF0ZVNpZ25pblJlc3BvbnNlIiwiY3JlYXRlU2lnbm91dFJlcXVlc3QiLCJwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkiLCJTaWdub3V0UmVxdWVzdCIsInNpZ25vdXRTdGF0ZSIsInJlYWRTaWdub3V0UmVzcG9uc2VTdGF0ZSIsIlNpZ25vdXRSZXNwb25zZSIsInN0YXRlS2V5IiwiU3RhdGUiLCJwcm9jZXNzU2lnbm91dFJlc3BvbnNlIiwidmFsaWRhdGVTaWdub3V0UmVzcG9uc2UiLCJjbGVhclN0YWxlU3RhdGUiLCJzdGFsZVN0YXRlQWdlIiwidmFsaWRhdG9yIiwibWV0YWRhdGFTZXJ2aWNlIiwiRGVmYXVsdFJlc3BvbnNlVHlwZSIsIkRlZmF1bHRTY29wZSIsIkRlZmF1bHRDbGllbnRBdXRoZW50aWNhdGlvbiIsIkRlZmF1bHRTdGFsZVN0YXRlQWdlIiwiRGVmYXVsdENsb2NrU2tld0luU2Vjb25kcyIsImNsaWVudF9hdXRoZW50aWNhdGlvbiIsImZpbHRlclByb3RvY29sQ2xhaW1zIiwibG9hZFVzZXJJbmZvIiwiY2xvY2tTZXJ2aWNlIiwidXNlckluZm9Kd3RJc3N1ZXIiLCJtZXJnZUNsYWltcyIsIlJlc3BvbnNlVmFsaWRhdG9yQ3RvciIsIlJlc3BvbnNlVmFsaWRhdG9yIiwiTWV0YWRhdGFTZXJ2aWNlQ3RvciIsIl9hdXRob3JpdHkiLCJfbWV0YWRhdGEiLCJfbWV0YWRhdGFTZWVkIiwiX3NpZ25pbmdLZXlzIiwiX2NsaWVudF9zZWNyZXQiLCJfcmVzcG9uc2VfdHlwZSIsIl9zY29wZSIsIl9yZWRpcmVjdF91cmkiLCJfcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpIiwiX2NsaWVudF9hdXRoZW50aWNhdGlvbiIsIl9wcm9tcHQiLCJfZGlzcGxheSIsIl9tYXhfYWdlIiwiX3VpX2xvY2FsZXMiLCJfYWNyX3ZhbHVlcyIsIl9yZXNvdXJjZSIsIl9yZXNwb25zZV9tb2RlIiwiX2ZpbHRlclByb3RvY29sQ2xhaW1zIiwiX2xvYWRVc2VySW5mbyIsIl9zdGFsZVN0YXRlQWdlIiwiX2Nsb2NrU2tldyIsIl9jbG9ja1NlcnZpY2UiLCJfdXNlckluZm9Kd3RJc3N1ZXIiLCJfbWVyZ2VDbGFpbXMiLCJfZXh0cmFRdWVyeVBhcmFtcyIsIl9leHRyYVRva2VuUGFyYW1zIiwiUG9wdXBOYXZpZ2F0b3IiLCJQb3B1cFdpbmRvdyIsImtlZXBPcGVuIiwibm90aWZ5T3BlbmVyIiwiQ2hlY2tGb3JQb3B1cENsb3NlZEludGVydmFsIiwiX2NoZWNrRm9yUG9wdXBDbG9zZWRUaW1lciIsIl9jaGVja0ZvclBvcHVwQ2xvc2VkIiwiX2lkIiwiZm9jdXMiLCJjbG9zZWQiLCJvcGVuZXIiLCJVcmxVdGlsaXR5IiwicGFyc2VVcmxGcmFnbWVudCIsIlJlZGlyZWN0TmF2aWdhdG9yIiwidXNlUmVwbGFjZVRvTmF2aWdhdGUiLCJQcm90b2NvbENsYWltcyIsIlVzZXJJbmZvU2VydmljZUN0b3IiLCJVc2VySW5mb1NlcnZpY2UiLCJqb3NlVXRpbCIsIlRva2VuQ2xpZW50Q3RvciIsIlRva2VuQ2xpZW50IiwiX3VzZXJJbmZvU2VydmljZSIsIl9qb3NlVXRpbCIsIl90b2tlbkNsaWVudCIsIl9wcm9jZXNzU2lnbmluUGFyYW1zIiwiX3ZhbGlkYXRlVG9rZW5zIiwiX3Byb2Nlc3NDbGFpbXMiLCJub25jZSIsImlkX3Rva2VuIiwiY29kZV92ZXJpZmllciIsImlzT3BlbklkQ29ubmVjdCIsInByb2ZpbGUiLCJnZXRDbGFpbXMiLCJjbGFpbXMiLCJjbGFpbXMxIiwiY2xhaW1zMiIsInJlc3VsdCIsInZhbHVlcyIsImZvckVhY2giLCJfcHJvY2Vzc0NvZGUiLCJfdmFsaWRhdGVJZFRva2VuQW5kQWNjZXNzVG9rZW4iLCJfdmFsaWRhdGVJZFRva2VuIiwiZXhjaGFuZ2VDb2RlIiwidG9rZW5SZXNwb25zZSIsIl92YWxpZGF0ZUlkVG9rZW5BdHRyaWJ1dGVzIiwiY2xvY2tTa2V3SW5TZWNvbmRzIiwiX3ZhbGlkYXRlQWNjZXNzVG9rZW4iLCJfZ2V0U2lnbmluZ0tleUZvckp3dCIsIl9maWx0ZXJCeUFsZyIsImZpbHRlciIsIl9nZXRTaWduaW5nS2V5Rm9ySnd0V2l0aFNpbmdsZVJldHJ5IiwiYXRfaGFzaCIsImhhc2hBbGciLCJoYXNoQml0cyIsInNoYSIsImxlZnQiLCJsZWZ0X2I2NHUiLCJ1c2VyTWFuYWdlciIsIkNoZWNrU2Vzc2lvbklGcmFtZUN0b3IiLCJfdXNlck1hbmFnZXIiLCJfQ2hlY2tTZXNzaW9uSUZyYW1lQ3RvciIsImV2ZW50cyIsImFkZFVzZXJMb2FkZWQiLCJfc3RhcnQiLCJhZGRVc2VyVW5sb2FkZWQiLCJfc3RvcCIsImdldFVzZXIiLCJ1c2VyIiwibW9uaXRvckFub255bW91c1Nlc3Npb24iLCJxdWVyeVNlc3Npb25TdGF0dXMiLCJ0bXBVc2VyIiwic2Vzc2lvbiIsInNpZCIsImNhdGNoIiwiZXJyIiwiX3N1YiIsIl9zaWQiLCJfY2hlY2tTZXNzaW9uSUZyYW1lIiwiX2NoZWNrU2Vzc2lvbkludGVydmFsIiwiX3N0b3BDaGVja1Nlc3Npb25PbkVycm9yIiwidGltZXJIYW5kbGUiLCJyYWlzZUV2ZW50IiwiX3JhaXNlVXNlclNlc3Npb25DaGFuZ2VkIiwiX3JhaXNlVXNlclNpZ25lZE91dCIsIl9yYWlzZVVzZXJTaWduZWRJbiIsImNoZWNrU2Vzc2lvbkludGVydmFsIiwic3RvcENoZWNrU2Vzc2lvbk9uRXJyb3IiLCJvaWRjIiwiaXNPaWRjIiwiYWRkUXVlcnlQYXJhbSIsImNvZGVfY2hhbGxlbmdlIiwiaXNPQXV0aCIsIk9pZGNTY29wZSIsInRva2VuX3R5cGUiLCJleHBpcmVzX2F0Iiwic2NvcGVzIiwiX25vbmNlIiwiX2NvZGVfdmVyaWZpZXIiLCJfY29kZV9jaGFsbGVuZ2UiLCJfc2tpcFVzZXJJbmZvIiwiY3JlYXRlZCIsInN0b3JhZ2VTdHJpbmciLCJTaWxlbnRSZW5ld1NlcnZpY2UiLCJfdG9rZW5FeHBpcmluZyIsInNpZ25pblNpbGVudCIsIl9yYWlzZVNpbGVudFJlbmV3RXJyb3IiLCJfY3JlYXRlZCIsIl9yZXF1ZXN0X3R5cGUiLCJzdG9yYWdlIiwiYWdlIiwiY3V0b2ZmIiwiZ2V0QWxsS2V5cyIsInByb21pc2VzIiwiYWxsIiwiVGltZXJEdXJhdGlvbiIsIm5vd0Z1bmMiLCJfbm93RnVuYyIsImV4cGlyYXRpb24iLCJfdGltZXJIYW5kbGUiLCJfZXhwaXJhdGlvbiIsInRpbWVyRHVyYXRpb24iLCJkaWZmIiwiZ3JhbnRfdHlwZSIsImV4Y2hhbmdlUmVmcmVzaFRva2VuIiwicmVmcmVzaF90b2tlbiIsIkFjY2Vzc1Rva2VuVHlwZUhpbnQiLCJSZWZyZXNoVG9rZW5UeXBlSGludCIsIl9YTUxIdHRwUmVxdWVzdEN0b3IiLCJyZXZva2UiLCJyZXF1aXJlZCIsIl9yZXZva2UiLCJ4aHIiLCJnbG9iYWwiLCJsYXN0SW5kZXhPZiIsInJlZ2V4IiwiY291bnRlciIsImV4ZWMiLCJwcm9wIiwiX2dldENsYWltc0Zyb21Kd3QiLCJpc3N1ZXJQcm9taXNlIiwiU2lsZW50UmVuZXdTZXJ2aWNlQ3RvciIsIlNlc3Npb25Nb25pdG9yQ3RvciIsIlRva2VuUmV2b2NhdGlvbkNsaWVudEN0b3IiLCJVc2VyTWFuYWdlclNldHRpbmdzIiwiX2V2ZW50cyIsIlVzZXJNYW5hZ2VyRXZlbnRzIiwiX3NpbGVudFJlbmV3U2VydmljZSIsImF1dG9tYXRpY1NpbGVudFJlbmV3Iiwic3RhcnRTaWxlbnRSZW5ldyIsIm1vbml0b3JTZXNzaW9uIiwiX3Nlc3Npb25Nb25pdG9yIiwiX3Rva2VuUmV2b2NhdGlvbkNsaWVudCIsIl9sb2FkVXNlciIsInJlbW92ZVVzZXIiLCJzdG9yZVVzZXIiLCJzaWduaW5SZWRpcmVjdCIsIm5hdlBhcmFtcyIsIl9zaWduaW5TdGFydCIsIl9yZWRpcmVjdE5hdmlnYXRvciIsInNpZ25pblJlZGlyZWN0Q2FsbGJhY2siLCJfc2lnbmluRW5kIiwic2lnbmluUG9wdXAiLCJwb3B1cF9yZWRpcmVjdF91cmkiLCJfc2lnbmluIiwiX3BvcHVwTmF2aWdhdG9yIiwic2lnbmluUG9wdXBDYWxsYmFjayIsIl9zaWduaW5DYWxsYmFjayIsIl91c2VSZWZyZXNoVG9rZW4iLCJpbmNsdWRlSWRUb2tlbkluU2lsZW50UmVuZXciLCJ2YWxpZGF0ZVN1Yk9uU2lsZW50UmVuZXciLCJjdXJyZW50X3N1YiIsIl9zaWduaW5TaWxlbnRJZnJhbWUiLCJpZFRva2VuVmFsaWRhdGlvbiIsIl92YWxpZGF0ZUlkVG9rZW5Gcm9tVG9rZW5SZWZyZXNoVG9rZW4iLCJhdXRoX3RpbWUiLCJzaWxlbnRfcmVkaXJlY3RfdXJpIiwiX2lmcmFtZU5hdmlnYXRvciIsInNpZ25pblNpbGVudENhbGxiYWNrIiwic2lnbmluQ2FsbGJhY2siLCJzaWdub3V0Q2FsbGJhY2siLCJzaWdub3V0UmVkaXJlY3RDYWxsYmFjayIsInNpZ25vdXRQb3B1cENhbGxiYWNrIiwicXVlcnlfc3RhdHVzX3Jlc3BvbnNlX3R5cGUiLCJuYXZSZXNwb25zZSIsInNpZ25pblJlc3BvbnNlIiwibmF2aWdhdG9yUGFyYW1zIiwic2lnbm91dFJlZGlyZWN0IiwicG9zdExvZ291dFJlZGlyZWN0VXJpIiwiX3NpZ25vdXRTdGFydCIsIl9zaWdub3V0RW5kIiwic2lnbm91dFBvcHVwIiwicG9wdXBfcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpIiwiX3NpZ25vdXQiLCJyZXZva2VQcm9taXNlIiwicmV2b2tlQWNjZXNzVG9rZW5PblNpZ25vdXQiLCJfcmV2b2tlSW50ZXJuYWwiLCJzaWdub3V0UmVxdWVzdCIsInNpZ25vdXRSZXNwb25zZSIsInJldm9rZUFjY2Vzc1Rva2VuIiwic3VjY2VzcyIsIl9yZXZva2VBY2Nlc3NUb2tlbkludGVybmFsIiwiX3Jldm9rZVJlZnJlc2hUb2tlbkludGVybmFsIiwiYXRTdWNjZXNzIiwicnRTdWNjZXNzIiwic3RvcFNpbGVudFJlbmV3IiwiX3VzZXJTdG9yZSIsIl91c2VyU3RvcmVLZXkiLCJyZWRpcmVjdE5hdmlnYXRvciIsInBvcHVwTmF2aWdhdG9yIiwiaWZyYW1lTmF2aWdhdG9yIiwidXNlclN0b3JlIiwiX3VzZXJMb2FkZWQiLCJfdXNlclVubG9hZGVkIiwiX3NpbGVudFJlbmV3RXJyb3IiLCJfdXNlclNpZ25lZEluIiwiX3VzZXJTaWduZWRPdXQiLCJfdXNlclNlc3Npb25DaGFuZ2VkIiwicmVtb3ZlVXNlckxvYWRlZCIsInJlbW92ZVVzZXJVbmxvYWRlZCIsImFkZFNpbGVudFJlbmV3RXJyb3IiLCJyZW1vdmVTaWxlbnRSZW5ld0Vycm9yIiwiYWRkVXNlclNpZ25lZEluIiwicmVtb3ZlVXNlclNpZ25lZEluIiwiYWRkVXNlclNpZ25lZE91dCIsInJlbW92ZVVzZXJTaWduZWRPdXQiLCJhZGRVc2VyU2Vzc2lvbkNoYW5nZWQiLCJyZW1vdmVVc2VyU2Vzc2lvbkNoYW5nZWQiLCJEZWZhdWx0Q2hlY2tTZXNzaW9uSW50ZXJ2YWwiLCJzdG9yZSIsIl9wb3B1cF9yZWRpcmVjdF91cmkiLCJfcG9wdXBfcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpIiwiX3BvcHVwV2luZG93RmVhdHVyZXMiLCJfcG9wdXBXaW5kb3dUYXJnZXQiLCJfc2lsZW50X3JlZGlyZWN0X3VyaSIsIl9zaWxlbnRSZXF1ZXN0VGltZW91dCIsIl9hdXRvbWF0aWNTaWxlbnRSZW5ldyIsIl92YWxpZGF0ZVN1Yk9uU2lsZW50UmVuZXciLCJfaW5jbHVkZUlkVG9rZW5JblNpbGVudFJlbmV3IiwiX21vbml0b3JTZXNzaW9uIiwiX21vbml0b3JBbm9ueW1vdXNTZXNzaW9uIiwiX3F1ZXJ5X3N0YXR1c19yZXNwb25zZV90eXBlIiwiX3Jldm9rZUFjY2Vzc1Rva2VuT25TaWdub3V0IiwicHJlZml4IiwiX3N0b3JlIiwiX3ByZWZpeCIsIl9jcnlwdG9VdWlkdjQiLCJfdXVpZHY0IiwiaGFzQ3J5cHRvIiwiaGFzUmFuZG9tVmFsdWVzIiwidXVpZCJdLCJtYXBwaW5ncyI6Ijs7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFF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RCxFQUF0RCxFQUF5RCxFQUF6RCxFQUE0RCxFQUE1RCxFQUErRCxFQUEvRCxFQUFrRSxFQUFsRSxFQUFxRSxFQUFyRSxFQUF3RSxHQUF4RSxFQUE0RSxHQUE1RSxFQUFnRixHQUFoRixFQUFvRixHQUFwRixFQUF3RixHQUF4RixFQUE0RixHQUE1RixFQUFnRyxHQUFoRyxFQUFvRyxHQUFwRyxFQUF3RyxHQUF4RyxFQUE0RyxHQUE1RyxFQUFnSCxHQUFoSCxFQUFvSCxHQUFwSCxFQUF3SCxHQUF4SCxFQUE0SCxHQUE1SCxFQUFnSSxHQUFoSSxFQUFvSSxHQUFwSSxFQUF3SSxHQUF4SSxFQUE0SSxHQUE1SSxFQUFnSixHQUFoSixFQUFvSixHQUFwSixFQUF3SixHQUF4SixFQUE0SixHQUE1SixFQUFnSyxHQUFoSyxFQUFvSyxHQUFwSyxFQUF3SyxHQUF4SyxFQUE0SyxHQUE1SyxFQUFnTCxHQUFoTCxFQUFvTCxHQUFwTCxFQUF3TCxHQUF4TCxFQUE0TCxHQUE1TCxFQUFnTSxHQUFoTSxFQUFvTSxHQUFwTSxFQUF3TSxHQUF4TSxFQUE0TSxHQUE1TSxFQUFnTixHQUFoTixFQUFvTixHQUFwTixFQUF3TixHQUF4TixFQUE0TixHQUE1TixFQUFnTyxHQUFoTyxFQUFvTyxHQUFwTyxFQUF3TyxHQUF4TyxFQUE0TyxHQUE1TyxFQUFnUCxHQUFoUCxFQUFvUCxHQUFwUCxFQUF3UCxHQUF4UCxFQUE0UCxHQUE1UCxFQUFnUSxHQUFoUSxFQUFvUSxHQUFwUSxFQUF3USxHQUF4USxFQUE0USxHQUE1USxFQUFnUixHQUFoUixFQUFvUixHQUFwUixFQUF3UixHQUF4UixFQUE0UixHQUE1UixFQUFnUyxHQUFoUyxFQUFvUyxHQUFwUyxFQUF3UyxHQUF4UyxFQUE0UyxHQUE1UyxFQUFnVCxHQUFoVCxFQUFvVCxHQUFwVCxFQUF3VCxHQUF4VCxFQUE0VCxHQUE1VCxFQUFnVSxHQUFoVSxFQUFvVSxHQUFwVSxFQUF3VSxHQUF4VSxFQUE0VSxHQUE1VSxFQUFnVixHQUFoVixFQUFvVixHQUFwVixFQUF3VixHQUF4VixFQUE0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QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixVQUFVO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUEsdUNBQXVDLFNBQVM7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxpQkFBaUI7QUFDaEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLGlCQUFpQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsRUFBRTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsZUFBZTtBQUN2QztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBLHFCQUFxQixlQUFlO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsU0FBUztBQUM5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsbUJBQW1CLGNBQWM7QUFDakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVEQUF1RCxPQUFPO0FBQzlEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1REFBdUQsT0FBTztBQUM5RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QyxPQUFQLENBQWUsSUFBZixFQUFxQixFQUFyQixDQUFQO0FBQ0Q7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZCRCxJQUFNemUsVUFBVSxRQUFoQixDLFFBQWtDQSxPLEdBQUFBLE8iLCJmaWxlIjoib2lkYy1jbGllbnQuc2xpbS5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAwKTtcbiIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCB7IExvZyB9IGZyb20gJy4vc3JjL0xvZy5qcyc7XHJcbmltcG9ydCB7IE9pZGNDbGllbnQgfSBmcm9tICcuL3NyYy9PaWRjQ2xpZW50LmpzJztcclxuaW1wb3J0IHsgT2lkY0NsaWVudFNldHRpbmdzIH0gZnJvbSAnLi9zcmMvT2lkY0NsaWVudFNldHRpbmdzLmpzJztcclxuaW1wb3J0IHsgV2ViU3RvcmFnZVN0YXRlU3RvcmUgfSBmcm9tICcuL3NyYy9XZWJTdG9yYWdlU3RhdGVTdG9yZS5qcyc7XHJcbmltcG9ydCB7IEluTWVtb3J5V2ViU3RvcmFnZSB9IGZyb20gJy4vc3JjL0luTWVtb3J5V2ViU3RvcmFnZS5qcyc7XHJcbmltcG9ydCB7IFVzZXJNYW5hZ2VyIH0gZnJvbSAnLi9zcmMvVXNlck1hbmFnZXIuanMnO1xyXG5pbXBvcnQgeyBBY2Nlc3NUb2tlbkV2ZW50cyB9IGZyb20gJy4vc3JjL0FjY2Vzc1Rva2VuRXZlbnRzLmpzJztcclxuaW1wb3J0IHsgTWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi9zcmMvTWV0YWRhdGFTZXJ2aWNlLmpzJztcclxuaW1wb3J0IHsgQ29yZG92YVBvcHVwTmF2aWdhdG9yIH0gZnJvbSAnLi9zcmMvQ29yZG92YVBvcHVwTmF2aWdhdG9yLmpzJztcclxuaW1wb3J0IHsgQ29yZG92YUlGcmFtZU5hdmlnYXRvciB9IGZyb20gJy4vc3JjL0NvcmRvdmFJRnJhbWVOYXZpZ2F0b3IuanMnO1xyXG5pbXBvcnQgeyBDaGVja1Nlc3Npb25JRnJhbWUgfSBmcm9tICcuL3NyYy9DaGVja1Nlc3Npb25JRnJhbWUuanMnO1xyXG5pbXBvcnQgeyBUb2tlblJldm9jYXRpb25DbGllbnQgfSBmcm9tICcuL3NyYy9Ub2tlblJldm9jYXRpb25DbGllbnQuanMnO1xyXG5pbXBvcnQgeyBTZXNzaW9uTW9uaXRvciB9IGZyb20gJy4vc3JjL1Nlc3Npb25Nb25pdG9yLmpzJztcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSAnLi9zcmMvR2xvYmFsLmpzJztcclxuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4vc3JjL1VzZXIuanMnO1xyXG5cclxuaW1wb3J0IHsgVmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbi5qcyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgICBWZXJzaW9uLFxyXG4gICAgTG9nLFxyXG4gICAgT2lkY0NsaWVudCxcclxuICAgIE9pZGNDbGllbnRTZXR0aW5ncyxcclxuICAgIFdlYlN0b3JhZ2VTdGF0ZVN0b3JlLFxyXG4gICAgSW5NZW1vcnlXZWJTdG9yYWdlLFxyXG4gICAgVXNlck1hbmFnZXIsXHJcbiAgICBBY2Nlc3NUb2tlbkV2ZW50cyxcclxuICAgIE1ldGFkYXRhU2VydmljZSxcclxuICAgIENvcmRvdmFQb3B1cE5hdmlnYXRvcixcclxuICAgIENvcmRvdmFJRnJhbWVOYXZpZ2F0b3IsXHJcbiAgICBDaGVja1Nlc3Npb25JRnJhbWUsXHJcbiAgICBUb2tlblJldm9jYXRpb25DbGllbnQsXHJcbiAgICBTZXNzaW9uTW9uaXRvcixcclxuICAgIEdsb2JhbCxcclxuICAgIFVzZXJcclxufTtcclxuIiwiLypcclxuICoganNyc2FzaWduKGFsbCkgOC4wLjEyICgyMDE4LTA0LTIyKSAoYykgMjAxMC0yMDE4IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXHJcbiAqL1xyXG5cclxudmFyIG5hdmlnYXRvciA9IHt9O1xyXG5uYXZpZ2F0b3IudXNlckFnZW50ID0gZmFsc2U7XHJcblxyXG52YXIgd2luZG93ID0ge307XHJcblxuLyohXHJcbkNvcHlyaWdodCAoYykgMjAxMSwgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuQ29kZSBsaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2U6XHJcbmh0dHA6Ly9kZXZlbG9wZXIueWFob28uY29tL3l1aS9saWNlbnNlLmh0bWxcclxudmVyc2lvbjogMi45LjBcclxuKi9cclxuaWYoWUFIT089PT11bmRlZmluZWQpe3ZhciBZQUhPTz17fX1ZQUhPTy5sYW5nPXtleHRlbmQ6ZnVuY3Rpb24oZyxoLGYpe2lmKCFofHwhZyl7dGhyb3cgbmV3IEVycm9yKFwiWUFIT08ubGFuZy5leHRlbmQgZmFpbGVkLCBwbGVhc2UgY2hlY2sgdGhhdCBhbGwgZGVwZW5kZW5jaWVzIGFyZSBpbmNsdWRlZC5cIil9dmFyIGQ9ZnVuY3Rpb24oKXt9O2QucHJvdG90eXBlPWgucHJvdG90eXBlO2cucHJvdG90eXBlPW5ldyBkKCk7Zy5wcm90b3R5cGUuY29uc3RydWN0b3I9ZztnLnN1cGVyY2xhc3M9aC5wcm90b3R5cGU7aWYoaC5wcm90b3R5cGUuY29uc3RydWN0b3I9PU9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3Ipe2gucHJvdG90eXBlLmNvbnN0cnVjdG9yPWh9aWYoZil7dmFyIGI7Zm9yKGIgaW4gZil7Zy5wcm90b3R5cGVbYl09ZltiXX12YXIgZT1mdW5jdGlvbigpe30sYz1bXCJ0b1N0cmluZ1wiLFwidmFsdWVPZlwiXTt0cnl7aWYoL01TSUUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpe2U9ZnVuY3Rpb24oaixpKXtmb3IoYj0wO2I8Yy5sZW5ndGg7Yj1iKzEpe3ZhciBsPWNbYl0saz1pW2xdO2lmKHR5cGVvZiBrPT09XCJmdW5jdGlvblwiJiZrIT1PYmplY3QucHJvdG90eXBlW2xdKXtqW2xdPWt9fX19fWNhdGNoKGEpe31lKGcucHJvdG90eXBlLGYpfX19O1xuLyohIENyeXB0b0pTIHYzLjEuMiBjb3JlLWZpeC5qc1xyXG4gKiBjb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcclxuICogKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIGNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcclxuICogVEhJUyBJUyBGSVggb2YgJ2NvcmUuanMnIHRvIGZpeCBIbWFjIGlzc3VlLlxyXG4gKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy9pc3N1ZXMvZGV0YWlsP2lkPTg0XHJcbiAqIGh0dHBzOi8vY3J5cHRvLWpzLmdvb2dsZWNvZGUuY29tL3N2bi1oaXN0b3J5L3I2NjcvYnJhbmNoZXMvMy54L3NyYy9jb3JlLmpzXHJcbiAqL1xyXG52YXIgQ3J5cHRvSlM9Q3J5cHRvSlN8fChmdW5jdGlvbihlLGcpe3ZhciBhPXt9O3ZhciBiPWEubGliPXt9O3ZhciBqPWIuQmFzZT0oZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7fXJldHVybntleHRlbmQ6ZnVuY3Rpb24ocCl7bi5wcm90b3R5cGU9dGhpczt2YXIgbz1uZXcgbigpO2lmKHApe28ubWl4SW4ocCl9aWYoIW8uaGFzT3duUHJvcGVydHkoXCJpbml0XCIpKXtvLmluaXQ9ZnVuY3Rpb24oKXtvLiRzdXBlci5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19by5pbml0LnByb3RvdHlwZT1vO28uJHN1cGVyPXRoaXM7cmV0dXJuIG99LGNyZWF0ZTpmdW5jdGlvbigpe3ZhciBvPXRoaXMuZXh0ZW5kKCk7by5pbml0LmFwcGx5KG8sYXJndW1lbnRzKTtyZXR1cm4gb30saW5pdDpmdW5jdGlvbigpe30sbWl4SW46ZnVuY3Rpb24ocCl7Zm9yKHZhciBvIGluIHApe2lmKHAuaGFzT3duUHJvcGVydHkobykpe3RoaXNbb109cFtvXX19aWYocC5oYXNPd25Qcm9wZXJ0eShcInRvU3RyaW5nXCIpKXt0aGlzLnRvU3RyaW5nPXAudG9TdHJpbmd9fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmluaXQucHJvdG90eXBlLmV4dGVuZCh0aGlzKX19fSgpKTt2YXIgbD1iLldvcmRBcnJheT1qLmV4dGVuZCh7aW5pdDpmdW5jdGlvbihvLG4pe289dGhpcy53b3Jkcz1vfHxbXTtpZihuIT1nKXt0aGlzLnNpZ0J5dGVzPW59ZWxzZXt0aGlzLnNpZ0J5dGVzPW8ubGVuZ3RoKjR9fSx0b1N0cmluZzpmdW5jdGlvbihuKXtyZXR1cm4obnx8aCkuc3RyaW5naWZ5KHRoaXMpfSxjb25jYXQ6ZnVuY3Rpb24odCl7dmFyIHE9dGhpcy53b3Jkczt2YXIgcD10LndvcmRzO3ZhciBuPXRoaXMuc2lnQnl0ZXM7dmFyIHM9dC5zaWdCeXRlczt0aGlzLmNsYW1wKCk7aWYobiU0KXtmb3IodmFyIHI9MDtyPHM7cisrKXt2YXIgbz0ocFtyPj4+Ml0+Pj4oMjQtKHIlNCkqOCkpJjI1NTtxWyhuK3IpPj4+Ml18PW88PCgyNC0oKG4rciklNCkqOCl9fWVsc2V7Zm9yKHZhciByPTA7cjxzO3IrPTQpe3FbKG4rcik+Pj4yXT1wW3I+Pj4yXX19dGhpcy5zaWdCeXRlcys9cztyZXR1cm4gdGhpc30sY2xhbXA6ZnVuY3Rpb24oKXt2YXIgbz10aGlzLndvcmRzO3ZhciBuPXRoaXMuc2lnQnl0ZXM7b1tuPj4+Ml0mPTQyOTQ5NjcyOTU8PCgzMi0obiU0KSo4KTtvLmxlbmd0aD1lLmNlaWwobi80KX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgbj1qLmNsb25lLmNhbGwodGhpcyk7bi53b3Jkcz10aGlzLndvcmRzLnNsaWNlKDApO3JldHVybiBufSxyYW5kb206ZnVuY3Rpb24ocCl7dmFyIG89W107Zm9yKHZhciBuPTA7bjxwO24rPTQpe28ucHVzaCgoZS5yYW5kb20oKSo0Mjk0OTY3Mjk2KXwwKX1yZXR1cm4gbmV3IGwuaW5pdChvLHApfX0pO3ZhciBtPWEuZW5jPXt9O3ZhciBoPW0uSGV4PXtzdHJpbmdpZnk6ZnVuY3Rpb24ocCl7dmFyIHI9cC53b3Jkczt2YXIgbz1wLnNpZ0J5dGVzO3ZhciBxPVtdO2Zvcih2YXIgbj0wO248bztuKyspe3ZhciBzPShyW24+Pj4yXT4+PigyNC0obiU0KSo4KSkmMjU1O3EucHVzaCgocz4+PjQpLnRvU3RyaW5nKDE2KSk7cS5wdXNoKChzJjE1KS50b1N0cmluZygxNikpfXJldHVybiBxLmpvaW4oXCJcIil9LHBhcnNlOmZ1bmN0aW9uKHApe3ZhciBuPXAubGVuZ3RoO3ZhciBxPVtdO2Zvcih2YXIgbz0wO288bjtvKz0yKXtxW28+Pj4zXXw9cGFyc2VJbnQocC5zdWJzdHIobywyKSwxNik8PCgyNC0obyU4KSo0KX1yZXR1cm4gbmV3IGwuaW5pdChxLG4vMil9fTt2YXIgZD1tLkxhdGluMT17c3RyaW5naWZ5OmZ1bmN0aW9uKHEpe3ZhciByPXEud29yZHM7dmFyIHA9cS5zaWdCeXRlczt2YXIgbj1bXTtmb3IodmFyIG89MDtvPHA7bysrKXt2YXIgcz0ocltvPj4+Ml0+Pj4oMjQtKG8lNCkqOCkpJjI1NTtuLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShzKSl9cmV0dXJuIG4uam9pbihcIlwiKX0scGFyc2U6ZnVuY3Rpb24ocCl7dmFyIG49cC5sZW5ndGg7dmFyIHE9W107Zm9yKHZhciBvPTA7bzxuO28rKyl7cVtvPj4+Ml18PShwLmNoYXJDb2RlQXQobykmMjU1KTw8KDI0LShvJTQpKjgpfXJldHVybiBuZXcgbC5pbml0KHEsbil9fTt2YXIgYz1tLlV0Zjg9e3N0cmluZ2lmeTpmdW5jdGlvbihuKXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoZC5zdHJpbmdpZnkobikpKX1jYXRjaChvKXt0aHJvdyBuZXcgRXJyb3IoXCJNYWxmb3JtZWQgVVRGLTggZGF0YVwiKX19LHBhcnNlOmZ1bmN0aW9uKG4pe3JldHVybiBkLnBhcnNlKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChuKSkpfX07dmFyIGk9Yi5CdWZmZXJlZEJsb2NrQWxnb3JpdGhtPWouZXh0ZW5kKHtyZXNldDpmdW5jdGlvbigpe3RoaXMuX2RhdGE9bmV3IGwuaW5pdCgpO3RoaXMuX25EYXRhQnl0ZXM9MH0sX2FwcGVuZDpmdW5jdGlvbihuKXtpZih0eXBlb2Ygbj09XCJzdHJpbmdcIil7bj1jLnBhcnNlKG4pfXRoaXMuX2RhdGEuY29uY2F0KG4pO3RoaXMuX25EYXRhQnl0ZXMrPW4uc2lnQnl0ZXN9LF9wcm9jZXNzOmZ1bmN0aW9uKHcpe3ZhciBxPXRoaXMuX2RhdGE7dmFyIHg9cS53b3Jkczt2YXIgbj1xLnNpZ0J5dGVzO3ZhciB0PXRoaXMuYmxvY2tTaXplO3ZhciB2PXQqNDt2YXIgdT1uL3Y7aWYodyl7dT1lLmNlaWwodSl9ZWxzZXt1PWUubWF4KCh1fDApLXRoaXMuX21pbkJ1ZmZlclNpemUsMCl9dmFyIHM9dSp0O3ZhciByPWUubWluKHMqNCxuKTtpZihzKXtmb3IodmFyIHA9MDtwPHM7cCs9dCl7dGhpcy5fZG9Qcm9jZXNzQmxvY2soeCxwKX12YXIgbz14LnNwbGljZSgwLHMpO3Euc2lnQnl0ZXMtPXJ9cmV0dXJuIG5ldyBsLmluaXQobyxyKX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgbj1qLmNsb25lLmNhbGwodGhpcyk7bi5fZGF0YT10aGlzLl9kYXRhLmNsb25lKCk7cmV0dXJuIG59LF9taW5CdWZmZXJTaXplOjB9KTt2YXIgZj1iLkhhc2hlcj1pLmV4dGVuZCh7Y2ZnOmouZXh0ZW5kKCksaW5pdDpmdW5jdGlvbihuKXt0aGlzLmNmZz10aGlzLmNmZy5leHRlbmQobik7dGhpcy5yZXNldCgpfSxyZXNldDpmdW5jdGlvbigpe2kucmVzZXQuY2FsbCh0aGlzKTt0aGlzLl9kb1Jlc2V0KCl9LHVwZGF0ZTpmdW5jdGlvbihuKXt0aGlzLl9hcHBlbmQobik7dGhpcy5fcHJvY2VzcygpO3JldHVybiB0aGlzfSxmaW5hbGl6ZTpmdW5jdGlvbihuKXtpZihuKXt0aGlzLl9hcHBlbmQobil9dmFyIG89dGhpcy5fZG9GaW5hbGl6ZSgpO3JldHVybiBvfSxibG9ja1NpemU6NTEyLzMyLF9jcmVhdGVIZWxwZXI6ZnVuY3Rpb24obil7cmV0dXJuIGZ1bmN0aW9uKHAsbyl7cmV0dXJuIG5ldyBuLmluaXQobykuZmluYWxpemUocCl9fSxfY3JlYXRlSG1hY0hlbHBlcjpmdW5jdGlvbihuKXtyZXR1cm4gZnVuY3Rpb24ocCxvKXtyZXR1cm4gbmV3IGsuSE1BQy5pbml0KG4sbykuZmluYWxpemUocCl9fX0pO3ZhciBrPWEuYWxnbz17fTtyZXR1cm4gYX0oTWF0aCkpO1xuLypcclxuQ3J5cHRvSlMgdjMuMS4yIHg2NC1jb3JlLW1pbi5qc1xyXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcclxuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcclxuKi9cclxuKGZ1bmN0aW9uKGcpe3ZhciBhPUNyeXB0b0pTLGY9YS5saWIsZT1mLkJhc2UsaD1mLldvcmRBcnJheSxhPWEueDY0PXt9O2EuV29yZD1lLmV4dGVuZCh7aW5pdDpmdW5jdGlvbihiLGMpe3RoaXMuaGlnaD1iO3RoaXMubG93PWN9fSk7YS5Xb3JkQXJyYXk9ZS5leHRlbmQoe2luaXQ6ZnVuY3Rpb24oYixjKXtiPXRoaXMud29yZHM9Ynx8W107dGhpcy5zaWdCeXRlcz1jIT1nP2M6OCpiLmxlbmd0aH0sdG9YMzI6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy53b3JkcyxjPWIubGVuZ3RoLGE9W10sZD0wO2Q8YztkKyspe3ZhciBlPWJbZF07YS5wdXNoKGUuaGlnaCk7YS5wdXNoKGUubG93KX1yZXR1cm4gaC5jcmVhdGUoYSx0aGlzLnNpZ0J5dGVzKX0sY2xvbmU6ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZS5jbG9uZS5jYWxsKHRoaXMpLGM9Yi53b3Jkcz10aGlzLndvcmRzLnNsaWNlKDApLGE9Yy5sZW5ndGgsZD0wO2Q8YTtkKyspY1tkXT1jW2RdLmNsb25lKCk7cmV0dXJuIGJ9fSl9KSgpO1xyXG5cbi8qXHJcbkNyeXB0b0pTIHYzLjEuMiBlbmMtYmFzZTY0LmpzXHJcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xyXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxyXG4qL1xyXG4oZnVuY3Rpb24oKXt2YXIgaD1DcnlwdG9KUyxqPWgubGliLldvcmRBcnJheTtoLmVuYy5CYXNlNjQ9e3N0cmluZ2lmeTpmdW5jdGlvbihiKXt2YXIgZT1iLndvcmRzLGY9Yi5zaWdCeXRlcyxjPXRoaXMuX21hcDtiLmNsYW1wKCk7Yj1bXTtmb3IodmFyIGE9MDthPGY7YSs9Mylmb3IodmFyIGQ9KGVbYT4+PjJdPj4+MjQtOCooYSU0KSYyNTUpPDwxNnwoZVthKzE+Pj4yXT4+PjI0LTgqKChhKzEpJTQpJjI1NSk8PDh8ZVthKzI+Pj4yXT4+PjI0LTgqKChhKzIpJTQpJjI1NSxnPTA7ND5nJiZhKzAuNzUqZzxmO2crKyliLnB1c2goYy5jaGFyQXQoZD4+PjYqKDMtZykmNjMpKTtpZihlPWMuY2hhckF0KDY0KSlmb3IoO2IubGVuZ3RoJTQ7KWIucHVzaChlKTtyZXR1cm4gYi5qb2luKFwiXCIpfSxwYXJzZTpmdW5jdGlvbihiKXt2YXIgZT1iLmxlbmd0aCxmPXRoaXMuX21hcCxjPWYuY2hhckF0KDY0KTtjJiYoYz1iLmluZGV4T2YoYyksLTEhPWMmJihlPWMpKTtmb3IodmFyIGM9W10sYT0wLGQ9MDtkPFxyXG5lO2QrKylpZihkJTQpe3ZhciBnPWYuaW5kZXhPZihiLmNoYXJBdChkLTEpKTw8MiooZCU0KSxoPWYuaW5kZXhPZihiLmNoYXJBdChkKSk+Pj42LTIqKGQlNCk7Y1thPj4+Ml18PShnfGgpPDwyNC04KihhJTQpO2ErK31yZXR1cm4gai5jcmVhdGUoYyxhKX0sX21hcDpcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XCJ9fSkoKTtcclxuXG4vKlxyXG5DcnlwdG9KUyB2My4xLjIgc2hhMjU2LW1pbi5qc1xyXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcclxuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcclxuKi9cclxuKGZ1bmN0aW9uKGspe2Zvcih2YXIgZz1DcnlwdG9KUyxoPWcubGliLHY9aC5Xb3JkQXJyYXksaj1oLkhhc2hlcixoPWcuYWxnbyxzPVtdLHQ9W10sdT1mdW5jdGlvbihxKXtyZXR1cm4gNDI5NDk2NzI5NioocS0ocXwwKSl8MH0sbD0yLGI9MDs2ND5iOyl7dmFyIGQ7YTp7ZD1sO2Zvcih2YXIgdz1rLnNxcnQoZCkscj0yO3I8PXc7cisrKWlmKCEoZCVyKSl7ZD0hMTticmVhayBhfWQ9ITB9ZCYmKDg+YiYmKHNbYl09dShrLnBvdyhsLDAuNSkpKSx0W2JdPXUoay5wb3cobCwxLzMpKSxiKyspO2wrK312YXIgbj1bXSxoPWguU0hBMjU2PWouZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IHYuaW5pdChzLnNsaWNlKDApKX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKHEsaCl7Zm9yKHZhciBhPXRoaXMuX2hhc2gud29yZHMsYz1hWzBdLGQ9YVsxXSxiPWFbMl0saz1hWzNdLGY9YVs0XSxnPWFbNV0saj1hWzZdLGw9YVs3XSxlPTA7NjQ+ZTtlKyspe2lmKDE2PmUpbltlXT1cclxucVtoK2VdfDA7ZWxzZXt2YXIgbT1uW2UtMTVdLHA9bltlLTJdO25bZV09KChtPDwyNXxtPj4+NyleKG08PDE0fG0+Pj4xOClebT4+PjMpK25bZS03XSsoKHA8PDE1fHA+Pj4xNyleKHA8PDEzfHA+Pj4xOSlecD4+PjEwKStuW2UtMTZdfW09bCsoKGY8PDI2fGY+Pj42KV4oZjw8MjF8Zj4+PjExKV4oZjw8N3xmPj4+MjUpKSsoZiZnXn5mJmopK3RbZV0rbltlXTtwPSgoYzw8MzB8Yz4+PjIpXihjPDwxOXxjPj4+MTMpXihjPDwxMHxjPj4+MjIpKSsoYyZkXmMmYl5kJmIpO2w9ajtqPWc7Zz1mO2Y9ayttfDA7az1iO2I9ZDtkPWM7Yz1tK3B8MH1hWzBdPWFbMF0rY3wwO2FbMV09YVsxXStkfDA7YVsyXT1hWzJdK2J8MDthWzNdPWFbM10ra3wwO2FbNF09YVs0XStmfDA7YVs1XT1hWzVdK2d8MDthWzZdPWFbNl0ranwwO2FbN109YVs3XStsfDB9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5fZGF0YSxiPWQud29yZHMsYT04KnRoaXMuX25EYXRhQnl0ZXMsYz04KmQuc2lnQnl0ZXM7XHJcbmJbYz4+PjVdfD0xMjg8PDI0LWMlMzI7YlsoYys2ND4+Pjk8PDQpKzE0XT1rLmZsb29yKGEvNDI5NDk2NzI5Nik7YlsoYys2ND4+Pjk8PDQpKzE1XT1hO2Quc2lnQnl0ZXM9NCpiLmxlbmd0aDt0aGlzLl9wcm9jZXNzKCk7cmV0dXJuIHRoaXMuX2hhc2h9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIGI9ai5jbG9uZS5jYWxsKHRoaXMpO2IuX2hhc2g9dGhpcy5faGFzaC5jbG9uZSgpO3JldHVybiBifX0pO2cuU0hBMjU2PWouX2NyZWF0ZUhlbHBlcihoKTtnLkhtYWNTSEEyNTY9ai5fY3JlYXRlSG1hY0hlbHBlcihoKX0pKE1hdGgpO1xyXG5cbi8qXHJcbkNyeXB0b0pTIHYzLjEuMiBzaGE1MTItbWluLmpzXHJcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xyXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxyXG4qL1xyXG4oZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7cmV0dXJuIGQuY3JlYXRlLmFwcGx5KGQsYXJndW1lbnRzKX1mb3IodmFyIG49Q3J5cHRvSlMscj1uLmxpYi5IYXNoZXIsZT1uLng2NCxkPWUuV29yZCxUPWUuV29yZEFycmF5LGU9bi5hbGdvLGVhPVthKDExMTYzNTI0MDgsMzYwOTc2NzQ1OCksYSgxODk5NDQ3NDQxLDYwMjg5MTcyNSksYSgzMDQ5MzIzNDcxLDM5NjQ0ODQzOTkpLGEoMzkyMTAwOTU3MywyMTczMjk1NTQ4KSxhKDk2MTk4NzE2Myw0MDgxNjI4NDcyKSxhKDE1MDg5NzA5OTMsMzA1MzgzNDI2NSksYSgyNDUzNjM1NzQ4LDI5Mzc2NzE1NzkpLGEoMjg3MDc2MzIyMSwzNjY0NjA5NTYwKSxhKDM2MjQzODEwODAsMjczNDg4MzM5NCksYSgzMTA1OTg0MDEsMTE2NDk5NjU0MiksYSg2MDcyMjUyNzgsMTMyMzYxMDc2NCksYSgxNDI2ODgxOTg3LDM1OTAzMDQ5OTQpLGEoMTkyNTA3ODM4OCw0MDY4MTgyMzgzKSxhKDIxNjIwNzgyMDYsOTkxMzM2MTEzKSxhKDI2MTQ4ODgxMDMsNjMzODAzMzE3KSxcclxuYSgzMjQ4MjIyNTgwLDM0Nzk3NzQ4NjgpLGEoMzgzNTM5MDQwMSwyNjY2NjEzNDU4KSxhKDQwMjIyMjQ3NzQsOTQ0NzExMTM5KSxhKDI2NDM0NzA3OCwyMzQxMjYyNzczKSxhKDYwNDgwNzYyOCwyMDA3ODAwOTMzKSxhKDc3MDI1NTk4MywxNDk1OTkwOTAxKSxhKDEyNDkxNTAxMjIsMTg1NjQzMTIzNSksYSgxNTU1MDgxNjkyLDMxNzUyMTgxMzIpLGEoMTk5NjA2NDk4NiwyMTk4OTUwODM3KSxhKDI1NTQyMjA4ODIsMzk5OTcxOTMzOSksYSgyODIxODM0MzQ5LDc2Njc4NDAxNiksYSgyOTUyOTk2ODA4LDI1NjY1OTQ4NzkpLGEoMzIxMDMxMzY3MSwzMjAzMzM3OTU2KSxhKDMzMzY1NzE4OTEsMTAzNDQ1NzAyNiksYSgzNTg0NTI4NzExLDI0NjY5NDg5MDEpLGEoMTEzOTI2OTkzLDM3NTgzMjYzODMpLGEoMzM4MjQxODk1LDE2ODcxNzkzNiksYSg2NjYzMDcyMDUsMTE4ODE3OTk2NCksYSg3NzM1Mjk5MTIsMTU0NjA0NTczNCksYSgxMjk0NzU3MzcyLDE1MjI4MDU0ODUpLGEoMTM5NjE4MjI5MSxcclxuMjY0MzgzMzgyMyksYSgxNjk1MTgzNzAwLDIzNDM1MjczOTApLGEoMTk4NjY2MTA1MSwxMDE0NDc3NDgwKSxhKDIxNzcwMjYzNTAsMTIwNjc1OTE0MiksYSgyNDU2OTU2MDM3LDM0NDA3NzYyNyksYSgyNzMwNDg1OTIxLDEyOTA4NjM0NjApLGEoMjgyMDMwMjQxMSwzMTU4NDU0MjczKSxhKDMyNTk3MzA4MDAsMzUwNTk1MjY1NyksYSgzMzQ1NzY0NzcxLDEwNjIxNzAwOCksYSgzNTE2MDY1ODE3LDM2MDYwMDgzNDQpLGEoMzYwMDM1MjgwNCwxNDMyNzI1Nzc2KSxhKDQwOTQ1NzE5MDksMTQ2NzAzMTU5NCksYSgyNzU0MjMzNDQsODUxMTY5NzIwKSxhKDQzMDIyNzczNCwzMTAwODIzNzUyKSxhKDUwNjk0ODYxNiwxMzYzMjU4MTk1KSxhKDY1OTA2MDU1NiwzNzUwNjg1NTkzKSxhKDg4Mzk5Nzg3NywzNzg1MDUwMjgwKSxhKDk1ODEzOTU3MSwzMzE4MzA3NDI3KSxhKDEzMjI4MjIyMTgsMzgxMjcyMzQwMyksYSgxNTM3MDAyMDYzLDIwMDMwMzQ5OTUpLGEoMTc0Nzg3Mzc3OSwzNjAyMDM2ODk5KSxcclxuYSgxOTU1NTYyMjIyLDE1NzU5OTAwMTIpLGEoMjAyNDEwNDgxNSwxMTI1NTkyOTI4KSxhKDIyMjc3MzA0NTIsMjcxNjkwNDMwNiksYSgyMzYxODUyNDI0LDQ0Mjc3NjA0NCksYSgyNDI4NDM2NDc0LDU5MzY5ODM0NCksYSgyNzU2NzM0MTg3LDM3MzMxMTAyNDkpLGEoMzIwNDAzMTQ3OSwyOTk5MzUxNTczKSxhKDMzMjkzMjUyOTgsMzgxNTkyMDQyNyksYSgzMzkxNTY5NjE0LDM5MjgzODM5MDApLGEoMzUxNTI2NzI3MSw1NjYyODA3MTEpLGEoMzk0MDE4NzYwNiwzNDU0MDY5NTM0KSxhKDQxMTg2MzAyNzEsNDAwMDIzOTk5MiksYSgxMTY0MTg0NzQsMTkxNDEzODU1NCksYSgxNzQyOTI0MjEsMjczMTA1NTI3MCksYSgyODkzODAzNTYsMzIwMzk5MzAwNiksYSg0NjAzOTMyNjksMzIwNjIwMzE1KSxhKDY4NTQ3MTczMyw1ODc0OTY4MzYpLGEoODUyMTQyOTcxLDEwODY3OTI4NTEpLGEoMTAxNzAzNjI5OCwzNjU1NDMxMDApLGEoMTEyNjAwMDU4MCwyNjE4Mjk3Njc2KSxhKDEyODgwMzM0NzAsXHJcbjM0MDk4NTUxNTgpLGEoMTUwMTUwNTk0OCw0MjM0NTA5ODY2KSxhKDE2MDcxNjc5MTUsOTg3MTY3NDY4KSxhKDE4MTY0MDIzMTYsMTI0NjE4OTU5MSldLHY9W10sdz0wOzgwPnc7dysrKXZbd109YSgpO2U9ZS5TSEE1MTI9ci5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uZXcgVC5pbml0KFtuZXcgZC5pbml0KDE3NzkwMzM3MDMsNDA4OTIzNTcyMCksbmV3IGQuaW5pdCgzMTQ0MTM0Mjc3LDIyMjc4NzM1OTUpLG5ldyBkLmluaXQoMTAxMzkwNDI0Miw0MjcxMTc1NzIzKSxuZXcgZC5pbml0KDI3NzM0ODA3NjIsMTU5NTc1MDEyOSksbmV3IGQuaW5pdCgxMzU5ODkzMTE5LDI5MTc1NjUxMzcpLG5ldyBkLmluaXQoMjYwMDgyMjkyNCw3MjU1MTExOTkpLG5ldyBkLmluaXQoNTI4NzM0NjM1LDQyMTUzODk1NDcpLG5ldyBkLmluaXQoMTU0MTQ1OTIyNSwzMjcwMzMyMDkpXSl9LF9kb1Byb2Nlc3NCbG9jazpmdW5jdGlvbihhLGQpe2Zvcih2YXIgZj10aGlzLl9oYXNoLndvcmRzLFxyXG5GPWZbMF0sZT1mWzFdLG49ZlsyXSxyPWZbM10sRz1mWzRdLEg9Zls1XSxJPWZbNl0sZj1mWzddLHc9Ri5oaWdoLEo9Ri5sb3csWD1lLmhpZ2gsSz1lLmxvdyxZPW4uaGlnaCxMPW4ubG93LFo9ci5oaWdoLE09ci5sb3csJD1HLmhpZ2gsTj1HLmxvdyxhYT1ILmhpZ2gsTz1ILmxvdyxiYT1JLmhpZ2gsUD1JLmxvdyxjYT1mLmhpZ2gsUT1mLmxvdyxrPXcsZz1KLHo9WCx4PUssQT1ZLHk9TCxVPVosQj1NLGw9JCxoPU4sUj1hYSxDPU8sUz1iYSxEPVAsVj1jYSxFPVEsbT0wOzgwPm07bSsrKXt2YXIgcz12W21dO2lmKDE2Pm0pdmFyIGo9cy5oaWdoPWFbZCsyKm1dfDAsYj1zLmxvdz1hW2QrMiptKzFdfDA7ZWxzZXt2YXIgaj12W20tMTVdLGI9ai5oaWdoLHA9ai5sb3csaj0oYj4+PjF8cDw8MzEpXihiPj4+OHxwPDwyNCleYj4+PjcscD0ocD4+PjF8Yjw8MzEpXihwPj4+OHxiPDwyNCleKHA+Pj43fGI8PDI1KSx1PXZbbS0yXSxiPXUuaGlnaCxjPXUubG93LHU9KGI+Pj4xOXxjPDwxMyleKGI8PFxyXG4zfGM+Pj4yOSleYj4+PjYsYz0oYz4+PjE5fGI8PDEzKV4oYzw8M3xiPj4+MjkpXihjPj4+NnxiPDwyNiksYj12W20tN10sVz1iLmhpZ2gsdD12W20tMTZdLHE9dC5oaWdoLHQ9dC5sb3csYj1wK2IubG93LGo9aitXKyhiPj4+MDxwPj4+MD8xOjApLGI9YitjLGo9ait1KyhiPj4+MDxjPj4+MD8xOjApLGI9Yit0LGo9aitxKyhiPj4+MDx0Pj4+MD8xOjApO3MuaGlnaD1qO3MubG93PWJ9dmFyIFc9bCZSXn5sJlMsdD1oJkNefmgmRCxzPWsmel5rJkFeeiZBLFQ9ZyZ4XmcmeV54JnkscD0oaz4+PjI4fGc8PDQpXihrPDwzMHxnPj4+MileKGs8PDI1fGc+Pj43KSx1PShnPj4+Mjh8azw8NCleKGc8PDMwfGs+Pj4yKV4oZzw8MjV8az4+PjcpLGM9ZWFbbV0sZmE9Yy5oaWdoLGRhPWMubG93LGM9RSsoKGg+Pj4xNHxsPDwxOCleKGg+Pj4xOHxsPDwxNCleKGg8PDIzfGw+Pj45KSkscT1WKygobD4+PjE0fGg8PDE4KV4obD4+PjE4fGg8PDE0KV4obDw8MjN8aD4+PjkpKSsoYz4+PjA8RT4+PjA/MTpcclxuMCksYz1jK3QscT1xK1crKGM+Pj4wPHQ+Pj4wPzE6MCksYz1jK2RhLHE9cStmYSsoYz4+PjA8ZGE+Pj4wPzE6MCksYz1jK2IscT1xK2orKGM+Pj4wPGI+Pj4wPzE6MCksYj11K1Qscz1wK3MrKGI+Pj4wPHU+Pj4wPzE6MCksVj1TLEU9RCxTPVIsRD1DLFI9bCxDPWgsaD1CK2N8MCxsPVUrcSsoaD4+PjA8Qj4+PjA/MTowKXwwLFU9QSxCPXksQT16LHk9eCx6PWsseD1nLGc9YytifDAsaz1xK3MrKGc+Pj4wPGM+Pj4wPzE6MCl8MH1KPUYubG93PUorZztGLmhpZ2g9dytrKyhKPj4+MDxnPj4+MD8xOjApO0s9ZS5sb3c9Syt4O2UuaGlnaD1YK3orKEs+Pj4wPHg+Pj4wPzE6MCk7TD1uLmxvdz1MK3k7bi5oaWdoPVkrQSsoTD4+PjA8eT4+PjA/MTowKTtNPXIubG93PU0rQjtyLmhpZ2g9WitVKyhNPj4+MDxCPj4+MD8xOjApO049Ry5sb3c9TitoO0cuaGlnaD0kK2wrKE4+Pj4wPGg+Pj4wPzE6MCk7Tz1ILmxvdz1PK0M7SC5oaWdoPWFhK1IrKE8+Pj4wPEM+Pj4wPzE6MCk7UD1JLmxvdz1QK0Q7XHJcbkkuaGlnaD1iYStTKyhQPj4+MDxEPj4+MD8xOjApO1E9Zi5sb3c9UStFO2YuaGlnaD1jYStWKyhRPj4+MDxFPj4+MD8xOjApfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX2RhdGEsZD1hLndvcmRzLGY9OCp0aGlzLl9uRGF0YUJ5dGVzLGU9OCphLnNpZ0J5dGVzO2RbZT4+PjVdfD0xMjg8PDI0LWUlMzI7ZFsoZSsxMjg+Pj4xMDw8NSkrMzBdPU1hdGguZmxvb3IoZi80Mjk0OTY3Mjk2KTtkWyhlKzEyOD4+PjEwPDw1KSszMV09ZjthLnNpZ0J5dGVzPTQqZC5sZW5ndGg7dGhpcy5fcHJvY2VzcygpO3JldHVybiB0aGlzLl9oYXNoLnRvWDMyKCl9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIGE9ci5jbG9uZS5jYWxsKHRoaXMpO2EuX2hhc2g9dGhpcy5faGFzaC5jbG9uZSgpO3JldHVybiBhfSxibG9ja1NpemU6MzJ9KTtuLlNIQTUxMj1yLl9jcmVhdGVIZWxwZXIoZSk7bi5IbWFjU0hBNTEyPXIuX2NyZWF0ZUhtYWNIZWxwZXIoZSl9KSgpO1xyXG5cbi8qXHJcbkNyeXB0b0pTIHYzLjEuMiBzaGEzODQtbWluLmpzXHJcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xyXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxyXG4qL1xyXG4oZnVuY3Rpb24oKXt2YXIgYz1DcnlwdG9KUyxhPWMueDY0LGI9YS5Xb3JkLGU9YS5Xb3JkQXJyYXksYT1jLmFsZ28sZD1hLlNIQTUxMixhPWEuU0hBMzg0PWQuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IGUuaW5pdChbbmV3IGIuaW5pdCgzNDE4MDcwMzY1LDMyMzgzNzEwMzIpLG5ldyBiLmluaXQoMTY1NDI3MDI1MCw5MTQxNTA2NjMpLG5ldyBiLmluaXQoMjQzODUyOTM3MCw4MTI3MDI5OTkpLG5ldyBiLmluaXQoMzU1NDYyMzYwLDQxNDQ5MTI2OTcpLG5ldyBiLmluaXQoMTczMTQwNTQxNSw0MjkwNzc1ODU3KSxuZXcgYi5pbml0KDIzOTQxODAyMzEsMTc1MDYwMzAyNSksbmV3IGIuaW5pdCgzNjc1MDA4NTI1LDE2OTQwNzY4MzkpLG5ldyBiLmluaXQoMTIwMzA2MjgxMywzMjA0MDc1NDI4KV0pfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPWQuX2RvRmluYWxpemUuY2FsbCh0aGlzKTthLnNpZ0J5dGVzLT0xNjtyZXR1cm4gYX19KTtjLlNIQTM4ND1cclxuZC5fY3JlYXRlSGVscGVyKGEpO2MuSG1hY1NIQTM4ND1kLl9jcmVhdGVIbWFjSGVscGVyKGEpfSkoKTtcclxuXG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cclxuICovXHJcbnZhciBiNjRtYXA9XCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCI7dmFyIGI2NHBhZD1cIj1cIjtmdW5jdGlvbiBoZXgyYjY0KGQpe3ZhciBiO3ZhciBlO3ZhciBhPVwiXCI7Zm9yKGI9MDtiKzM8PWQubGVuZ3RoO2IrPTMpe2U9cGFyc2VJbnQoZC5zdWJzdHJpbmcoYixiKzMpLDE2KTthKz1iNjRtYXAuY2hhckF0KGU+PjYpK2I2NG1hcC5jaGFyQXQoZSY2Myl9aWYoYisxPT1kLmxlbmd0aCl7ZT1wYXJzZUludChkLnN1YnN0cmluZyhiLGIrMSksMTYpO2ErPWI2NG1hcC5jaGFyQXQoZTw8Mil9ZWxzZXtpZihiKzI9PWQubGVuZ3RoKXtlPXBhcnNlSW50KGQuc3Vic3RyaW5nKGIsYisyKSwxNik7YSs9YjY0bWFwLmNoYXJBdChlPj4yKStiNjRtYXAuY2hhckF0KChlJjMpPDw0KX19aWYoYjY0cGFkKXt3aGlsZSgoYS5sZW5ndGgmMyk+MCl7YSs9YjY0cGFkfX1yZXR1cm4gYX1mdW5jdGlvbiBiNjR0b2hleChmKXt2YXIgZD1cIlwiO3ZhciBlO3ZhciBiPTA7dmFyIGM7dmFyIGE7Zm9yKGU9MDtlPGYubGVuZ3RoOysrZSl7aWYoZi5jaGFyQXQoZSk9PWI2NHBhZCl7YnJlYWt9YT1iNjRtYXAuaW5kZXhPZihmLmNoYXJBdChlKSk7aWYoYTwwKXtjb250aW51ZX1pZihiPT0wKXtkKz1pbnQyY2hhcihhPj4yKTtjPWEmMztiPTF9ZWxzZXtpZihiPT0xKXtkKz1pbnQyY2hhcigoYzw8Mil8KGE+PjQpKTtjPWEmMTU7Yj0yfWVsc2V7aWYoYj09Mil7ZCs9aW50MmNoYXIoYyk7ZCs9aW50MmNoYXIoYT4+Mik7Yz1hJjM7Yj0zfWVsc2V7ZCs9aW50MmNoYXIoKGM8PDIpfChhPj40KSk7ZCs9aW50MmNoYXIoYSYxNSk7Yj0wfX19fWlmKGI9PTEpe2QrPWludDJjaGFyKGM8PDIpfXJldHVybiBkfWZ1bmN0aW9uIGI2NHRvQkEoZSl7dmFyIGQ9YjY0dG9oZXgoZSk7dmFyIGM7dmFyIGI9bmV3IEFycmF5KCk7Zm9yKGM9MDsyKmM8ZC5sZW5ndGg7KytjKXtiW2NdPXBhcnNlSW50KGQuc3Vic3RyaW5nKDIqYywyKmMrMiksMTYpfXJldHVybiBifTtcbi8qISAoYykgVG9tIFd1IHwgaHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfnRqdy9qc2JuL1xyXG4gKi9cclxudmFyIGRiaXRzO3ZhciBjYW5hcnk9MjQ0ODM3ODE0MDk0NTkwO3ZhciBqX2xtPSgoY2FuYXJ5JjE2Nzc3MjE1KT09MTU3MTUwNzApO2Z1bmN0aW9uIEJpZ0ludGVnZXIoZSxkLGYpe2lmKGUhPW51bGwpe2lmKFwibnVtYmVyXCI9PXR5cGVvZiBlKXt0aGlzLmZyb21OdW1iZXIoZSxkLGYpfWVsc2V7aWYoZD09bnVsbCYmXCJzdHJpbmdcIiE9dHlwZW9mIGUpe3RoaXMuZnJvbVN0cmluZyhlLDI1Nil9ZWxzZXt0aGlzLmZyb21TdHJpbmcoZSxkKX19fX1mdW5jdGlvbiBuYmkoKXtyZXR1cm4gbmV3IEJpZ0ludGVnZXIobnVsbCl9ZnVuY3Rpb24gYW0xKGYsYSxiLGUsaCxnKXt3aGlsZSgtLWc+PTApe3ZhciBkPWEqdGhpc1tmKytdK2JbZV0raDtoPU1hdGguZmxvb3IoZC82NzEwODg2NCk7YltlKytdPWQmNjcxMDg4NjN9cmV0dXJuIGh9ZnVuY3Rpb24gYW0yKGYscSxyLGUsbyxhKXt2YXIgaz1xJjMyNzY3LHA9cT4+MTU7d2hpbGUoLS1hPj0wKXt2YXIgZD10aGlzW2ZdJjMyNzY3O3ZhciBnPXRoaXNbZisrXT4+MTU7dmFyIGI9cCpkK2cqaztkPWsqZCsoKGImMzI3NjcpPDwxNSkrcltlXSsobyYxMDczNzQxODIzKTtvPShkPj4+MzApKyhiPj4+MTUpK3AqZysobz4+PjMwKTtyW2UrK109ZCYxMDczNzQxODIzfXJldHVybiBvfWZ1bmN0aW9uIGFtMyhmLHEscixlLG8sYSl7dmFyIGs9cSYxNjM4MyxwPXE+PjE0O3doaWxlKC0tYT49MCl7dmFyIGQ9dGhpc1tmXSYxNjM4Mzt2YXIgZz10aGlzW2YrK10+PjE0O3ZhciBiPXAqZCtnKms7ZD1rKmQrKChiJjE2MzgzKTw8MTQpK3JbZV0rbztvPShkPj4yOCkrKGI+PjE0KStwKmc7cltlKytdPWQmMjY4NDM1NDU1fXJldHVybiBvfWlmKGpfbG0mJihuYXZpZ2F0b3IuYXBwTmFtZT09XCJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXJcIikpe0JpZ0ludGVnZXIucHJvdG90eXBlLmFtPWFtMjtkYml0cz0zMH1lbHNle2lmKGpfbG0mJihuYXZpZ2F0b3IuYXBwTmFtZSE9XCJOZXRzY2FwZVwiKSl7QmlnSW50ZWdlci5wcm90b3R5cGUuYW09YW0xO2RiaXRzPTI2fWVsc2V7QmlnSW50ZWdlci5wcm90b3R5cGUuYW09YW0zO2RiaXRzPTI4fX1CaWdJbnRlZ2VyLnByb3RvdHlwZS5EQj1kYml0cztCaWdJbnRlZ2VyLnByb3RvdHlwZS5ETT0oKDE8PGRiaXRzKS0xKTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5EVj0oMTw8ZGJpdHMpO3ZhciBCSV9GUD01MjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5GVj1NYXRoLnBvdygyLEJJX0ZQKTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5GMT1CSV9GUC1kYml0cztCaWdJbnRlZ2VyLnByb3RvdHlwZS5GMj0yKmRiaXRzLUJJX0ZQO3ZhciBCSV9STT1cIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiO3ZhciBCSV9SQz1uZXcgQXJyYXkoKTt2YXIgcnIsdnY7cnI9XCIwXCIuY2hhckNvZGVBdCgwKTtmb3IodnY9MDt2djw9OTsrK3Z2KXtCSV9SQ1tycisrXT12dn1ycj1cImFcIi5jaGFyQ29kZUF0KDApO2Zvcih2dj0xMDt2djwzNjsrK3Z2KXtCSV9SQ1tycisrXT12dn1ycj1cIkFcIi5jaGFyQ29kZUF0KDApO2Zvcih2dj0xMDt2djwzNjsrK3Z2KXtCSV9SQ1tycisrXT12dn1mdW5jdGlvbiBpbnQyY2hhcihhKXtyZXR1cm4gQklfUk0uY2hhckF0KGEpfWZ1bmN0aW9uIGludEF0KGIsYSl7dmFyIGQ9QklfUkNbYi5jaGFyQ29kZUF0KGEpXTtyZXR1cm4oZD09bnVsbCk/LTE6ZH1mdW5jdGlvbiBibnBDb3B5VG8oYil7Zm9yKHZhciBhPXRoaXMudC0xO2E+PTA7LS1hKXtiW2FdPXRoaXNbYV19Yi50PXRoaXMudDtiLnM9dGhpcy5zfWZ1bmN0aW9uIGJucEZyb21JbnQoYSl7dGhpcy50PTE7dGhpcy5zPShhPDApPy0xOjA7aWYoYT4wKXt0aGlzWzBdPWF9ZWxzZXtpZihhPC0xKXt0aGlzWzBdPWErdGhpcy5EVn1lbHNle3RoaXMudD0wfX19ZnVuY3Rpb24gbmJ2KGEpe3ZhciBiPW5iaSgpO2IuZnJvbUludChhKTtyZXR1cm4gYn1mdW5jdGlvbiBibnBGcm9tU3RyaW5nKGgsYyl7dmFyIGU7aWYoYz09MTYpe2U9NH1lbHNle2lmKGM9PTgpe2U9M31lbHNle2lmKGM9PTI1Nil7ZT04fWVsc2V7aWYoYz09Mil7ZT0xfWVsc2V7aWYoYz09MzIpe2U9NX1lbHNle2lmKGM9PTQpe2U9Mn1lbHNle3RoaXMuZnJvbVJhZGl4KGgsYyk7cmV0dXJufX19fX19dGhpcy50PTA7dGhpcy5zPTA7dmFyIGc9aC5sZW5ndGgsZD1mYWxzZSxmPTA7d2hpbGUoLS1nPj0wKXt2YXIgYT0oZT09OCk/aFtnXSYyNTU6aW50QXQoaCxnKTtpZihhPDApe2lmKGguY2hhckF0KGcpPT1cIi1cIil7ZD10cnVlfWNvbnRpbnVlfWQ9ZmFsc2U7aWYoZj09MCl7dGhpc1t0aGlzLnQrK109YX1lbHNle2lmKGYrZT50aGlzLkRCKXt0aGlzW3RoaXMudC0xXXw9KGEmKCgxPDwodGhpcy5EQi1mKSktMSkpPDxmO3RoaXNbdGhpcy50KytdPShhPj4odGhpcy5EQi1mKSl9ZWxzZXt0aGlzW3RoaXMudC0xXXw9YTw8Zn19Zis9ZTtpZihmPj10aGlzLkRCKXtmLT10aGlzLkRCfX1pZihlPT04JiYoaFswXSYxMjgpIT0wKXt0aGlzLnM9LTE7aWYoZj4wKXt0aGlzW3RoaXMudC0xXXw9KCgxPDwodGhpcy5EQi1mKSktMSk8PGZ9fXRoaXMuY2xhbXAoKTtpZihkKXtCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyx0aGlzKX19ZnVuY3Rpb24gYm5wQ2xhbXAoKXt2YXIgYT10aGlzLnMmdGhpcy5ETTt3aGlsZSh0aGlzLnQ+MCYmdGhpc1t0aGlzLnQtMV09PWEpey0tdGhpcy50fX1mdW5jdGlvbiBiblRvU3RyaW5nKGMpe2lmKHRoaXMuczwwKXtyZXR1cm5cIi1cIit0aGlzLm5lZ2F0ZSgpLnRvU3RyaW5nKGMpfXZhciBlO2lmKGM9PTE2KXtlPTR9ZWxzZXtpZihjPT04KXtlPTN9ZWxzZXtpZihjPT0yKXtlPTF9ZWxzZXtpZihjPT0zMil7ZT01fWVsc2V7aWYoYz09NCl7ZT0yfWVsc2V7cmV0dXJuIHRoaXMudG9SYWRpeChjKX19fX19dmFyIGc9KDE8PGUpLTEsbCxhPWZhbHNlLGg9XCJcIixmPXRoaXMudDt2YXIgaj10aGlzLkRCLShmKnRoaXMuREIpJWU7aWYoZi0tPjApe2lmKGo8dGhpcy5EQiYmKGw9dGhpc1tmXT4+aik+MCl7YT10cnVlO2g9aW50MmNoYXIobCl9d2hpbGUoZj49MCl7aWYoajxlKXtsPSh0aGlzW2ZdJigoMTw8aiktMSkpPDwoZS1qKTtsfD10aGlzWy0tZl0+PihqKz10aGlzLkRCLWUpfWVsc2V7bD0odGhpc1tmXT4+KGotPWUpKSZnO2lmKGo8PTApe2orPXRoaXMuREI7LS1mfX1pZihsPjApe2E9dHJ1ZX1pZihhKXtoKz1pbnQyY2hhcihsKX19fXJldHVybiBhP2g6XCIwXCJ9ZnVuY3Rpb24gYm5OZWdhdGUoKXt2YXIgYT1uYmkoKTtCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyxhKTtyZXR1cm4gYX1mdW5jdGlvbiBibkFicygpe3JldHVybih0aGlzLnM8MCk/dGhpcy5uZWdhdGUoKTp0aGlzfWZ1bmN0aW9uIGJuQ29tcGFyZVRvKGIpe3ZhciBkPXRoaXMucy1iLnM7aWYoZCE9MCl7cmV0dXJuIGR9dmFyIGM9dGhpcy50O2Q9Yy1iLnQ7aWYoZCE9MCl7cmV0dXJuKHRoaXMuczwwKT8tZDpkfXdoaWxlKC0tYz49MCl7aWYoKGQ9dGhpc1tjXS1iW2NdKSE9MCl7cmV0dXJuIGR9fXJldHVybiAwfWZ1bmN0aW9uIG5iaXRzKGEpe3ZhciBjPTEsYjtpZigoYj1hPj4+MTYpIT0wKXthPWI7Yys9MTZ9aWYoKGI9YT4+OCkhPTApe2E9YjtjKz04fWlmKChiPWE+PjQpIT0wKXthPWI7Yys9NH1pZigoYj1hPj4yKSE9MCl7YT1iO2MrPTJ9aWYoKGI9YT4+MSkhPTApe2E9YjtjKz0xfXJldHVybiBjfWZ1bmN0aW9uIGJuQml0TGVuZ3RoKCl7aWYodGhpcy50PD0wKXtyZXR1cm4gMH1yZXR1cm4gdGhpcy5EQioodGhpcy50LTEpK25iaXRzKHRoaXNbdGhpcy50LTFdXih0aGlzLnMmdGhpcy5ETSkpfWZ1bmN0aW9uIGJucERMU2hpZnRUbyhjLGIpe3ZhciBhO2ZvcihhPXRoaXMudC0xO2E+PTA7LS1hKXtiW2ErY109dGhpc1thXX1mb3IoYT1jLTE7YT49MDstLWEpe2JbYV09MH1iLnQ9dGhpcy50K2M7Yi5zPXRoaXMuc31mdW5jdGlvbiBibnBEUlNoaWZ0VG8oYyxiKXtmb3IodmFyIGE9YzthPHRoaXMudDsrK2Epe2JbYS1jXT10aGlzW2FdfWIudD1NYXRoLm1heCh0aGlzLnQtYywwKTtiLnM9dGhpcy5zfWZ1bmN0aW9uIGJucExTaGlmdFRvKGosZSl7dmFyIGI9aiV0aGlzLkRCO3ZhciBhPXRoaXMuREItYjt2YXIgZz0oMTw8YSktMTt2YXIgZj1NYXRoLmZsb29yKGovdGhpcy5EQiksaD0odGhpcy5zPDxiKSZ0aGlzLkRNLGQ7Zm9yKGQ9dGhpcy50LTE7ZD49MDstLWQpe2VbZCtmKzFdPSh0aGlzW2RdPj5hKXxoO2g9KHRoaXNbZF0mZyk8PGJ9Zm9yKGQ9Zi0xO2Q+PTA7LS1kKXtlW2RdPTB9ZVtmXT1oO2UudD10aGlzLnQrZisxO2Uucz10aGlzLnM7ZS5jbGFtcCgpfWZ1bmN0aW9uIGJucFJTaGlmdFRvKGcsZCl7ZC5zPXRoaXMuczt2YXIgZT1NYXRoLmZsb29yKGcvdGhpcy5EQik7aWYoZT49dGhpcy50KXtkLnQ9MDtyZXR1cm59dmFyIGI9ZyV0aGlzLkRCO3ZhciBhPXRoaXMuREItYjt2YXIgZj0oMTw8YiktMTtkWzBdPXRoaXNbZV0+PmI7Zm9yKHZhciBjPWUrMTtjPHRoaXMudDsrK2Mpe2RbYy1lLTFdfD0odGhpc1tjXSZmKTw8YTtkW2MtZV09dGhpc1tjXT4+Yn1pZihiPjApe2RbdGhpcy50LWUtMV18PSh0aGlzLnMmZik8PGF9ZC50PXRoaXMudC1lO2QuY2xhbXAoKX1mdW5jdGlvbiBibnBTdWJUbyhkLGYpe3ZhciBlPTAsZz0wLGI9TWF0aC5taW4oZC50LHRoaXMudCk7d2hpbGUoZTxiKXtnKz10aGlzW2VdLWRbZV07ZltlKytdPWcmdGhpcy5ETTtnPj49dGhpcy5EQn1pZihkLnQ8dGhpcy50KXtnLT1kLnM7d2hpbGUoZTx0aGlzLnQpe2crPXRoaXNbZV07ZltlKytdPWcmdGhpcy5ETTtnPj49dGhpcy5EQn1nKz10aGlzLnN9ZWxzZXtnKz10aGlzLnM7d2hpbGUoZTxkLnQpe2ctPWRbZV07ZltlKytdPWcmdGhpcy5ETTtnPj49dGhpcy5EQn1nLT1kLnN9Zi5zPShnPDApPy0xOjA7aWYoZzwtMSl7ZltlKytdPXRoaXMuRFYrZ31lbHNle2lmKGc+MCl7ZltlKytdPWd9fWYudD1lO2YuY2xhbXAoKX1mdW5jdGlvbiBibnBNdWx0aXBseVRvKGMsZSl7dmFyIGI9dGhpcy5hYnMoKSxmPWMuYWJzKCk7dmFyIGQ9Yi50O2UudD1kK2YudDt3aGlsZSgtLWQ+PTApe2VbZF09MH1mb3IoZD0wO2Q8Zi50OysrZCl7ZVtkK2IudF09Yi5hbSgwLGZbZF0sZSxkLDAsYi50KX1lLnM9MDtlLmNsYW1wKCk7aWYodGhpcy5zIT1jLnMpe0JpZ0ludGVnZXIuWkVSTy5zdWJUbyhlLGUpfX1mdW5jdGlvbiBibnBTcXVhcmVUbyhkKXt2YXIgYT10aGlzLmFicygpO3ZhciBiPWQudD0yKmEudDt3aGlsZSgtLWI+PTApe2RbYl09MH1mb3IoYj0wO2I8YS50LTE7KytiKXt2YXIgZT1hLmFtKGIsYVtiXSxkLDIqYiwwLDEpO2lmKChkW2IrYS50XSs9YS5hbShiKzEsMiphW2JdLGQsMipiKzEsZSxhLnQtYi0xKSk+PWEuRFYpe2RbYithLnRdLT1hLkRWO2RbYithLnQrMV09MX19aWYoZC50PjApe2RbZC50LTFdKz1hLmFtKGIsYVtiXSxkLDIqYiwwLDEpfWQucz0wO2QuY2xhbXAoKX1mdW5jdGlvbiBibnBEaXZSZW1UbyhuLGgsZyl7dmFyIHc9bi5hYnMoKTtpZih3LnQ8PTApe3JldHVybn12YXIgaz10aGlzLmFicygpO2lmKGsudDx3LnQpe2lmKGghPW51bGwpe2guZnJvbUludCgwKX1pZihnIT1udWxsKXt0aGlzLmNvcHlUbyhnKX1yZXR1cm59aWYoZz09bnVsbCl7Zz1uYmkoKX12YXIgZD1uYmkoKSxhPXRoaXMucyxsPW4uczt2YXIgdj10aGlzLkRCLW5iaXRzKHdbdy50LTFdKTtpZih2PjApe3cubFNoaWZ0VG8odixkKTtrLmxTaGlmdFRvKHYsZyl9ZWxzZXt3LmNvcHlUbyhkKTtrLmNvcHlUbyhnKX12YXIgcD1kLnQ7dmFyIGI9ZFtwLTFdO2lmKGI9PTApe3JldHVybn12YXIgbz1iKigxPDx0aGlzLkYxKSsoKHA+MSk/ZFtwLTJdPj50aGlzLkYyOjApO3ZhciBBPXRoaXMuRlYvbyx6PSgxPDx0aGlzLkYxKS9vLHg9MTw8dGhpcy5GMjt2YXIgdT1nLnQscz11LXAsZj0oaD09bnVsbCk/bmJpKCk6aDtkLmRsU2hpZnRUbyhzLGYpO2lmKGcuY29tcGFyZVRvKGYpPj0wKXtnW2cudCsrXT0xO2cuc3ViVG8oZixnKX1CaWdJbnRlZ2VyLk9ORS5kbFNoaWZ0VG8ocCxmKTtmLnN1YlRvKGQsZCk7d2hpbGUoZC50PHApe2RbZC50KytdPTB9d2hpbGUoLS1zPj0wKXt2YXIgYz0oZ1stLXVdPT1iKT90aGlzLkRNOk1hdGguZmxvb3IoZ1t1XSpBKyhnW3UtMV0reCkqeik7aWYoKGdbdV0rPWQuYW0oMCxjLGcscywwLHApKTxjKXtkLmRsU2hpZnRUbyhzLGYpO2cuc3ViVG8oZixnKTt3aGlsZShnW3VdPC0tYyl7Zy5zdWJUbyhmLGcpfX19aWYoaCE9bnVsbCl7Zy5kclNoaWZ0VG8ocCxoKTtpZihhIT1sKXtCaWdJbnRlZ2VyLlpFUk8uc3ViVG8oaCxoKX19Zy50PXA7Zy5jbGFtcCgpO2lmKHY+MCl7Zy5yU2hpZnRUbyh2LGcpfWlmKGE8MCl7QmlnSW50ZWdlci5aRVJPLnN1YlRvKGcsZyl9fWZ1bmN0aW9uIGJuTW9kKGIpe3ZhciBjPW5iaSgpO3RoaXMuYWJzKCkuZGl2UmVtVG8oYixudWxsLGMpO2lmKHRoaXMuczwwJiZjLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pPjApe2Iuc3ViVG8oYyxjKX1yZXR1cm4gY31mdW5jdGlvbiBDbGFzc2ljKGEpe3RoaXMubT1hfWZ1bmN0aW9uIGNDb252ZXJ0KGEpe2lmKGEuczwwfHxhLmNvbXBhcmVUbyh0aGlzLm0pPj0wKXtyZXR1cm4gYS5tb2QodGhpcy5tKX1lbHNle3JldHVybiBhfX1mdW5jdGlvbiBjUmV2ZXJ0KGEpe3JldHVybiBhfWZ1bmN0aW9uIGNSZWR1Y2UoYSl7YS5kaXZSZW1Ubyh0aGlzLm0sbnVsbCxhKX1mdW5jdGlvbiBjTXVsVG8oYSxjLGIpe2EubXVsdGlwbHlUbyhjLGIpO3RoaXMucmVkdWNlKGIpfWZ1bmN0aW9uIGNTcXJUbyhhLGIpe2Euc3F1YXJlVG8oYik7dGhpcy5yZWR1Y2UoYil9Q2xhc3NpYy5wcm90b3R5cGUuY29udmVydD1jQ29udmVydDtDbGFzc2ljLnByb3RvdHlwZS5yZXZlcnQ9Y1JldmVydDtDbGFzc2ljLnByb3RvdHlwZS5yZWR1Y2U9Y1JlZHVjZTtDbGFzc2ljLnByb3RvdHlwZS5tdWxUbz1jTXVsVG87Q2xhc3NpYy5wcm90b3R5cGUuc3FyVG89Y1NxclRvO2Z1bmN0aW9uIGJucEludkRpZ2l0KCl7aWYodGhpcy50PDEpe3JldHVybiAwfXZhciBhPXRoaXNbMF07aWYoKGEmMSk9PTApe3JldHVybiAwfXZhciBiPWEmMztiPShiKigyLShhJjE1KSpiKSkmMTU7Yj0oYiooMi0oYSYyNTUpKmIpKSYyNTU7Yj0oYiooMi0oKChhJjY1NTM1KSpiKSY2NTUzNSkpKSY2NTUzNTtiPShiKigyLWEqYiV0aGlzLkRWKSkldGhpcy5EVjtyZXR1cm4oYj4wKT90aGlzLkRWLWI6LWJ9ZnVuY3Rpb24gTW9udGdvbWVyeShhKXt0aGlzLm09YTt0aGlzLm1wPWEuaW52RGlnaXQoKTt0aGlzLm1wbD10aGlzLm1wJjMyNzY3O3RoaXMubXBoPXRoaXMubXA+PjE1O3RoaXMudW09KDE8PChhLkRCLTE1KSktMTt0aGlzLm10Mj0yKmEudH1mdW5jdGlvbiBtb250Q29udmVydChhKXt2YXIgYj1uYmkoKTthLmFicygpLmRsU2hpZnRUbyh0aGlzLm0udCxiKTtiLmRpdlJlbVRvKHRoaXMubSxudWxsLGIpO2lmKGEuczwwJiZiLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pPjApe3RoaXMubS5zdWJUbyhiLGIpfXJldHVybiBifWZ1bmN0aW9uIG1vbnRSZXZlcnQoYSl7dmFyIGI9bmJpKCk7YS5jb3B5VG8oYik7dGhpcy5yZWR1Y2UoYik7cmV0dXJuIGJ9ZnVuY3Rpb24gbW9udFJlZHVjZShhKXt3aGlsZShhLnQ8PXRoaXMubXQyKXthW2EudCsrXT0wfWZvcih2YXIgYz0wO2M8dGhpcy5tLnQ7KytjKXt2YXIgYj1hW2NdJjMyNzY3O3ZhciBkPShiKnRoaXMubXBsKygoKGIqdGhpcy5tcGgrKGFbY10+PjE1KSp0aGlzLm1wbCkmdGhpcy51bSk8PDE1KSkmYS5ETTtiPWMrdGhpcy5tLnQ7YVtiXSs9dGhpcy5tLmFtKDAsZCxhLGMsMCx0aGlzLm0udCk7d2hpbGUoYVtiXT49YS5EVil7YVtiXS09YS5EVjthWysrYl0rK319YS5jbGFtcCgpO2EuZHJTaGlmdFRvKHRoaXMubS50LGEpO2lmKGEuY29tcGFyZVRvKHRoaXMubSk+PTApe2Euc3ViVG8odGhpcy5tLGEpfX1mdW5jdGlvbiBtb250U3FyVG8oYSxiKXthLnNxdWFyZVRvKGIpO3RoaXMucmVkdWNlKGIpfWZ1bmN0aW9uIG1vbnRNdWxUbyhhLGMsYil7YS5tdWx0aXBseVRvKGMsYik7dGhpcy5yZWR1Y2UoYil9TW9udGdvbWVyeS5wcm90b3R5cGUuY29udmVydD1tb250Q29udmVydDtNb250Z29tZXJ5LnByb3RvdHlwZS5yZXZlcnQ9bW9udFJldmVydDtNb250Z29tZXJ5LnByb3RvdHlwZS5yZWR1Y2U9bW9udFJlZHVjZTtNb250Z29tZXJ5LnByb3RvdHlwZS5tdWxUbz1tb250TXVsVG87TW9udGdvbWVyeS5wcm90b3R5cGUuc3FyVG89bW9udFNxclRvO2Z1bmN0aW9uIGJucElzRXZlbigpe3JldHVybigodGhpcy50PjApPyh0aGlzWzBdJjEpOnRoaXMucyk9PTB9ZnVuY3Rpb24gYm5wRXhwKGgsail7aWYoaD40Mjk0OTY3Mjk1fHxoPDEpe3JldHVybiBCaWdJbnRlZ2VyLk9ORX12YXIgZj1uYmkoKSxhPW5iaSgpLGQ9ai5jb252ZXJ0KHRoaXMpLGM9bmJpdHMoaCktMTtkLmNvcHlUbyhmKTt3aGlsZSgtLWM+PTApe2ouc3FyVG8oZixhKTtpZigoaCYoMTw8YykpPjApe2oubXVsVG8oYSxkLGYpfWVsc2V7dmFyIGI9ZjtmPWE7YT1ifX1yZXR1cm4gai5yZXZlcnQoZil9ZnVuY3Rpb24gYm5Nb2RQb3dJbnQoYixhKXt2YXIgYztpZihiPDI1Nnx8YS5pc0V2ZW4oKSl7Yz1uZXcgQ2xhc3NpYyhhKX1lbHNle2M9bmV3IE1vbnRnb21lcnkoYSl9cmV0dXJuIHRoaXMuZXhwKGIsYyl9QmlnSW50ZWdlci5wcm90b3R5cGUuY29weVRvPWJucENvcHlUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tSW50PWJucEZyb21JbnQ7QmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbVN0cmluZz1ibnBGcm9tU3RyaW5nO0JpZ0ludGVnZXIucHJvdG90eXBlLmNsYW1wPWJucENsYW1wO0JpZ0ludGVnZXIucHJvdG90eXBlLmRsU2hpZnRUbz1ibnBETFNoaWZ0VG87QmlnSW50ZWdlci5wcm90b3R5cGUuZHJTaGlmdFRvPWJucERSU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5sU2hpZnRUbz1ibnBMU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5yU2hpZnRUbz1ibnBSU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5zdWJUbz1ibnBTdWJUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseVRvPWJucE11bHRpcGx5VG87QmlnSW50ZWdlci5wcm90b3R5cGUuc3F1YXJlVG89Ym5wU3F1YXJlVG87QmlnSW50ZWdlci5wcm90b3R5cGUuZGl2UmVtVG89Ym5wRGl2UmVtVG87QmlnSW50ZWdlci5wcm90b3R5cGUuaW52RGlnaXQ9Ym5wSW52RGlnaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuaXNFdmVuPWJucElzRXZlbjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5leHA9Ym5wRXhwO0JpZ0ludGVnZXIucHJvdG90eXBlLnRvU3RyaW5nPWJuVG9TdHJpbmc7QmlnSW50ZWdlci5wcm90b3R5cGUubmVnYXRlPWJuTmVnYXRlO0JpZ0ludGVnZXIucHJvdG90eXBlLmFicz1ibkFicztCaWdJbnRlZ2VyLnByb3RvdHlwZS5jb21wYXJlVG89Ym5Db21wYXJlVG87QmlnSW50ZWdlci5wcm90b3R5cGUuYml0TGVuZ3RoPWJuQml0TGVuZ3RoO0JpZ0ludGVnZXIucHJvdG90eXBlLm1vZD1ibk1vZDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RQb3dJbnQ9Ym5Nb2RQb3dJbnQ7QmlnSW50ZWdlci5aRVJPPW5idigwKTtCaWdJbnRlZ2VyLk9ORT1uYnYoMSk7XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cclxuICovXHJcbmZ1bmN0aW9uIGJuQ2xvbmUoKXt2YXIgYT1uYmkoKTt0aGlzLmNvcHlUbyhhKTtyZXR1cm4gYX1mdW5jdGlvbiBibkludFZhbHVlKCl7aWYodGhpcy5zPDApe2lmKHRoaXMudD09MSl7cmV0dXJuIHRoaXNbMF0tdGhpcy5EVn1lbHNle2lmKHRoaXMudD09MCl7cmV0dXJuIC0xfX19ZWxzZXtpZih0aGlzLnQ9PTEpe3JldHVybiB0aGlzWzBdfWVsc2V7aWYodGhpcy50PT0wKXtyZXR1cm4gMH19fXJldHVybigodGhpc1sxXSYoKDE8PCgzMi10aGlzLkRCKSktMSkpPDx0aGlzLkRCKXx0aGlzWzBdfWZ1bmN0aW9uIGJuQnl0ZVZhbHVlKCl7cmV0dXJuKHRoaXMudD09MCk/dGhpcy5zOih0aGlzWzBdPDwyNCk+PjI0fWZ1bmN0aW9uIGJuU2hvcnRWYWx1ZSgpe3JldHVybih0aGlzLnQ9PTApP3RoaXMuczoodGhpc1swXTw8MTYpPj4xNn1mdW5jdGlvbiBibnBDaHVua1NpemUoYSl7cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5MTjIqdGhpcy5EQi9NYXRoLmxvZyhhKSl9ZnVuY3Rpb24gYm5TaWdOdW0oKXtpZih0aGlzLnM8MCl7cmV0dXJuIC0xfWVsc2V7aWYodGhpcy50PD0wfHwodGhpcy50PT0xJiZ0aGlzWzBdPD0wKSl7cmV0dXJuIDB9ZWxzZXtyZXR1cm4gMX19fWZ1bmN0aW9uIGJucFRvUmFkaXgoYyl7aWYoYz09bnVsbCl7Yz0xMH1pZih0aGlzLnNpZ251bSgpPT0wfHxjPDJ8fGM+MzYpe3JldHVyblwiMFwifXZhciBmPXRoaXMuY2h1bmtTaXplKGMpO3ZhciBlPU1hdGgucG93KGMsZik7dmFyIGk9bmJ2KGUpLGo9bmJpKCksaD1uYmkoKSxnPVwiXCI7dGhpcy5kaXZSZW1UbyhpLGosaCk7d2hpbGUoai5zaWdudW0oKT4wKXtnPShlK2guaW50VmFsdWUoKSkudG9TdHJpbmcoYykuc3Vic3RyKDEpK2c7ai5kaXZSZW1UbyhpLGosaCl9cmV0dXJuIGguaW50VmFsdWUoKS50b1N0cmluZyhjKStnfWZ1bmN0aW9uIGJucEZyb21SYWRpeChtLGgpe3RoaXMuZnJvbUludCgwKTtpZihoPT1udWxsKXtoPTEwfXZhciBmPXRoaXMuY2h1bmtTaXplKGgpO3ZhciBnPU1hdGgucG93KGgsZiksZT1mYWxzZSxhPTAsbD0wO2Zvcih2YXIgYz0wO2M8bS5sZW5ndGg7KytjKXt2YXIgaz1pbnRBdChtLGMpO2lmKGs8MCl7aWYobS5jaGFyQXQoYyk9PVwiLVwiJiZ0aGlzLnNpZ251bSgpPT0wKXtlPXRydWV9Y29udGludWV9bD1oKmwraztpZigrK2E+PWYpe3RoaXMuZE11bHRpcGx5KGcpO3RoaXMuZEFkZE9mZnNldChsLDApO2E9MDtsPTB9fWlmKGE+MCl7dGhpcy5kTXVsdGlwbHkoTWF0aC5wb3coaCxhKSk7dGhpcy5kQWRkT2Zmc2V0KGwsMCl9aWYoZSl7QmlnSW50ZWdlci5aRVJPLnN1YlRvKHRoaXMsdGhpcyl9fWZ1bmN0aW9uIGJucEZyb21OdW1iZXIoZixlLGgpe2lmKFwibnVtYmVyXCI9PXR5cGVvZiBlKXtpZihmPDIpe3RoaXMuZnJvbUludCgxKX1lbHNle3RoaXMuZnJvbU51bWJlcihmLGgpO2lmKCF0aGlzLnRlc3RCaXQoZi0xKSl7dGhpcy5iaXR3aXNlVG8oQmlnSW50ZWdlci5PTkUuc2hpZnRMZWZ0KGYtMSksb3Bfb3IsdGhpcyl9aWYodGhpcy5pc0V2ZW4oKSl7dGhpcy5kQWRkT2Zmc2V0KDEsMCl9d2hpbGUoIXRoaXMuaXNQcm9iYWJsZVByaW1lKGUpKXt0aGlzLmRBZGRPZmZzZXQoMiwwKTtpZih0aGlzLmJpdExlbmd0aCgpPmYpe3RoaXMuc3ViVG8oQmlnSW50ZWdlci5PTkUuc2hpZnRMZWZ0KGYtMSksdGhpcyl9fX19ZWxzZXt2YXIgZD1uZXcgQXJyYXkoKSxnPWYmNztkLmxlbmd0aD0oZj4+MykrMTtlLm5leHRCeXRlcyhkKTtpZihnPjApe2RbMF0mPSgoMTw8ZyktMSl9ZWxzZXtkWzBdPTB9dGhpcy5mcm9tU3RyaW5nKGQsMjU2KX19ZnVuY3Rpb24gYm5Ub0J5dGVBcnJheSgpe3ZhciBiPXRoaXMudCxjPW5ldyBBcnJheSgpO2NbMF09dGhpcy5zO3ZhciBlPXRoaXMuREItKGIqdGhpcy5EQiklOCxmLGE9MDtpZihiLS0+MCl7aWYoZTx0aGlzLkRCJiYoZj10aGlzW2JdPj5lKSE9KHRoaXMucyZ0aGlzLkRNKT4+ZSl7Y1thKytdPWZ8KHRoaXMuczw8KHRoaXMuREItZSkpfXdoaWxlKGI+PTApe2lmKGU8OCl7Zj0odGhpc1tiXSYoKDE8PGUpLTEpKTw8KDgtZSk7Znw9dGhpc1stLWJdPj4oZSs9dGhpcy5EQi04KX1lbHNle2Y9KHRoaXNbYl0+PihlLT04KSkmMjU1O2lmKGU8PTApe2UrPXRoaXMuREI7LS1ifX1pZigoZiYxMjgpIT0wKXtmfD0tMjU2fWlmKGE9PTAmJih0aGlzLnMmMTI4KSE9KGYmMTI4KSl7KythfWlmKGE+MHx8ZiE9dGhpcy5zKXtjW2ErK109Zn19fXJldHVybiBjfWZ1bmN0aW9uIGJuRXF1YWxzKGIpe3JldHVybih0aGlzLmNvbXBhcmVUbyhiKT09MCl9ZnVuY3Rpb24gYm5NaW4oYil7cmV0dXJuKHRoaXMuY29tcGFyZVRvKGIpPDApP3RoaXM6Yn1mdW5jdGlvbiBibk1heChiKXtyZXR1cm4odGhpcy5jb21wYXJlVG8oYik+MCk/dGhpczpifWZ1bmN0aW9uIGJucEJpdHdpc2VUbyhjLGgsZSl7dmFyIGQsZyxiPU1hdGgubWluKGMudCx0aGlzLnQpO2ZvcihkPTA7ZDxiOysrZCl7ZVtkXT1oKHRoaXNbZF0sY1tkXSl9aWYoYy50PHRoaXMudCl7Zz1jLnMmdGhpcy5ETTtmb3IoZD1iO2Q8dGhpcy50OysrZCl7ZVtkXT1oKHRoaXNbZF0sZyl9ZS50PXRoaXMudH1lbHNle2c9dGhpcy5zJnRoaXMuRE07Zm9yKGQ9YjtkPGMudDsrK2Qpe2VbZF09aChnLGNbZF0pfWUudD1jLnR9ZS5zPWgodGhpcy5zLGMucyk7ZS5jbGFtcCgpfWZ1bmN0aW9uIG9wX2FuZChhLGIpe3JldHVybiBhJmJ9ZnVuY3Rpb24gYm5BbmQoYil7dmFyIGM9bmJpKCk7dGhpcy5iaXR3aXNlVG8oYixvcF9hbmQsYyk7cmV0dXJuIGN9ZnVuY3Rpb24gb3Bfb3IoYSxiKXtyZXR1cm4gYXxifWZ1bmN0aW9uIGJuT3IoYil7dmFyIGM9bmJpKCk7dGhpcy5iaXR3aXNlVG8oYixvcF9vcixjKTtyZXR1cm4gY31mdW5jdGlvbiBvcF94b3IoYSxiKXtyZXR1cm4gYV5ifWZ1bmN0aW9uIGJuWG9yKGIpe3ZhciBjPW5iaSgpO3RoaXMuYml0d2lzZVRvKGIsb3BfeG9yLGMpO3JldHVybiBjfWZ1bmN0aW9uIG9wX2FuZG5vdChhLGIpe3JldHVybiBhJn5ifWZ1bmN0aW9uIGJuQW5kTm90KGIpe3ZhciBjPW5iaSgpO3RoaXMuYml0d2lzZVRvKGIsb3BfYW5kbm90LGMpO3JldHVybiBjfWZ1bmN0aW9uIGJuTm90KCl7dmFyIGI9bmJpKCk7Zm9yKHZhciBhPTA7YTx0aGlzLnQ7KythKXtiW2FdPXRoaXMuRE0mfnRoaXNbYV19Yi50PXRoaXMudDtiLnM9fnRoaXMucztyZXR1cm4gYn1mdW5jdGlvbiBiblNoaWZ0TGVmdChiKXt2YXIgYT1uYmkoKTtpZihiPDApe3RoaXMuclNoaWZ0VG8oLWIsYSl9ZWxzZXt0aGlzLmxTaGlmdFRvKGIsYSl9cmV0dXJuIGF9ZnVuY3Rpb24gYm5TaGlmdFJpZ2h0KGIpe3ZhciBhPW5iaSgpO2lmKGI8MCl7dGhpcy5sU2hpZnRUbygtYixhKX1lbHNle3RoaXMuclNoaWZ0VG8oYixhKX1yZXR1cm4gYX1mdW5jdGlvbiBsYml0KGEpe2lmKGE9PTApe3JldHVybiAtMX12YXIgYj0wO2lmKChhJjY1NTM1KT09MCl7YT4+PTE2O2IrPTE2fWlmKChhJjI1NSk9PTApe2E+Pj04O2IrPTh9aWYoKGEmMTUpPT0wKXthPj49NDtiKz00fWlmKChhJjMpPT0wKXthPj49MjtiKz0yfWlmKChhJjEpPT0wKXsrK2J9cmV0dXJuIGJ9ZnVuY3Rpb24gYm5HZXRMb3dlc3RTZXRCaXQoKXtmb3IodmFyIGE9MDthPHRoaXMudDsrK2Epe2lmKHRoaXNbYV0hPTApe3JldHVybiBhKnRoaXMuREIrbGJpdCh0aGlzW2FdKX19aWYodGhpcy5zPDApe3JldHVybiB0aGlzLnQqdGhpcy5EQn1yZXR1cm4gLTF9ZnVuY3Rpb24gY2JpdChhKXt2YXIgYj0wO3doaWxlKGEhPTApe2EmPWEtMTsrK2J9cmV0dXJuIGJ9ZnVuY3Rpb24gYm5CaXRDb3VudCgpe3ZhciBjPTAsYT10aGlzLnMmdGhpcy5ETTtmb3IodmFyIGI9MDtiPHRoaXMudDsrK2Ipe2MrPWNiaXQodGhpc1tiXV5hKX1yZXR1cm4gY31mdW5jdGlvbiBiblRlc3RCaXQoYil7dmFyIGE9TWF0aC5mbG9vcihiL3RoaXMuREIpO2lmKGE+PXRoaXMudCl7cmV0dXJuKHRoaXMucyE9MCl9cmV0dXJuKCh0aGlzW2FdJigxPDwoYiV0aGlzLkRCKSkpIT0wKX1mdW5jdGlvbiBibnBDaGFuZ2VCaXQoYyxiKXt2YXIgYT1CaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQoYyk7dGhpcy5iaXR3aXNlVG8oYSxiLGEpO3JldHVybiBhfWZ1bmN0aW9uIGJuU2V0Qml0KGEpe3JldHVybiB0aGlzLmNoYW5nZUJpdChhLG9wX29yKX1mdW5jdGlvbiBibkNsZWFyQml0KGEpe3JldHVybiB0aGlzLmNoYW5nZUJpdChhLG9wX2FuZG5vdCl9ZnVuY3Rpb24gYm5GbGlwQml0KGEpe3JldHVybiB0aGlzLmNoYW5nZUJpdChhLG9wX3hvcil9ZnVuY3Rpb24gYm5wQWRkVG8oZCxmKXt2YXIgZT0wLGc9MCxiPU1hdGgubWluKGQudCx0aGlzLnQpO3doaWxlKGU8Yil7Zys9dGhpc1tlXStkW2VdO2ZbZSsrXT1nJnRoaXMuRE07Zz4+PXRoaXMuREJ9aWYoZC50PHRoaXMudCl7Zys9ZC5zO3doaWxlKGU8dGhpcy50KXtnKz10aGlzW2VdO2ZbZSsrXT1nJnRoaXMuRE07Zz4+PXRoaXMuREJ9Zys9dGhpcy5zfWVsc2V7Zys9dGhpcy5zO3doaWxlKGU8ZC50KXtnKz1kW2VdO2ZbZSsrXT1nJnRoaXMuRE07Zz4+PXRoaXMuREJ9Zys9ZC5zfWYucz0oZzwwKT8tMTowO2lmKGc+MCl7ZltlKytdPWd9ZWxzZXtpZihnPC0xKXtmW2UrK109dGhpcy5EVitnfX1mLnQ9ZTtmLmNsYW1wKCl9ZnVuY3Rpb24gYm5BZGQoYil7dmFyIGM9bmJpKCk7dGhpcy5hZGRUbyhiLGMpO3JldHVybiBjfWZ1bmN0aW9uIGJuU3VidHJhY3QoYil7dmFyIGM9bmJpKCk7dGhpcy5zdWJUbyhiLGMpO3JldHVybiBjfWZ1bmN0aW9uIGJuTXVsdGlwbHkoYil7dmFyIGM9bmJpKCk7dGhpcy5tdWx0aXBseVRvKGIsYyk7cmV0dXJuIGN9ZnVuY3Rpb24gYm5TcXVhcmUoKXt2YXIgYT1uYmkoKTt0aGlzLnNxdWFyZVRvKGEpO3JldHVybiBhfWZ1bmN0aW9uIGJuRGl2aWRlKGIpe3ZhciBjPW5iaSgpO3RoaXMuZGl2UmVtVG8oYixjLG51bGwpO3JldHVybiBjfWZ1bmN0aW9uIGJuUmVtYWluZGVyKGIpe3ZhciBjPW5iaSgpO3RoaXMuZGl2UmVtVG8oYixudWxsLGMpO3JldHVybiBjfWZ1bmN0aW9uIGJuRGl2aWRlQW5kUmVtYWluZGVyKGIpe3ZhciBkPW5iaSgpLGM9bmJpKCk7dGhpcy5kaXZSZW1UbyhiLGQsYyk7cmV0dXJuIG5ldyBBcnJheShkLGMpfWZ1bmN0aW9uIGJucERNdWx0aXBseShhKXt0aGlzW3RoaXMudF09dGhpcy5hbSgwLGEtMSx0aGlzLDAsMCx0aGlzLnQpOysrdGhpcy50O3RoaXMuY2xhbXAoKX1mdW5jdGlvbiBibnBEQWRkT2Zmc2V0KGIsYSl7aWYoYj09MCl7cmV0dXJufXdoaWxlKHRoaXMudDw9YSl7dGhpc1t0aGlzLnQrK109MH10aGlzW2FdKz1iO3doaWxlKHRoaXNbYV0+PXRoaXMuRFYpe3RoaXNbYV0tPXRoaXMuRFY7aWYoKythPj10aGlzLnQpe3RoaXNbdGhpcy50KytdPTB9Kyt0aGlzW2FdfX1mdW5jdGlvbiBOdWxsRXhwKCl7fWZ1bmN0aW9uIG5Ob3AoYSl7cmV0dXJuIGF9ZnVuY3Rpb24gbk11bFRvKGEsYyxiKXthLm11bHRpcGx5VG8oYyxiKX1mdW5jdGlvbiBuU3FyVG8oYSxiKXthLnNxdWFyZVRvKGIpfU51bGxFeHAucHJvdG90eXBlLmNvbnZlcnQ9bk5vcDtOdWxsRXhwLnByb3RvdHlwZS5yZXZlcnQ9bk5vcDtOdWxsRXhwLnByb3RvdHlwZS5tdWxUbz1uTXVsVG87TnVsbEV4cC5wcm90b3R5cGUuc3FyVG89blNxclRvO2Z1bmN0aW9uIGJuUG93KGEpe3JldHVybiB0aGlzLmV4cChhLG5ldyBOdWxsRXhwKCkpfWZ1bmN0aW9uIGJucE11bHRpcGx5TG93ZXJUbyhiLGYsZSl7dmFyIGQ9TWF0aC5taW4odGhpcy50K2IudCxmKTtlLnM9MDtlLnQ9ZDt3aGlsZShkPjApe2VbLS1kXT0wfXZhciBjO2ZvcihjPWUudC10aGlzLnQ7ZDxjOysrZCl7ZVtkK3RoaXMudF09dGhpcy5hbSgwLGJbZF0sZSxkLDAsdGhpcy50KX1mb3IoYz1NYXRoLm1pbihiLnQsZik7ZDxjOysrZCl7dGhpcy5hbSgwLGJbZF0sZSxkLDAsZi1kKX1lLmNsYW1wKCl9ZnVuY3Rpb24gYm5wTXVsdGlwbHlVcHBlclRvKGIsZSxkKXstLWU7dmFyIGM9ZC50PXRoaXMudCtiLnQtZTtkLnM9MDt3aGlsZSgtLWM+PTApe2RbY109MH1mb3IoYz1NYXRoLm1heChlLXRoaXMudCwwKTtjPGIudDsrK2Mpe2RbdGhpcy50K2MtZV09dGhpcy5hbShlLWMsYltjXSxkLDAsMCx0aGlzLnQrYy1lKX1kLmNsYW1wKCk7ZC5kclNoaWZ0VG8oMSxkKX1mdW5jdGlvbiBCYXJyZXR0KGEpe3RoaXMucjI9bmJpKCk7dGhpcy5xMz1uYmkoKTtCaWdJbnRlZ2VyLk9ORS5kbFNoaWZ0VG8oMiphLnQsdGhpcy5yMik7dGhpcy5tdT10aGlzLnIyLmRpdmlkZShhKTt0aGlzLm09YX1mdW5jdGlvbiBiYXJyZXR0Q29udmVydChhKXtpZihhLnM8MHx8YS50PjIqdGhpcy5tLnQpe3JldHVybiBhLm1vZCh0aGlzLm0pfWVsc2V7aWYoYS5jb21wYXJlVG8odGhpcy5tKTwwKXtyZXR1cm4gYX1lbHNle3ZhciBiPW5iaSgpO2EuY29weVRvKGIpO3RoaXMucmVkdWNlKGIpO3JldHVybiBifX19ZnVuY3Rpb24gYmFycmV0dFJldmVydChhKXtyZXR1cm4gYX1mdW5jdGlvbiBiYXJyZXR0UmVkdWNlKGEpe2EuZHJTaGlmdFRvKHRoaXMubS50LTEsdGhpcy5yMik7aWYoYS50PnRoaXMubS50KzEpe2EudD10aGlzLm0udCsxO2EuY2xhbXAoKX10aGlzLm11Lm11bHRpcGx5VXBwZXJUbyh0aGlzLnIyLHRoaXMubS50KzEsdGhpcy5xMyk7dGhpcy5tLm11bHRpcGx5TG93ZXJUbyh0aGlzLnEzLHRoaXMubS50KzEsdGhpcy5yMik7d2hpbGUoYS5jb21wYXJlVG8odGhpcy5yMik8MCl7YS5kQWRkT2Zmc2V0KDEsdGhpcy5tLnQrMSl9YS5zdWJUbyh0aGlzLnIyLGEpO3doaWxlKGEuY29tcGFyZVRvKHRoaXMubSk+PTApe2Euc3ViVG8odGhpcy5tLGEpfX1mdW5jdGlvbiBiYXJyZXR0U3FyVG8oYSxiKXthLnNxdWFyZVRvKGIpO3RoaXMucmVkdWNlKGIpfWZ1bmN0aW9uIGJhcnJldHRNdWxUbyhhLGMsYil7YS5tdWx0aXBseVRvKGMsYik7dGhpcy5yZWR1Y2UoYil9QmFycmV0dC5wcm90b3R5cGUuY29udmVydD1iYXJyZXR0Q29udmVydDtCYXJyZXR0LnByb3RvdHlwZS5yZXZlcnQ9YmFycmV0dFJldmVydDtCYXJyZXR0LnByb3RvdHlwZS5yZWR1Y2U9YmFycmV0dFJlZHVjZTtCYXJyZXR0LnByb3RvdHlwZS5tdWxUbz1iYXJyZXR0TXVsVG87QmFycmV0dC5wcm90b3R5cGUuc3FyVG89YmFycmV0dFNxclRvO2Z1bmN0aW9uIGJuTW9kUG93KHEsZil7dmFyIG89cS5iaXRMZW5ndGgoKSxoLGI9bmJ2KDEpLHY7aWYobzw9MCl7cmV0dXJuIGJ9ZWxzZXtpZihvPDE4KXtoPTF9ZWxzZXtpZihvPDQ4KXtoPTN9ZWxzZXtpZihvPDE0NCl7aD00fWVsc2V7aWYobzw3Njgpe2g9NX1lbHNle2g9Nn19fX19aWYobzw4KXt2PW5ldyBDbGFzc2ljKGYpfWVsc2V7aWYoZi5pc0V2ZW4oKSl7dj1uZXcgQmFycmV0dChmKX1lbHNle3Y9bmV3IE1vbnRnb21lcnkoZil9fXZhciBwPW5ldyBBcnJheSgpLGQ9MyxzPWgtMSxhPSgxPDxoKS0xO3BbMV09di5jb252ZXJ0KHRoaXMpO2lmKGg+MSl7dmFyIEE9bmJpKCk7di5zcXJUbyhwWzFdLEEpO3doaWxlKGQ8PWEpe3BbZF09bmJpKCk7di5tdWxUbyhBLHBbZC0yXSxwW2RdKTtkKz0yfX12YXIgbD1xLnQtMSx4LHU9dHJ1ZSxjPW5iaSgpLHk7bz1uYml0cyhxW2xdKS0xO3doaWxlKGw+PTApe2lmKG8+PXMpe3g9KHFbbF0+PihvLXMpKSZhfWVsc2V7eD0ocVtsXSYoKDE8PChvKzEpKS0xKSk8PChzLW8pO2lmKGw+MCl7eHw9cVtsLTFdPj4odGhpcy5EQitvLXMpfX1kPWg7d2hpbGUoKHgmMSk9PTApe3g+Pj0xOy0tZH1pZigoby09ZCk8MCl7bys9dGhpcy5EQjstLWx9aWYodSl7cFt4XS5jb3B5VG8oYik7dT1mYWxzZX1lbHNle3doaWxlKGQ+MSl7di5zcXJUbyhiLGMpO3Yuc3FyVG8oYyxiKTtkLT0yfWlmKGQ+MCl7di5zcXJUbyhiLGMpfWVsc2V7eT1iO2I9YztjPXl9di5tdWxUbyhjLHBbeF0sYil9d2hpbGUobD49MCYmKHFbbF0mKDE8PG8pKT09MCl7di5zcXJUbyhiLGMpO3k9YjtiPWM7Yz15O2lmKC0tbzwwKXtvPXRoaXMuREItMTstLWx9fX1yZXR1cm4gdi5yZXZlcnQoYil9ZnVuY3Rpb24gYm5HQ0QoYyl7dmFyIGI9KHRoaXMuczwwKT90aGlzLm5lZ2F0ZSgpOnRoaXMuY2xvbmUoKTt2YXIgaD0oYy5zPDApP2MubmVnYXRlKCk6Yy5jbG9uZSgpO2lmKGIuY29tcGFyZVRvKGgpPDApe3ZhciBlPWI7Yj1oO2g9ZX12YXIgZD1iLmdldExvd2VzdFNldEJpdCgpLGY9aC5nZXRMb3dlc3RTZXRCaXQoKTtpZihmPDApe3JldHVybiBifWlmKGQ8Zil7Zj1kfWlmKGY+MCl7Yi5yU2hpZnRUbyhmLGIpO2guclNoaWZ0VG8oZixoKX13aGlsZShiLnNpZ251bSgpPjApe2lmKChkPWIuZ2V0TG93ZXN0U2V0Qml0KCkpPjApe2IuclNoaWZ0VG8oZCxiKX1pZigoZD1oLmdldExvd2VzdFNldEJpdCgpKT4wKXtoLnJTaGlmdFRvKGQsaCl9aWYoYi5jb21wYXJlVG8oaCk+PTApe2Iuc3ViVG8oaCxiKTtiLnJTaGlmdFRvKDEsYil9ZWxzZXtoLnN1YlRvKGIsaCk7aC5yU2hpZnRUbygxLGgpfX1pZihmPjApe2gubFNoaWZ0VG8oZixoKX1yZXR1cm4gaH1mdW5jdGlvbiBibnBNb2RJbnQoZSl7aWYoZTw9MCl7cmV0dXJuIDB9dmFyIGM9dGhpcy5EViVlLGI9KHRoaXMuczwwKT9lLTE6MDtpZih0aGlzLnQ+MCl7aWYoYz09MCl7Yj10aGlzWzBdJWV9ZWxzZXtmb3IodmFyIGE9dGhpcy50LTE7YT49MDstLWEpe2I9KGMqYit0aGlzW2FdKSVlfX19cmV0dXJuIGJ9ZnVuY3Rpb24gYm5Nb2RJbnZlcnNlKGYpe3ZhciBqPWYuaXNFdmVuKCk7aWYoKHRoaXMuaXNFdmVuKCkmJmopfHxmLnNpZ251bSgpPT0wKXtyZXR1cm4gQmlnSW50ZWdlci5aRVJPfXZhciBpPWYuY2xvbmUoKSxoPXRoaXMuY2xvbmUoKTt2YXIgZz1uYnYoMSksZT1uYnYoMCksbD1uYnYoMCksaz1uYnYoMSk7d2hpbGUoaS5zaWdudW0oKSE9MCl7d2hpbGUoaS5pc0V2ZW4oKSl7aS5yU2hpZnRUbygxLGkpO2lmKGope2lmKCFnLmlzRXZlbigpfHwhZS5pc0V2ZW4oKSl7Zy5hZGRUbyh0aGlzLGcpO2Uuc3ViVG8oZixlKX1nLnJTaGlmdFRvKDEsZyl9ZWxzZXtpZighZS5pc0V2ZW4oKSl7ZS5zdWJUbyhmLGUpfX1lLnJTaGlmdFRvKDEsZSl9d2hpbGUoaC5pc0V2ZW4oKSl7aC5yU2hpZnRUbygxLGgpO2lmKGope2lmKCFsLmlzRXZlbigpfHwhay5pc0V2ZW4oKSl7bC5hZGRUbyh0aGlzLGwpO2suc3ViVG8oZixrKX1sLnJTaGlmdFRvKDEsbCl9ZWxzZXtpZighay5pc0V2ZW4oKSl7ay5zdWJUbyhmLGspfX1rLnJTaGlmdFRvKDEsayl9aWYoaS5jb21wYXJlVG8oaCk+PTApe2kuc3ViVG8oaCxpKTtpZihqKXtnLnN1YlRvKGwsZyl9ZS5zdWJUbyhrLGUpfWVsc2V7aC5zdWJUbyhpLGgpO2lmKGope2wuc3ViVG8oZyxsKX1rLnN1YlRvKGUsayl9fWlmKGguY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSE9MCl7cmV0dXJuIEJpZ0ludGVnZXIuWkVST31pZihrLmNvbXBhcmVUbyhmKT49MCl7cmV0dXJuIGsuc3VidHJhY3QoZil9aWYoay5zaWdudW0oKTwwKXtrLmFkZFRvKGYsayl9ZWxzZXtyZXR1cm4ga31pZihrLnNpZ251bSgpPDApe3JldHVybiBrLmFkZChmKX1lbHNle3JldHVybiBrfX12YXIgbG93cHJpbWVzPVsyLDMsNSw3LDExLDEzLDE3LDE5LDIzLDI5LDMxLDM3LDQxLDQzLDQ3LDUzLDU5LDYxLDY3LDcxLDczLDc5LDgzLDg5LDk3LDEwMSwxMDMsMTA3LDEwOSwxMTMsMTI3LDEzMSwxMzcsMTM5LDE0OSwxNTEsMTU3LDE2MywxNjcsMTczLDE3OSwxODEsMTkxLDE5MywxOTcsMTk5LDIxMSwyMjMsMjI3LDIyOSwyMzMsMjM5LDI0MSwyNTEsMjU3LDI2MywyNjksMjcxLDI3NywyODEsMjgzLDI5MywzMDcsMzExLDMxMywzMTcsMzMxLDMzNywzNDcsMzQ5LDM1MywzNTksMzY3LDM3MywzNzksMzgzLDM4OSwzOTcsNDAxLDQwOSw0MTksNDIxLDQzMSw0MzMsNDM5LDQ0Myw0NDksNDU3LDQ2MSw0NjMsNDY3LDQ3OSw0ODcsNDkxLDQ5OSw1MDMsNTA5LDUyMSw1MjMsNTQxLDU0Nyw1NTcsNTYzLDU2OSw1NzEsNTc3LDU4Nyw1OTMsNTk5LDYwMSw2MDcsNjEzLDYxNyw2MTksNjMxLDY0MSw2NDMsNjQ3LDY1Myw2NTksNjYxLDY3Myw2NzcsNjgzLDY5MSw3MDEsNzA5LDcxOSw3MjcsNzMzLDczOSw3NDMsNzUxLDc1Nyw3NjEsNzY5LDc3Myw3ODcsNzk3LDgwOSw4MTEsODIxLDgyMyw4MjcsODI5LDgzOSw4NTMsODU3LDg1OSw4NjMsODc3LDg4MSw4ODMsODg3LDkwNyw5MTEsOTE5LDkyOSw5MzcsOTQxLDk0Nyw5NTMsOTY3LDk3MSw5NzcsOTgzLDk5MSw5OTddO3ZhciBscGxpbT0oMTw8MjYpL2xvd3ByaW1lc1tsb3dwcmltZXMubGVuZ3RoLTFdO2Z1bmN0aW9uIGJuSXNQcm9iYWJsZVByaW1lKGUpe3ZhciBkLGI9dGhpcy5hYnMoKTtpZihiLnQ9PTEmJmJbMF08PWxvd3ByaW1lc1tsb3dwcmltZXMubGVuZ3RoLTFdKXtmb3IoZD0wO2Q8bG93cHJpbWVzLmxlbmd0aDsrK2Qpe2lmKGJbMF09PWxvd3ByaW1lc1tkXSl7cmV0dXJuIHRydWV9fXJldHVybiBmYWxzZX1pZihiLmlzRXZlbigpKXtyZXR1cm4gZmFsc2V9ZD0xO3doaWxlKGQ8bG93cHJpbWVzLmxlbmd0aCl7dmFyIGE9bG93cHJpbWVzW2RdLGM9ZCsxO3doaWxlKGM8bG93cHJpbWVzLmxlbmd0aCYmYTxscGxpbSl7YSo9bG93cHJpbWVzW2MrK119YT1iLm1vZEludChhKTt3aGlsZShkPGMpe2lmKGElbG93cHJpbWVzW2QrK109PTApe3JldHVybiBmYWxzZX19fXJldHVybiBiLm1pbGxlclJhYmluKGUpfWZ1bmN0aW9uIGJucE1pbGxlclJhYmluKGYpe3ZhciBnPXRoaXMuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpO3ZhciBjPWcuZ2V0TG93ZXN0U2V0Qml0KCk7aWYoYzw9MCl7cmV0dXJuIGZhbHNlfXZhciBoPWcuc2hpZnRSaWdodChjKTtmPShmKzEpPj4xO2lmKGY+bG93cHJpbWVzLmxlbmd0aCl7Zj1sb3dwcmltZXMubGVuZ3RofXZhciBiPW5iaSgpO2Zvcih2YXIgZT0wO2U8ZjsrK2Upe2IuZnJvbUludChsb3dwcmltZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxvd3ByaW1lcy5sZW5ndGgpXSk7dmFyIGw9Yi5tb2RQb3coaCx0aGlzKTtpZihsLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkhPTAmJmwuY29tcGFyZVRvKGcpIT0wKXt2YXIgZD0xO3doaWxlKGQrKzxjJiZsLmNvbXBhcmVUbyhnKSE9MCl7bD1sLm1vZFBvd0ludCgyLHRoaXMpO2lmKGwuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKT09MCl7cmV0dXJuIGZhbHNlfX1pZihsLmNvbXBhcmVUbyhnKSE9MCl7cmV0dXJuIGZhbHNlfX19cmV0dXJuIHRydWV9QmlnSW50ZWdlci5wcm90b3R5cGUuY2h1bmtTaXplPWJucENodW5rU2l6ZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS50b1JhZGl4PWJucFRvUmFkaXg7QmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbVJhZGl4PWJucEZyb21SYWRpeDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tTnVtYmVyPWJucEZyb21OdW1iZXI7QmlnSW50ZWdlci5wcm90b3R5cGUuYml0d2lzZVRvPWJucEJpdHdpc2VUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5jaGFuZ2VCaXQ9Ym5wQ2hhbmdlQml0O0JpZ0ludGVnZXIucHJvdG90eXBlLmFkZFRvPWJucEFkZFRvO0JpZ0ludGVnZXIucHJvdG90eXBlLmRNdWx0aXBseT1ibnBETXVsdGlwbHk7QmlnSW50ZWdlci5wcm90b3R5cGUuZEFkZE9mZnNldD1ibnBEQWRkT2Zmc2V0O0JpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5TG93ZXJUbz1ibnBNdWx0aXBseUxvd2VyVG87QmlnSW50ZWdlci5wcm90b3R5cGUubXVsdGlwbHlVcHBlclRvPWJucE11bHRpcGx5VXBwZXJUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RJbnQ9Ym5wTW9kSW50O0JpZ0ludGVnZXIucHJvdG90eXBlLm1pbGxlclJhYmluPWJucE1pbGxlclJhYmluO0JpZ0ludGVnZXIucHJvdG90eXBlLmNsb25lPWJuQ2xvbmU7QmlnSW50ZWdlci5wcm90b3R5cGUuaW50VmFsdWU9Ym5JbnRWYWx1ZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5ieXRlVmFsdWU9Ym5CeXRlVmFsdWU7QmlnSW50ZWdlci5wcm90b3R5cGUuc2hvcnRWYWx1ZT1iblNob3J0VmFsdWU7QmlnSW50ZWdlci5wcm90b3R5cGUuc2lnbnVtPWJuU2lnTnVtO0JpZ0ludGVnZXIucHJvdG90eXBlLnRvQnl0ZUFycmF5PWJuVG9CeXRlQXJyYXk7QmlnSW50ZWdlci5wcm90b3R5cGUuZXF1YWxzPWJuRXF1YWxzO0JpZ0ludGVnZXIucHJvdG90eXBlLm1pbj1ibk1pbjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5tYXg9Ym5NYXg7QmlnSW50ZWdlci5wcm90b3R5cGUuYW5kPWJuQW5kO0JpZ0ludGVnZXIucHJvdG90eXBlLm9yPWJuT3I7QmlnSW50ZWdlci5wcm90b3R5cGUueG9yPWJuWG9yO0JpZ0ludGVnZXIucHJvdG90eXBlLmFuZE5vdD1ibkFuZE5vdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5ub3Q9Ym5Ob3Q7QmlnSW50ZWdlci5wcm90b3R5cGUuc2hpZnRMZWZ0PWJuU2hpZnRMZWZ0O0JpZ0ludGVnZXIucHJvdG90eXBlLnNoaWZ0UmlnaHQ9Ym5TaGlmdFJpZ2h0O0JpZ0ludGVnZXIucHJvdG90eXBlLmdldExvd2VzdFNldEJpdD1ibkdldExvd2VzdFNldEJpdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5iaXRDb3VudD1ibkJpdENvdW50O0JpZ0ludGVnZXIucHJvdG90eXBlLnRlc3RCaXQ9Ym5UZXN0Qml0O0JpZ0ludGVnZXIucHJvdG90eXBlLnNldEJpdD1iblNldEJpdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5jbGVhckJpdD1ibkNsZWFyQml0O0JpZ0ludGVnZXIucHJvdG90eXBlLmZsaXBCaXQ9Ym5GbGlwQml0O0JpZ0ludGVnZXIucHJvdG90eXBlLmFkZD1ibkFkZDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zdWJ0cmFjdD1iblN1YnRyYWN0O0JpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5PWJuTXVsdGlwbHk7QmlnSW50ZWdlci5wcm90b3R5cGUuZGl2aWRlPWJuRGl2aWRlO0JpZ0ludGVnZXIucHJvdG90eXBlLnJlbWFpbmRlcj1iblJlbWFpbmRlcjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5kaXZpZGVBbmRSZW1haW5kZXI9Ym5EaXZpZGVBbmRSZW1haW5kZXI7QmlnSW50ZWdlci5wcm90b3R5cGUubW9kUG93PWJuTW9kUG93O0JpZ0ludGVnZXIucHJvdG90eXBlLm1vZEludmVyc2U9Ym5Nb2RJbnZlcnNlO0JpZ0ludGVnZXIucHJvdG90eXBlLnBvdz1iblBvdztCaWdJbnRlZ2VyLnByb3RvdHlwZS5nY2Q9Ym5HQ0Q7QmlnSW50ZWdlci5wcm90b3R5cGUuaXNQcm9iYWJsZVByaW1lPWJuSXNQcm9iYWJsZVByaW1lO0JpZ0ludGVnZXIucHJvdG90eXBlLnNxdWFyZT1iblNxdWFyZTtcbi8qISAoYykgVG9tIFd1IHwgaHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfnRqdy9qc2JuL1xyXG4gKi9cclxuZnVuY3Rpb24gQXJjZm91cigpe3RoaXMuaT0wO3RoaXMuaj0wO3RoaXMuUz1uZXcgQXJyYXkoKX1mdW5jdGlvbiBBUkM0aW5pdChkKXt2YXIgYyxhLGI7Zm9yKGM9MDtjPDI1NjsrK2Mpe3RoaXMuU1tjXT1jfWE9MDtmb3IoYz0wO2M8MjU2OysrYyl7YT0oYSt0aGlzLlNbY10rZFtjJWQubGVuZ3RoXSkmMjU1O2I9dGhpcy5TW2NdO3RoaXMuU1tjXT10aGlzLlNbYV07dGhpcy5TW2FdPWJ9dGhpcy5pPTA7dGhpcy5qPTB9ZnVuY3Rpb24gQVJDNG5leHQoKXt2YXIgYTt0aGlzLmk9KHRoaXMuaSsxKSYyNTU7dGhpcy5qPSh0aGlzLmordGhpcy5TW3RoaXMuaV0pJjI1NTthPXRoaXMuU1t0aGlzLmldO3RoaXMuU1t0aGlzLmldPXRoaXMuU1t0aGlzLmpdO3RoaXMuU1t0aGlzLmpdPWE7cmV0dXJuIHRoaXMuU1soYSt0aGlzLlNbdGhpcy5pXSkmMjU1XX1BcmNmb3VyLnByb3RvdHlwZS5pbml0PUFSQzRpbml0O0FyY2ZvdXIucHJvdG90eXBlLm5leHQ9QVJDNG5leHQ7ZnVuY3Rpb24gcHJuZ19uZXdzdGF0ZSgpe3JldHVybiBuZXcgQXJjZm91cigpfXZhciBybmdfcHNpemU9MjU2O1xuLyohIChjKSBUb20gV3UgfCBodHRwOi8vd3d3LWNzLXN0dWRlbnRzLnN0YW5mb3JkLmVkdS9+dGp3L2pzYm4vXHJcbiAqL1xyXG52YXIgcm5nX3N0YXRlO3ZhciBybmdfcG9vbDt2YXIgcm5nX3BwdHI7ZnVuY3Rpb24gcm5nX3NlZWRfaW50KGEpe3JuZ19wb29sW3JuZ19wcHRyKytdXj1hJjI1NTtybmdfcG9vbFtybmdfcHB0cisrXV49KGE+PjgpJjI1NTtybmdfcG9vbFtybmdfcHB0cisrXV49KGE+PjE2KSYyNTU7cm5nX3Bvb2xbcm5nX3BwdHIrK11ePShhPj4yNCkmMjU1O2lmKHJuZ19wcHRyPj1ybmdfcHNpemUpe3JuZ19wcHRyLT1ybmdfcHNpemV9fWZ1bmN0aW9uIHJuZ19zZWVkX3RpbWUoKXtybmdfc2VlZF9pbnQobmV3IERhdGUoKS5nZXRUaW1lKCkpfWlmKHJuZ19wb29sPT1udWxsKXtybmdfcG9vbD1uZXcgQXJyYXkoKTtybmdfcHB0cj0wO3ZhciB0O2lmKHdpbmRvdyE9PXVuZGVmaW5lZCYmKHdpbmRvdy5jcnlwdG8hPT11bmRlZmluZWR8fHdpbmRvdy5tc0NyeXB0byE9PXVuZGVmaW5lZCkpe3ZhciBjcnlwdG89d2luZG93LmNyeXB0b3x8d2luZG93Lm1zQ3J5cHRvO2lmKGNyeXB0by5nZXRSYW5kb21WYWx1ZXMpe3ZhciB1YT1uZXcgVWludDhBcnJheSgzMik7Y3J5cHRvLmdldFJhbmRvbVZhbHVlcyh1YSk7Zm9yKHQ9MDt0PDMyOysrdCl7cm5nX3Bvb2xbcm5nX3BwdHIrK109dWFbdF19fWVsc2V7aWYobmF2aWdhdG9yLmFwcE5hbWU9PVwiTmV0c2NhcGVcIiYmbmF2aWdhdG9yLmFwcFZlcnNpb248XCI1XCIpe3ZhciB6PXdpbmRvdy5jcnlwdG8ucmFuZG9tKDMyKTtmb3IodD0wO3Q8ei5sZW5ndGg7Kyt0KXtybmdfcG9vbFtybmdfcHB0cisrXT16LmNoYXJDb2RlQXQodCkmMjU1fX19fXdoaWxlKHJuZ19wcHRyPHJuZ19wc2l6ZSl7dD1NYXRoLmZsb29yKDY1NTM2Kk1hdGgucmFuZG9tKCkpO3JuZ19wb29sW3JuZ19wcHRyKytdPXQ+Pj44O3JuZ19wb29sW3JuZ19wcHRyKytdPXQmMjU1fXJuZ19wcHRyPTA7cm5nX3NlZWRfdGltZSgpfWZ1bmN0aW9uIHJuZ19nZXRfYnl0ZSgpe2lmKHJuZ19zdGF0ZT09bnVsbCl7cm5nX3NlZWRfdGltZSgpO3JuZ19zdGF0ZT1wcm5nX25ld3N0YXRlKCk7cm5nX3N0YXRlLmluaXQocm5nX3Bvb2wpO2ZvcihybmdfcHB0cj0wO3JuZ19wcHRyPHJuZ19wb29sLmxlbmd0aDsrK3JuZ19wcHRyKXtybmdfcG9vbFtybmdfcHB0cl09MH1ybmdfcHB0cj0wfXJldHVybiBybmdfc3RhdGUubmV4dCgpfWZ1bmN0aW9uIHJuZ19nZXRfYnl0ZXMoYil7dmFyIGE7Zm9yKGE9MDthPGIubGVuZ3RoOysrYSl7YlthXT1ybmdfZ2V0X2J5dGUoKX19ZnVuY3Rpb24gU2VjdXJlUmFuZG9tKCl7fVNlY3VyZVJhbmRvbS5wcm90b3R5cGUubmV4dEJ5dGVzPXJuZ19nZXRfYnl0ZXM7XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cclxuICovXHJcbmZ1bmN0aW9uIHBhcnNlQmlnSW50KGIsYSl7cmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGIsYSl9ZnVuY3Rpb24gbGluZWJyayhjLGQpe3ZhciBhPVwiXCI7dmFyIGI9MDt3aGlsZShiK2Q8Yy5sZW5ndGgpe2ErPWMuc3Vic3RyaW5nKGIsYitkKStcIlxcblwiO2IrPWR9cmV0dXJuIGErYy5zdWJzdHJpbmcoYixjLmxlbmd0aCl9ZnVuY3Rpb24gYnl0ZTJIZXgoYSl7aWYoYTwxNil7cmV0dXJuXCIwXCIrYS50b1N0cmluZygxNil9ZWxzZXtyZXR1cm4gYS50b1N0cmluZygxNil9fWZ1bmN0aW9uIHBrY3MxcGFkMihlLGgpe2lmKGg8ZS5sZW5ndGgrMTEpe3Rocm93XCJNZXNzYWdlIHRvbyBsb25nIGZvciBSU0FcIjtyZXR1cm4gbnVsbH12YXIgZz1uZXcgQXJyYXkoKTt2YXIgZD1lLmxlbmd0aC0xO3doaWxlKGQ+PTAmJmg+MCl7dmFyIGY9ZS5jaGFyQ29kZUF0KGQtLSk7aWYoZjwxMjgpe2dbLS1oXT1mfWVsc2V7aWYoKGY+MTI3KSYmKGY8MjA0OCkpe2dbLS1oXT0oZiY2Myl8MTI4O2dbLS1oXT0oZj4+Nil8MTkyfWVsc2V7Z1stLWhdPShmJjYzKXwxMjg7Z1stLWhdPSgoZj4+NikmNjMpfDEyODtnWy0taF09KGY+PjEyKXwyMjR9fX1nWy0taF09MDt2YXIgYj1uZXcgU2VjdXJlUmFuZG9tKCk7dmFyIGE9bmV3IEFycmF5KCk7d2hpbGUoaD4yKXthWzBdPTA7d2hpbGUoYVswXT09MCl7Yi5uZXh0Qnl0ZXMoYSl9Z1stLWhdPWFbMF19Z1stLWhdPTI7Z1stLWhdPTA7cmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGcpfWZ1bmN0aW9uIG9hZXBfbWdmMV9hcnIoYyxhLGUpe3ZhciBiPVwiXCIsZD0wO3doaWxlKGIubGVuZ3RoPGEpe2IrPWUoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsYy5jb25jYXQoWyhkJjQyNzgxOTAwODApPj4yNCwoZCYxNjcxMTY4MCk+PjE2LChkJjY1MjgwKT4+OCxkJjI1NV0pKSk7ZCs9MX1yZXR1cm4gYn1mdW5jdGlvbiBvYWVwX3BhZChxLGEsZixsKXt2YXIgYz1LSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0O3ZhciBvPUtKVVIuY3J5cHRvLlV0aWw7dmFyIGI9bnVsbDtpZighZil7Zj1cInNoYTFcIn1pZih0eXBlb2YgZj09PVwic3RyaW5nXCIpe2I9Yy5nZXRDYW5vbmljYWxBbGdOYW1lKGYpO2w9Yy5nZXRIYXNoTGVuZ3RoKGIpO2Y9ZnVuY3Rpb24oaSl7cmV0dXJuIGhleHRvcnN0cihvLmhhc2hIZXgocnN0cnRvaGV4KGkpLGIpKX19aWYocS5sZW5ndGgrMipsKzI+YSl7dGhyb3dcIk1lc3NhZ2UgdG9vIGxvbmcgZm9yIFJTQVwifXZhciBrPVwiXCIsZTtmb3IoZT0wO2U8YS1xLmxlbmd0aC0yKmwtMjtlKz0xKXtrKz1cIlxceDAwXCJ9dmFyIGg9ZihcIlwiKStrK1wiXFx4MDFcIitxO3ZhciBnPW5ldyBBcnJheShsKTtuZXcgU2VjdXJlUmFuZG9tKCkubmV4dEJ5dGVzKGcpO3ZhciBqPW9hZXBfbWdmMV9hcnIoZyxoLmxlbmd0aCxmKTt2YXIgcD1bXTtmb3IoZT0wO2U8aC5sZW5ndGg7ZSs9MSl7cFtlXT1oLmNoYXJDb2RlQXQoZSleai5jaGFyQ29kZUF0KGUpfXZhciBtPW9hZXBfbWdmMV9hcnIocCxnLmxlbmd0aCxmKTt2YXIgZD1bMF07Zm9yKGU9MDtlPGcubGVuZ3RoO2UrPTEpe2RbZSsxXT1nW2VdXm0uY2hhckNvZGVBdChlKX1yZXR1cm4gbmV3IEJpZ0ludGVnZXIoZC5jb25jYXQocCkpfWZ1bmN0aW9uIFJTQUtleSgpe3RoaXMubj1udWxsO3RoaXMuZT0wO3RoaXMuZD1udWxsO3RoaXMucD1udWxsO3RoaXMucT1udWxsO3RoaXMuZG1wMT1udWxsO3RoaXMuZG1xMT1udWxsO3RoaXMuY29lZmY9bnVsbH1mdW5jdGlvbiBSU0FTZXRQdWJsaWMoYixhKXt0aGlzLmlzUHVibGljPXRydWU7dGhpcy5pc1ByaXZhdGU9ZmFsc2U7aWYodHlwZW9mIGIhPT1cInN0cmluZ1wiKXt0aGlzLm49Yjt0aGlzLmU9YX1lbHNle2lmKGIhPW51bGwmJmEhPW51bGwmJmIubGVuZ3RoPjAmJmEubGVuZ3RoPjApe3RoaXMubj1wYXJzZUJpZ0ludChiLDE2KTt0aGlzLmU9cGFyc2VJbnQoYSwxNil9ZWxzZXt0aHJvd1wiSW52YWxpZCBSU0EgcHVibGljIGtleVwifX19ZnVuY3Rpb24gUlNBRG9QdWJsaWMoYSl7cmV0dXJuIGEubW9kUG93SW50KHRoaXMuZSx0aGlzLm4pfWZ1bmN0aW9uIFJTQUVuY3J5cHQoZCl7dmFyIGE9cGtjczFwYWQyKGQsKHRoaXMubi5iaXRMZW5ndGgoKSs3KT4+Myk7aWYoYT09bnVsbCl7cmV0dXJuIG51bGx9dmFyIGU9dGhpcy5kb1B1YmxpYyhhKTtpZihlPT1udWxsKXtyZXR1cm4gbnVsbH12YXIgYj1lLnRvU3RyaW5nKDE2KTtpZigoYi5sZW5ndGgmMSk9PTApe3JldHVybiBifWVsc2V7cmV0dXJuXCIwXCIrYn19ZnVuY3Rpb24gUlNBRW5jcnlwdE9BRVAoZixlLGIpe3ZhciBhPW9hZXBfcGFkKGYsKHRoaXMubi5iaXRMZW5ndGgoKSs3KT4+MyxlLGIpO2lmKGE9PW51bGwpe3JldHVybiBudWxsfXZhciBnPXRoaXMuZG9QdWJsaWMoYSk7aWYoZz09bnVsbCl7cmV0dXJuIG51bGx9dmFyIGQ9Zy50b1N0cmluZygxNik7aWYoKGQubGVuZ3RoJjEpPT0wKXtyZXR1cm4gZH1lbHNle3JldHVyblwiMFwiK2R9fVJTQUtleS5wcm90b3R5cGUuZG9QdWJsaWM9UlNBRG9QdWJsaWM7UlNBS2V5LnByb3RvdHlwZS5zZXRQdWJsaWM9UlNBU2V0UHVibGljO1JTQUtleS5wcm90b3R5cGUuZW5jcnlwdD1SU0FFbmNyeXB0O1JTQUtleS5wcm90b3R5cGUuZW5jcnlwdE9BRVA9UlNBRW5jcnlwdE9BRVA7UlNBS2V5LnByb3RvdHlwZS50eXBlPVwiUlNBXCI7XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cclxuICovXHJcbmZ1bmN0aW9uIEVDRmllbGRFbGVtZW50RnAoYixhKXt0aGlzLng9YTt0aGlzLnE9Yn1mdW5jdGlvbiBmZUZwRXF1YWxzKGEpe2lmKGE9PXRoaXMpe3JldHVybiB0cnVlfXJldHVybih0aGlzLnEuZXF1YWxzKGEucSkmJnRoaXMueC5lcXVhbHMoYS54KSl9ZnVuY3Rpb24gZmVGcFRvQmlnSW50ZWdlcigpe3JldHVybiB0aGlzLnh9ZnVuY3Rpb24gZmVGcE5lZ2F0ZSgpe3JldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsdGhpcy54Lm5lZ2F0ZSgpLm1vZCh0aGlzLnEpKX1mdW5jdGlvbiBmZUZwQWRkKGEpe3JldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsdGhpcy54LmFkZChhLnRvQmlnSW50ZWdlcigpKS5tb2QodGhpcy5xKSl9ZnVuY3Rpb24gZmVGcFN1YnRyYWN0KGEpe3JldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsdGhpcy54LnN1YnRyYWN0KGEudG9CaWdJbnRlZ2VyKCkpLm1vZCh0aGlzLnEpKX1mdW5jdGlvbiBmZUZwTXVsdGlwbHkoYSl7cmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSx0aGlzLngubXVsdGlwbHkoYS50b0JpZ0ludGVnZXIoKSkubW9kKHRoaXMucSkpfWZ1bmN0aW9uIGZlRnBTcXVhcmUoKXtyZXR1cm4gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLHRoaXMueC5zcXVhcmUoKS5tb2QodGhpcy5xKSl9ZnVuY3Rpb24gZmVGcERpdmlkZShhKXtyZXR1cm4gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLHRoaXMueC5tdWx0aXBseShhLnRvQmlnSW50ZWdlcigpLm1vZEludmVyc2UodGhpcy5xKSkubW9kKHRoaXMucSkpfUVDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLmVxdWFscz1mZUZwRXF1YWxzO0VDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLnRvQmlnSW50ZWdlcj1mZUZwVG9CaWdJbnRlZ2VyO0VDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLm5lZ2F0ZT1mZUZwTmVnYXRlO0VDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLmFkZD1mZUZwQWRkO0VDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLnN1YnRyYWN0PWZlRnBTdWJ0cmFjdDtFQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5tdWx0aXBseT1mZUZwTXVsdGlwbHk7RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUuc3F1YXJlPWZlRnBTcXVhcmU7RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUuZGl2aWRlPWZlRnBEaXZpZGU7ZnVuY3Rpb24gRUNQb2ludEZwKGMsYSxkLGIpe3RoaXMuY3VydmU9Yzt0aGlzLng9YTt0aGlzLnk9ZDtpZihiPT1udWxsKXt0aGlzLno9QmlnSW50ZWdlci5PTkV9ZWxzZXt0aGlzLno9Yn10aGlzLnppbnY9bnVsbH1mdW5jdGlvbiBwb2ludEZwR2V0WCgpe2lmKHRoaXMuemludj09bnVsbCl7dGhpcy56aW52PXRoaXMuei5tb2RJbnZlcnNlKHRoaXMuY3VydmUucSl9cmV0dXJuIHRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIodGhpcy54LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMuemludikubW9kKHRoaXMuY3VydmUucSkpfWZ1bmN0aW9uIHBvaW50RnBHZXRZKCl7aWYodGhpcy56aW52PT1udWxsKXt0aGlzLnppbnY9dGhpcy56Lm1vZEludmVyc2UodGhpcy5jdXJ2ZS5xKX1yZXR1cm4gdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcih0aGlzLnkudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkodGhpcy56aW52KS5tb2QodGhpcy5jdXJ2ZS5xKSl9ZnVuY3Rpb24gcG9pbnRGcEVxdWFscyhhKXtpZihhPT10aGlzKXtyZXR1cm4gdHJ1ZX1pZih0aGlzLmlzSW5maW5pdHkoKSl7cmV0dXJuIGEuaXNJbmZpbml0eSgpfWlmKGEuaXNJbmZpbml0eSgpKXtyZXR1cm4gdGhpcy5pc0luZmluaXR5KCl9dmFyIGMsYjtjPWEueS50b0JpZ0ludGVnZXIoKS5tdWx0aXBseSh0aGlzLnopLnN1YnRyYWN0KHRoaXMueS50b0JpZ0ludGVnZXIoKS5tdWx0aXBseShhLnopKS5tb2QodGhpcy5jdXJ2ZS5xKTtpZighYy5lcXVhbHMoQmlnSW50ZWdlci5aRVJPKSl7cmV0dXJuIGZhbHNlfWI9YS54LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMueikuc3VidHJhY3QodGhpcy54LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KGEueikpLm1vZCh0aGlzLmN1cnZlLnEpO3JldHVybiBiLmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pfWZ1bmN0aW9uIHBvaW50RnBJc0luZmluaXR5KCl7aWYoKHRoaXMueD09bnVsbCkmJih0aGlzLnk9PW51bGwpKXtyZXR1cm4gdHJ1ZX1yZXR1cm4gdGhpcy56LmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pJiYhdGhpcy55LnRvQmlnSW50ZWdlcigpLmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pfWZ1bmN0aW9uIHBvaW50RnBOZWdhdGUoKXtyZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLmN1cnZlLHRoaXMueCx0aGlzLnkubmVnYXRlKCksdGhpcy56KX1mdW5jdGlvbiBwb2ludEZwQWRkKGwpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gbH1pZihsLmlzSW5maW5pdHkoKSl7cmV0dXJuIHRoaXN9dmFyIHA9bC55LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMueikuc3VidHJhY3QodGhpcy55LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KGwueikpLm1vZCh0aGlzLmN1cnZlLnEpO3ZhciBvPWwueC50b0JpZ0ludGVnZXIoKS5tdWx0aXBseSh0aGlzLnopLnN1YnRyYWN0KHRoaXMueC50b0JpZ0ludGVnZXIoKS5tdWx0aXBseShsLnopKS5tb2QodGhpcy5jdXJ2ZS5xKTtpZihCaWdJbnRlZ2VyLlpFUk8uZXF1YWxzKG8pKXtpZihCaWdJbnRlZ2VyLlpFUk8uZXF1YWxzKHApKXtyZXR1cm4gdGhpcy50d2ljZSgpfXJldHVybiB0aGlzLmN1cnZlLmdldEluZmluaXR5KCl9dmFyIGo9bmV3IEJpZ0ludGVnZXIoXCIzXCIpO3ZhciBlPXRoaXMueC50b0JpZ0ludGVnZXIoKTt2YXIgbj10aGlzLnkudG9CaWdJbnRlZ2VyKCk7dmFyIGM9bC54LnRvQmlnSW50ZWdlcigpO3ZhciBrPWwueS50b0JpZ0ludGVnZXIoKTt2YXIgbT1vLnNxdWFyZSgpO3ZhciBpPW0ubXVsdGlwbHkobyk7dmFyIGQ9ZS5tdWx0aXBseShtKTt2YXIgZz1wLnNxdWFyZSgpLm11bHRpcGx5KHRoaXMueik7dmFyIGE9Zy5zdWJ0cmFjdChkLnNoaWZ0TGVmdCgxKSkubXVsdGlwbHkobC56KS5zdWJ0cmFjdChpKS5tdWx0aXBseShvKS5tb2QodGhpcy5jdXJ2ZS5xKTt2YXIgaD1kLm11bHRpcGx5KGopLm11bHRpcGx5KHApLnN1YnRyYWN0KG4ubXVsdGlwbHkoaSkpLnN1YnRyYWN0KGcubXVsdGlwbHkocCkpLm11bHRpcGx5KGwueikuYWRkKHAubXVsdGlwbHkoaSkpLm1vZCh0aGlzLmN1cnZlLnEpO3ZhciBmPWkubXVsdGlwbHkodGhpcy56KS5tdWx0aXBseShsLnopLm1vZCh0aGlzLmN1cnZlLnEpO3JldHVybiBuZXcgRUNQb2ludEZwKHRoaXMuY3VydmUsdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcihhKSx0aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKGgpLGYpfWZ1bmN0aW9uIHBvaW50RnBUd2ljZSgpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gdGhpc31pZih0aGlzLnkudG9CaWdJbnRlZ2VyKCkuc2lnbnVtKCk9PTApe3JldHVybiB0aGlzLmN1cnZlLmdldEluZmluaXR5KCl9dmFyIGc9bmV3IEJpZ0ludGVnZXIoXCIzXCIpO3ZhciBjPXRoaXMueC50b0JpZ0ludGVnZXIoKTt2YXIgaD10aGlzLnkudG9CaWdJbnRlZ2VyKCk7dmFyIGU9aC5tdWx0aXBseSh0aGlzLnopO3ZhciBqPWUubXVsdGlwbHkoaCkubW9kKHRoaXMuY3VydmUucSk7dmFyIGk9dGhpcy5jdXJ2ZS5hLnRvQmlnSW50ZWdlcigpO3ZhciBrPWMuc3F1YXJlKCkubXVsdGlwbHkoZyk7aWYoIUJpZ0ludGVnZXIuWkVSTy5lcXVhbHMoaSkpe2s9ay5hZGQodGhpcy56LnNxdWFyZSgpLm11bHRpcGx5KGkpKX1rPWsubW9kKHRoaXMuY3VydmUucSk7dmFyIGI9ay5zcXVhcmUoKS5zdWJ0cmFjdChjLnNoaWZ0TGVmdCgzKS5tdWx0aXBseShqKSkuc2hpZnRMZWZ0KDEpLm11bHRpcGx5KGUpLm1vZCh0aGlzLmN1cnZlLnEpO3ZhciBmPWsubXVsdGlwbHkoZykubXVsdGlwbHkoYykuc3VidHJhY3Qoai5zaGlmdExlZnQoMSkpLnNoaWZ0TGVmdCgyKS5tdWx0aXBseShqKS5zdWJ0cmFjdChrLnNxdWFyZSgpLm11bHRpcGx5KGspKS5tb2QodGhpcy5jdXJ2ZS5xKTt2YXIgZD1lLnNxdWFyZSgpLm11bHRpcGx5KGUpLnNoaWZ0TGVmdCgzKS5tb2QodGhpcy5jdXJ2ZS5xKTtyZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLmN1cnZlLHRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIoYiksdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcihmKSxkKX1mdW5jdGlvbiBwb2ludEZwTXVsdGlwbHkoZCl7aWYodGhpcy5pc0luZmluaXR5KCkpe3JldHVybiB0aGlzfWlmKGQuc2lnbnVtKCk9PTApe3JldHVybiB0aGlzLmN1cnZlLmdldEluZmluaXR5KCl9dmFyIG09ZDt2YXIgbD1tLm11bHRpcGx5KG5ldyBCaWdJbnRlZ2VyKFwiM1wiKSk7dmFyIGI9dGhpcy5uZWdhdGUoKTt2YXIgaj10aGlzO3ZhciBxPXRoaXMuY3VydmUucS5zdWJ0cmFjdChkKTt2YXIgbz1xLm11bHRpcGx5KG5ldyBCaWdJbnRlZ2VyKFwiM1wiKSk7dmFyIGM9bmV3IEVDUG9pbnRGcCh0aGlzLmN1cnZlLHRoaXMueCx0aGlzLnkpO3ZhciBhPWMubmVnYXRlKCk7dmFyIGc7Zm9yKGc9bC5iaXRMZW5ndGgoKS0yO2c+MDstLWcpe2o9ai50d2ljZSgpO3ZhciBuPWwudGVzdEJpdChnKTt2YXIgZj1tLnRlc3RCaXQoZyk7aWYobiE9Zil7aj1qLmFkZChuP3RoaXM6Yil9fWZvcihnPW8uYml0TGVuZ3RoKCktMjtnPjA7LS1nKXtjPWMudHdpY2UoKTt2YXIgcD1vLnRlc3RCaXQoZyk7dmFyIHI9cS50ZXN0Qml0KGcpO2lmKHAhPXIpe2M9Yy5hZGQocD9jOmEpfX1yZXR1cm4gan1mdW5jdGlvbiBwb2ludEZwTXVsdGlwbHlUd28oYyxhLGIpe3ZhciBkO2lmKGMuYml0TGVuZ3RoKCk+Yi5iaXRMZW5ndGgoKSl7ZD1jLmJpdExlbmd0aCgpLTF9ZWxzZXtkPWIuYml0TGVuZ3RoKCktMX12YXIgZj10aGlzLmN1cnZlLmdldEluZmluaXR5KCk7dmFyIGU9dGhpcy5hZGQoYSk7d2hpbGUoZD49MCl7Zj1mLnR3aWNlKCk7aWYoYy50ZXN0Qml0KGQpKXtpZihiLnRlc3RCaXQoZCkpe2Y9Zi5hZGQoZSl9ZWxzZXtmPWYuYWRkKHRoaXMpfX1lbHNle2lmKGIudGVzdEJpdChkKSl7Zj1mLmFkZChhKX19LS1kfXJldHVybiBmfUVDUG9pbnRGcC5wcm90b3R5cGUuZ2V0WD1wb2ludEZwR2V0WDtFQ1BvaW50RnAucHJvdG90eXBlLmdldFk9cG9pbnRGcEdldFk7RUNQb2ludEZwLnByb3RvdHlwZS5lcXVhbHM9cG9pbnRGcEVxdWFscztFQ1BvaW50RnAucHJvdG90eXBlLmlzSW5maW5pdHk9cG9pbnRGcElzSW5maW5pdHk7RUNQb2ludEZwLnByb3RvdHlwZS5uZWdhdGU9cG9pbnRGcE5lZ2F0ZTtFQ1BvaW50RnAucHJvdG90eXBlLmFkZD1wb2ludEZwQWRkO0VDUG9pbnRGcC5wcm90b3R5cGUudHdpY2U9cG9pbnRGcFR3aWNlO0VDUG9pbnRGcC5wcm90b3R5cGUubXVsdGlwbHk9cG9pbnRGcE11bHRpcGx5O0VDUG9pbnRGcC5wcm90b3R5cGUubXVsdGlwbHlUd289cG9pbnRGcE11bHRpcGx5VHdvO2Z1bmN0aW9uIEVDQ3VydmVGcChlLGQsYyl7dGhpcy5xPWU7dGhpcy5hPXRoaXMuZnJvbUJpZ0ludGVnZXIoZCk7dGhpcy5iPXRoaXMuZnJvbUJpZ0ludGVnZXIoYyk7dGhpcy5pbmZpbml0eT1uZXcgRUNQb2ludEZwKHRoaXMsbnVsbCxudWxsKX1mdW5jdGlvbiBjdXJ2ZUZwR2V0USgpe3JldHVybiB0aGlzLnF9ZnVuY3Rpb24gY3VydmVGcEdldEEoKXtyZXR1cm4gdGhpcy5hfWZ1bmN0aW9uIGN1cnZlRnBHZXRCKCl7cmV0dXJuIHRoaXMuYn1mdW5jdGlvbiBjdXJ2ZUZwRXF1YWxzKGEpe2lmKGE9PXRoaXMpe3JldHVybiB0cnVlfXJldHVybih0aGlzLnEuZXF1YWxzKGEucSkmJnRoaXMuYS5lcXVhbHMoYS5hKSYmdGhpcy5iLmVxdWFscyhhLmIpKX1mdW5jdGlvbiBjdXJ2ZUZwR2V0SW5maW5pdHkoKXtyZXR1cm4gdGhpcy5pbmZpbml0eX1mdW5jdGlvbiBjdXJ2ZUZwRnJvbUJpZ0ludGVnZXIoYSl7cmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSxhKX1mdW5jdGlvbiBjdXJ2ZUZwRGVjb2RlUG9pbnRIZXgoZCl7c3dpdGNoKHBhcnNlSW50KGQuc3Vic3RyKDAsMiksMTYpKXtjYXNlIDA6cmV0dXJuIHRoaXMuaW5maW5pdHk7Y2FzZSAyOmNhc2UgMzpyZXR1cm4gbnVsbDtjYXNlIDQ6Y2FzZSA2OmNhc2UgNzp2YXIgYT0oZC5sZW5ndGgtMikvMjt2YXIgYz1kLnN1YnN0cigyLGEpO3ZhciBiPWQuc3Vic3RyKGErMixhKTtyZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLHRoaXMuZnJvbUJpZ0ludGVnZXIobmV3IEJpZ0ludGVnZXIoYywxNikpLHRoaXMuZnJvbUJpZ0ludGVnZXIobmV3IEJpZ0ludGVnZXIoYiwxNikpKTtkZWZhdWx0OnJldHVybiBudWxsfX1FQ0N1cnZlRnAucHJvdG90eXBlLmdldFE9Y3VydmVGcEdldFE7RUNDdXJ2ZUZwLnByb3RvdHlwZS5nZXRBPWN1cnZlRnBHZXRBO0VDQ3VydmVGcC5wcm90b3R5cGUuZ2V0Qj1jdXJ2ZUZwR2V0QjtFQ0N1cnZlRnAucHJvdG90eXBlLmVxdWFscz1jdXJ2ZUZwRXF1YWxzO0VDQ3VydmVGcC5wcm90b3R5cGUuZ2V0SW5maW5pdHk9Y3VydmVGcEdldEluZmluaXR5O0VDQ3VydmVGcC5wcm90b3R5cGUuZnJvbUJpZ0ludGVnZXI9Y3VydmVGcEZyb21CaWdJbnRlZ2VyO0VDQ3VydmVGcC5wcm90b3R5cGUuZGVjb2RlUG9pbnRIZXg9Y3VydmVGcERlY29kZVBvaW50SGV4O1xuLyohIChjKSBTdGVmYW4gVGhvbWFzIHwgaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW5qcy9iaXRjb2luanMtbGliXHJcbiAqL1xyXG5FQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5nZXRCeXRlTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguZmxvb3IoKHRoaXMudG9CaWdJbnRlZ2VyKCkuYml0TGVuZ3RoKCkrNykvOCl9O0VDUG9pbnRGcC5wcm90b3R5cGUuZ2V0RW5jb2RlZD1mdW5jdGlvbihjKXt2YXIgZD1mdW5jdGlvbihoLGYpe3ZhciBnPWgudG9CeXRlQXJyYXlVbnNpZ25lZCgpO2lmKGY8Zy5sZW5ndGgpe2c9Zy5zbGljZShnLmxlbmd0aC1mKX1lbHNle3doaWxlKGY+Zy5sZW5ndGgpe2cudW5zaGlmdCgwKX19cmV0dXJuIGd9O3ZhciBhPXRoaXMuZ2V0WCgpLnRvQmlnSW50ZWdlcigpO3ZhciBlPXRoaXMuZ2V0WSgpLnRvQmlnSW50ZWdlcigpO3ZhciBiPWQoYSwzMik7aWYoYyl7aWYoZS5pc0V2ZW4oKSl7Yi51bnNoaWZ0KDIpfWVsc2V7Yi51bnNoaWZ0KDMpfX1lbHNle2IudW5zaGlmdCg0KTtiPWIuY29uY2F0KGQoZSwzMikpfXJldHVybiBifTtFQ1BvaW50RnAuZGVjb2RlRnJvbT1mdW5jdGlvbihnLGMpe3ZhciBmPWNbMF07dmFyIGU9Yy5sZW5ndGgtMTt2YXIgZD1jLnNsaWNlKDEsMStlLzIpO3ZhciBiPWMuc2xpY2UoMStlLzIsMStlKTtkLnVuc2hpZnQoMCk7Yi51bnNoaWZ0KDApO3ZhciBhPW5ldyBCaWdJbnRlZ2VyKGQpO3ZhciBoPW5ldyBCaWdJbnRlZ2VyKGIpO3JldHVybiBuZXcgRUNQb2ludEZwKGcsZy5mcm9tQmlnSW50ZWdlcihhKSxnLmZyb21CaWdJbnRlZ2VyKGgpKX07RUNQb2ludEZwLmRlY29kZUZyb21IZXg9ZnVuY3Rpb24oZyxjKXt2YXIgZj1jLnN1YnN0cigwLDIpO3ZhciBlPWMubGVuZ3RoLTI7dmFyIGQ9Yy5zdWJzdHIoMixlLzIpO3ZhciBiPWMuc3Vic3RyKDIrZS8yLGUvMik7dmFyIGE9bmV3IEJpZ0ludGVnZXIoZCwxNik7dmFyIGg9bmV3IEJpZ0ludGVnZXIoYiwxNik7cmV0dXJuIG5ldyBFQ1BvaW50RnAoZyxnLmZyb21CaWdJbnRlZ2VyKGEpLGcuZnJvbUJpZ0ludGVnZXIoaCkpfTtFQ1BvaW50RnAucHJvdG90eXBlLmFkZDJEPWZ1bmN0aW9uKGMpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gY31pZihjLmlzSW5maW5pdHkoKSl7cmV0dXJuIHRoaXN9aWYodGhpcy54LmVxdWFscyhjLngpKXtpZih0aGlzLnkuZXF1YWxzKGMueSkpe3JldHVybiB0aGlzLnR3aWNlKCl9cmV0dXJuIHRoaXMuY3VydmUuZ2V0SW5maW5pdHkoKX12YXIgZz1jLnguc3VidHJhY3QodGhpcy54KTt2YXIgZT1jLnkuc3VidHJhY3QodGhpcy55KTt2YXIgYT1lLmRpdmlkZShnKTt2YXIgZD1hLnNxdWFyZSgpLnN1YnRyYWN0KHRoaXMueCkuc3VidHJhY3QoYy54KTt2YXIgZj1hLm11bHRpcGx5KHRoaXMueC5zdWJ0cmFjdChkKSkuc3VidHJhY3QodGhpcy55KTtyZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLmN1cnZlLGQsZil9O0VDUG9pbnRGcC5wcm90b3R5cGUudHdpY2UyRD1mdW5jdGlvbigpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gdGhpc31pZih0aGlzLnkudG9CaWdJbnRlZ2VyKCkuc2lnbnVtKCk9PTApe3JldHVybiB0aGlzLmN1cnZlLmdldEluZmluaXR5KCl9dmFyIGI9dGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcihCaWdJbnRlZ2VyLnZhbHVlT2YoMikpO3ZhciBlPXRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIoQmlnSW50ZWdlci52YWx1ZU9mKDMpKTt2YXIgYT10aGlzLnguc3F1YXJlKCkubXVsdGlwbHkoZSkuYWRkKHRoaXMuY3VydmUuYSkuZGl2aWRlKHRoaXMueS5tdWx0aXBseShiKSk7dmFyIGM9YS5zcXVhcmUoKS5zdWJ0cmFjdCh0aGlzLngubXVsdGlwbHkoYikpO3ZhciBkPWEubXVsdGlwbHkodGhpcy54LnN1YnRyYWN0KGMpKS5zdWJ0cmFjdCh0aGlzLnkpO3JldHVybiBuZXcgRUNQb2ludEZwKHRoaXMuY3VydmUsYyxkKX07RUNQb2ludEZwLnByb3RvdHlwZS5tdWx0aXBseTJEPWZ1bmN0aW9uKGIpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gdGhpc31pZihiLnNpZ251bSgpPT0wKXtyZXR1cm4gdGhpcy5jdXJ2ZS5nZXRJbmZpbml0eSgpfXZhciBnPWI7dmFyIGY9Zy5tdWx0aXBseShuZXcgQmlnSW50ZWdlcihcIjNcIikpO3ZhciBsPXRoaXMubmVnYXRlKCk7dmFyIGQ9dGhpczt2YXIgYztmb3IoYz1mLmJpdExlbmd0aCgpLTI7Yz4wOy0tYyl7ZD1kLnR3aWNlKCk7dmFyIGE9Zi50ZXN0Qml0KGMpO3ZhciBqPWcudGVzdEJpdChjKTtpZihhIT1qKXtkPWQuYWRkMkQoYT90aGlzOmwpfX1yZXR1cm4gZH07RUNQb2ludEZwLnByb3RvdHlwZS5pc09uQ3VydmU9ZnVuY3Rpb24oKXt2YXIgZD10aGlzLmdldFgoKS50b0JpZ0ludGVnZXIoKTt2YXIgaT10aGlzLmdldFkoKS50b0JpZ0ludGVnZXIoKTt2YXIgZj10aGlzLmN1cnZlLmdldEEoKS50b0JpZ0ludGVnZXIoKTt2YXIgYz10aGlzLmN1cnZlLmdldEIoKS50b0JpZ0ludGVnZXIoKTt2YXIgaD10aGlzLmN1cnZlLmdldFEoKTt2YXIgZT1pLm11bHRpcGx5KGkpLm1vZChoKTt2YXIgZz1kLm11bHRpcGx5KGQpLm11bHRpcGx5KGQpLmFkZChmLm11bHRpcGx5KGQpKS5hZGQoYykubW9kKGgpO3JldHVybiBlLmVxdWFscyhnKX07RUNQb2ludEZwLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblwiKFwiK3RoaXMuZ2V0WCgpLnRvQmlnSW50ZWdlcigpLnRvU3RyaW5nKCkrXCIsXCIrdGhpcy5nZXRZKCkudG9CaWdJbnRlZ2VyKCkudG9TdHJpbmcoKStcIilcIn07RUNQb2ludEZwLnByb3RvdHlwZS52YWxpZGF0ZT1mdW5jdGlvbigpe3ZhciBjPXRoaXMuY3VydmUuZ2V0USgpO2lmKHRoaXMuaXNJbmZpbml0eSgpKXt0aHJvdyBuZXcgRXJyb3IoXCJQb2ludCBpcyBhdCBpbmZpbml0eS5cIil9dmFyIGE9dGhpcy5nZXRYKCkudG9CaWdJbnRlZ2VyKCk7dmFyIGI9dGhpcy5nZXRZKCkudG9CaWdJbnRlZ2VyKCk7aWYoYS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpPDB8fGEuY29tcGFyZVRvKGMuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpKT4wKXt0aHJvdyBuZXcgRXJyb3IoXCJ4IGNvb3JkaW5hdGUgb3V0IG9mIGJvdW5kc1wiKX1pZihiLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSk8MHx8Yi5jb21wYXJlVG8oYy5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkpPjApe3Rocm93IG5ldyBFcnJvcihcInkgY29vcmRpbmF0ZSBvdXQgb2YgYm91bmRzXCIpfWlmKCF0aGlzLmlzT25DdXJ2ZSgpKXt0aHJvdyBuZXcgRXJyb3IoXCJQb2ludCBpcyBub3Qgb24gdGhlIGN1cnZlLlwiKX1pZih0aGlzLm11bHRpcGx5KGMpLmlzSW5maW5pdHkoKSl7dGhyb3cgbmV3IEVycm9yKFwiUG9pbnQgaXMgbm90IGEgc2NhbGFyIG11bHRpcGxlIG9mIEcuXCIpfXJldHVybiB0cnVlfTtcbi8qISBNaWtlIFNhbXVlbCAoYykgMjAwOSB8IGNvZGUuZ29vZ2xlLmNvbS9wL2pzb24tc2Fucy1ldmFsXHJcbiAqL1xyXG52YXIganNvblBhcnNlPShmdW5jdGlvbigpe3ZhciBlPVwiKD86LT9cXFxcYig/OjB8WzEtOV1bMC05XSopKD86XFxcXC5bMC05XSspPyg/OltlRV1bKy1dP1swLTldKyk/XFxcXGIpXCI7dmFyIGo9Jyg/OlteXFxcXDAtXFxcXHgwOFxcXFx4MGEtXFxcXHgxZlwiXFxcXFxcXFxdfFxcXFxcXFxcKD86W1wiL1xcXFxcXFxcYmZucnRdfHVbMC05QS1GYS1mXXs0fSkpJzt2YXIgaT0nKD86XCInK2orJypcIiknO3ZhciBkPW5ldyBSZWdFeHAoXCIoPzpmYWxzZXx0cnVlfG51bGx8W1xcXFx7XFxcXH1cXFxcW1xcXFxdXXxcIitlK1wifFwiK2krXCIpXCIsXCJnXCIpO3ZhciBrPW5ldyBSZWdFeHAoXCJcXFxcXFxcXCg/OihbXnVdKXx1KC57NH0pKVwiLFwiZ1wiKTt2YXIgZz17J1wiJzonXCInLFwiL1wiOlwiL1wiLFwiXFxcXFwiOlwiXFxcXFwiLGI6XCJcXGJcIixmOlwiXFxmXCIsbjpcIlxcblwiLHI6XCJcXHJcIix0OlwiXFx0XCJ9O2Z1bmN0aW9uIGgobCxtLG4pe3JldHVybiBtP2dbbV06U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChuLDE2KSl9dmFyIGM9bmV3IFN0cmluZyhcIlwiKTt2YXIgYT1cIlxcXFxcIjt2YXIgZj17XCJ7XCI6T2JqZWN0LFwiW1wiOkFycmF5fTt2YXIgYj1PYmplY3QuaGFzT3duUHJvcGVydHk7cmV0dXJuIGZ1bmN0aW9uKHUscSl7dmFyIHA9dS5tYXRjaChkKTt2YXIgeDt2YXIgdj1wWzBdO3ZhciBsPWZhbHNlO2lmKFwie1wiPT09dil7eD17fX1lbHNle2lmKFwiW1wiPT09dil7eD1bXX1lbHNle3g9W107bD10cnVlfX12YXIgdDt2YXIgcj1beF07Zm9yKHZhciBvPTEtbCxtPXAubGVuZ3RoO288bTsrK28pe3Y9cFtvXTt2YXIgdztzd2l0Y2godi5jaGFyQ29kZUF0KDApKXtkZWZhdWx0Onc9clswXTt3W3R8fHcubGVuZ3RoXT0rKHYpO3Q9dm9pZCAwO2JyZWFrO2Nhc2UgMzQ6dj12LnN1YnN0cmluZygxLHYubGVuZ3RoLTEpO2lmKHYuaW5kZXhPZihhKSE9PS0xKXt2PXYucmVwbGFjZShrLGgpfXc9clswXTtpZighdCl7aWYodyBpbnN0YW5jZW9mIEFycmF5KXt0PXcubGVuZ3RofWVsc2V7dD12fHxjO2JyZWFrfX13W3RdPXY7dD12b2lkIDA7YnJlYWs7Y2FzZSA5MTp3PXJbMF07ci51bnNoaWZ0KHdbdHx8dy5sZW5ndGhdPVtdKTt0PXZvaWQgMDticmVhaztjYXNlIDkzOnIuc2hpZnQoKTticmVhaztjYXNlIDEwMjp3PXJbMF07d1t0fHx3Lmxlbmd0aF09ZmFsc2U7dD12b2lkIDA7YnJlYWs7Y2FzZSAxMTA6dz1yWzBdO3dbdHx8dy5sZW5ndGhdPW51bGw7dD12b2lkIDA7YnJlYWs7Y2FzZSAxMTY6dz1yWzBdO3dbdHx8dy5sZW5ndGhdPXRydWU7dD12b2lkIDA7YnJlYWs7Y2FzZSAxMjM6dz1yWzBdO3IudW5zaGlmdCh3W3R8fHcubGVuZ3RoXT17fSk7dD12b2lkIDA7YnJlYWs7Y2FzZSAxMjU6ci5zaGlmdCgpO2JyZWFrfX1pZihsKXtpZihyLmxlbmd0aCE9PTEpe3Rocm93IG5ldyBFcnJvcigpfXg9eFswXX1lbHNle2lmKHIubGVuZ3RoKXt0aHJvdyBuZXcgRXJyb3IoKX19aWYocSl7dmFyIHM9ZnVuY3Rpb24oQyxCKXt2YXIgRD1DW0JdO2lmKEQmJnR5cGVvZiBEPT09XCJvYmplY3RcIil7dmFyIG49bnVsbDtmb3IodmFyIHogaW4gRCl7aWYoYi5jYWxsKEQseikmJkQhPT1DKXt2YXIgeT1zKEQseik7aWYoeSE9PXZvaWQgMCl7RFt6XT15fWVsc2V7aWYoIW4pe249W119bi5wdXNoKHopfX19aWYobil7Zm9yKHZhciBBPW4ubGVuZ3RoOy0tQT49MDspe2RlbGV0ZSBEW25bQV1dfX19cmV0dXJuIHEuY2FsbChDLEIsRCl9O3g9cyh7XCJcIjp4fSxcIlwiKX1yZXR1cm4geH19KSgpO1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjE9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEpe0tKVVIuYXNuMT17fX1LSlVSLmFzbjEuQVNOMVV0aWw9bmV3IGZ1bmN0aW9uKCl7dGhpcy5pbnRlZ2VyVG9CeXRlSGV4PWZ1bmN0aW9uKGEpe3ZhciBiPWEudG9TdHJpbmcoMTYpO2lmKChiLmxlbmd0aCUyKT09MSl7Yj1cIjBcIitifXJldHVybiBifTt0aGlzLmJpZ0ludFRvTWluVHdvc0NvbXBsZW1lbnRzSGV4PWZ1bmN0aW9uKGope3ZhciBmPWoudG9TdHJpbmcoMTYpO2lmKGYuc3Vic3RyKDAsMSkhPVwiLVwiKXtpZihmLmxlbmd0aCUyPT0xKXtmPVwiMFwiK2Z9ZWxzZXtpZighZi5tYXRjaCgvXlswLTddLykpe2Y9XCIwMFwiK2Z9fX1lbHNle3ZhciBhPWYuc3Vic3RyKDEpO3ZhciBlPWEubGVuZ3RoO2lmKGUlMj09MSl7ZSs9MX1lbHNle2lmKCFmLm1hdGNoKC9eWzAtN10vKSl7ZSs9Mn19dmFyIGc9XCJcIjtmb3IodmFyIGQ9MDtkPGU7ZCsrKXtnKz1cImZcIn12YXIgYz1uZXcgQmlnSW50ZWdlcihnLDE2KTt2YXIgYj1jLnhvcihqKS5hZGQoQmlnSW50ZWdlci5PTkUpO2Y9Yi50b1N0cmluZygxNikucmVwbGFjZSgvXi0vLFwiXCIpfXJldHVybiBmfTt0aGlzLmdldFBFTVN0cmluZ0Zyb21IZXg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gaGV4dG9wZW0oYSxiKX07dGhpcy5uZXdPYmplY3Q9ZnVuY3Rpb24oayl7dmFyIEY9S0pVUixvPUYuYXNuMSx2PW8uQVNOMU9iamVjdCxCPW8uREVSQm9vbGVhbixlPW8uREVSSW50ZWdlcix0PW8uREVSQml0U3RyaW5nLGg9by5ERVJPY3RldFN0cmluZyx4PW8uREVSTnVsbCx5PW8uREVST2JqZWN0SWRlbnRpZmllcixtPW8uREVSRW51bWVyYXRlZCxnPW8uREVSVVRGOFN0cmluZyxmPW8uREVSTnVtZXJpY1N0cmluZyxBPW8uREVSUHJpbnRhYmxlU3RyaW5nLHc9by5ERVJUZWxldGV4U3RyaW5nLHE9by5ERVJJQTVTdHJpbmcsRT1vLkRFUlVUQ1RpbWUsaj1vLkRFUkdlbmVyYWxpemVkVGltZSxiPW8uREVSVmlzaWJsZVN0cmluZyxsPW8uREVSQk1QU3RyaW5nLG49by5ERVJTZXF1ZW5jZSxjPW8uREVSU2V0LHM9by5ERVJUYWdnZWRPYmplY3QscD1vLkFTTjFVdGlsLm5ld09iamVjdDtpZihrIGluc3RhbmNlb2Ygby5BU04xT2JqZWN0KXtyZXR1cm4ga312YXIgdT1PYmplY3Qua2V5cyhrKTtpZih1Lmxlbmd0aCE9MSl7dGhyb3cgbmV3IEVycm9yKFwia2V5IG9mIHBhcmFtIHNoYWxsIGJlIG9ubHkgb25lLlwiKX12YXIgSD11WzBdO2lmKFwiOmFzbjE6Ym9vbDppbnQ6Yml0c3RyOm9jdHN0cjpudWxsOm9pZDplbnVtOnV0ZjhzdHI6bnVtc3RyOnBybnN0cjp0ZWxzdHI6aWE1c3RyOnV0Y3RpbWU6Z2VudGltZTp2aXNzdHI6Ym1wc3RyOnNlcTpzZXQ6dGFnOlwiLmluZGV4T2YoXCI6XCIrSCtcIjpcIik9PS0xKXt0aHJvdyBuZXcgRXJyb3IoXCJ1bmRlZmluZWQga2V5OiBcIitIKX1pZihIPT1cImJvb2xcIil7cmV0dXJuIG5ldyBCKGtbSF0pfWlmKEg9PVwiaW50XCIpe3JldHVybiBuZXcgZShrW0hdKX1pZihIPT1cImJpdHN0clwiKXtyZXR1cm4gbmV3IHQoa1tIXSl9aWYoSD09XCJvY3RzdHJcIil7cmV0dXJuIG5ldyBoKGtbSF0pfWlmKEg9PVwibnVsbFwiKXtyZXR1cm4gbmV3IHgoa1tIXSl9aWYoSD09XCJvaWRcIil7cmV0dXJuIG5ldyB5KGtbSF0pfWlmKEg9PVwiZW51bVwiKXtyZXR1cm4gbmV3IG0oa1tIXSl9aWYoSD09XCJ1dGY4c3RyXCIpe3JldHVybiBuZXcgZyhrW0hdKX1pZihIPT1cIm51bXN0clwiKXtyZXR1cm4gbmV3IGYoa1tIXSl9aWYoSD09XCJwcm5zdHJcIil7cmV0dXJuIG5ldyBBKGtbSF0pfWlmKEg9PVwidGVsc3RyXCIpe3JldHVybiBuZXcgdyhrW0hdKX1pZihIPT1cImlhNXN0clwiKXtyZXR1cm4gbmV3IHEoa1tIXSl9aWYoSD09XCJ1dGN0aW1lXCIpe3JldHVybiBuZXcgRShrW0hdKX1pZihIPT1cImdlbnRpbWVcIil7cmV0dXJuIG5ldyBqKGtbSF0pfWlmKEg9PVwidmlzc3RyXCIpe3JldHVybiBuZXcgYihrW0hdKX1pZihIPT1cImJtcHN0clwiKXtyZXR1cm4gbmV3IGwoa1tIXSl9aWYoSD09XCJhc24xXCIpe3JldHVybiBuZXcgdihrW0hdKX1pZihIPT1cInNlcVwiKXt2YXIgZD1rW0hdO3ZhciBHPVtdO2Zvcih2YXIgej0wO3o8ZC5sZW5ndGg7eisrKXt2YXIgRD1wKGRbel0pO0cucHVzaChEKX1yZXR1cm4gbmV3IG4oe2FycmF5Okd9KX1pZihIPT1cInNldFwiKXt2YXIgZD1rW0hdO3ZhciBHPVtdO2Zvcih2YXIgej0wO3o8ZC5sZW5ndGg7eisrKXt2YXIgRD1wKGRbel0pO0cucHVzaChEKX1yZXR1cm4gbmV3IGMoe2FycmF5Okd9KX1pZihIPT1cInRhZ1wiKXt2YXIgQz1rW0hdO2lmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChDKT09PVwiW29iamVjdCBBcnJheV1cIiYmQy5sZW5ndGg9PTMpe3ZhciByPXAoQ1syXSk7cmV0dXJuIG5ldyBzKHt0YWc6Q1swXSxleHBsaWNpdDpDWzFdLG9iajpyfSl9ZWxzZXtyZXR1cm4gbmV3IHMoQyl9fX07dGhpcy5qc29uVG9BU04xSEVYPWZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMubmV3T2JqZWN0KGIpO3JldHVybiBhLmdldEVuY29kZWRIZXgoKX19O0tKVVIuYXNuMS5BU04xVXRpbC5vaWRIZXhUb0ludD1mdW5jdGlvbihhKXt2YXIgaj1cIlwiO3ZhciBrPXBhcnNlSW50KGEuc3Vic3RyKDAsMiksMTYpO3ZhciBkPU1hdGguZmxvb3Ioay80MCk7dmFyIGM9ayU0MDt2YXIgaj1kK1wiLlwiK2M7dmFyIGU9XCJcIjtmb3IodmFyIGY9MjtmPGEubGVuZ3RoO2YrPTIpe3ZhciBnPXBhcnNlSW50KGEuc3Vic3RyKGYsMiksMTYpO3ZhciBoPShcIjAwMDAwMDAwXCIrZy50b1N0cmluZygyKSkuc2xpY2UoLTgpO2U9ZStoLnN1YnN0cigxLDcpO2lmKGguc3Vic3RyKDAsMSk9PVwiMFwiKXt2YXIgYj1uZXcgQmlnSW50ZWdlcihlLDIpO2o9aitcIi5cIitiLnRvU3RyaW5nKDEwKTtlPVwiXCJ9fXJldHVybiBqfTtLSlVSLmFzbjEuQVNOMVV0aWwub2lkSW50VG9IZXg9ZnVuY3Rpb24oZil7dmFyIGU9ZnVuY3Rpb24oYSl7dmFyIGs9YS50b1N0cmluZygxNik7aWYoay5sZW5ndGg9PTEpe2s9XCIwXCIra31yZXR1cm4ga307dmFyIGQ9ZnVuY3Rpb24obyl7dmFyIG49XCJcIjt2YXIgaz1uZXcgQmlnSW50ZWdlcihvLDEwKTt2YXIgYT1rLnRvU3RyaW5nKDIpO3ZhciBsPTctYS5sZW5ndGglNztpZihsPT03KXtsPTB9dmFyIHE9XCJcIjtmb3IodmFyIG09MDttPGw7bSsrKXtxKz1cIjBcIn1hPXErYTtmb3IodmFyIG09MDttPGEubGVuZ3RoLTE7bSs9Nyl7dmFyIHA9YS5zdWJzdHIobSw3KTtpZihtIT1hLmxlbmd0aC03KXtwPVwiMVwiK3B9bis9ZShwYXJzZUludChwLDIpKX1yZXR1cm4gbn07aWYoIWYubWF0Y2goL15bMC05Ll0rJC8pKXt0aHJvd1wibWFsZm9ybWVkIG9pZCBzdHJpbmc6IFwiK2Z9dmFyIGc9XCJcIjt2YXIgYj1mLnNwbGl0KFwiLlwiKTt2YXIgaj1wYXJzZUludChiWzBdKSo0MCtwYXJzZUludChiWzFdKTtnKz1lKGopO2Iuc3BsaWNlKDAsMik7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe2crPWQoYltjXSl9cmV0dXJuIGd9O0tKVVIuYXNuMS5BU04xT2JqZWN0PWZ1bmN0aW9uKGUpe3ZhciBjPXRydWU7dmFyIGI9bnVsbDt2YXIgZD1cIjAwXCI7dmFyIGY9XCIwMFwiO3ZhciBhPVwiXCI7dGhpcy5wYXJhbXM9bnVsbDt0aGlzLmdldExlbmd0aEhleEZyb21WYWx1ZT1mdW5jdGlvbigpe2lmKHR5cGVvZiB0aGlzLmhWPT1cInVuZGVmaW5lZFwifHx0aGlzLmhWPT1udWxsKXt0aHJvdyBuZXcgRXJyb3IoXCJ0aGlzLmhWIGlzIG51bGwgb3IgdW5kZWZpbmVkXCIpfWlmKHRoaXMuaFYubGVuZ3RoJTI9PTEpe3Rocm93IG5ldyBFcnJvcihcInZhbHVlIGhleCBtdXN0IGJlIGV2ZW4gbGVuZ3RoOiBuPVwiK2EubGVuZ3RoK1wiLHY9XCIrdGhpcy5oVil9dmFyIGo9dGhpcy5oVi5sZW5ndGgvMjt2YXIgaT1qLnRvU3RyaW5nKDE2KTtpZihpLmxlbmd0aCUyPT0xKXtpPVwiMFwiK2l9aWYoajwxMjgpe3JldHVybiBpfWVsc2V7dmFyIGg9aS5sZW5ndGgvMjtpZihoPjE1KXt0aHJvd1wiQVNOLjEgbGVuZ3RoIHRvbyBsb25nIHRvIHJlcHJlc2VudCBieSA4eDogbiA9IFwiK2oudG9TdHJpbmcoMTYpfXZhciBnPTEyOCtoO3JldHVybiBnLnRvU3RyaW5nKDE2KStpfX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5oVExWPT1udWxsfHx0aGlzLmlzTW9kaWZpZWQpe3RoaXMuaFY9dGhpcy5nZXRGcmVzaFZhbHVlSGV4KCk7dGhpcy5oTD10aGlzLmdldExlbmd0aEhleEZyb21WYWx1ZSgpO3RoaXMuaFRMVj10aGlzLmhUK3RoaXMuaEwrdGhpcy5oVjt0aGlzLmlzTW9kaWZpZWQ9ZmFsc2V9cmV0dXJuIHRoaXMuaFRMVn07dGhpcy5nZXRWYWx1ZUhleD1mdW5jdGlvbigpe3RoaXMuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhWfTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm5cIlwifTt0aGlzLnNldEJ5UGFyYW09ZnVuY3Rpb24oZyl7dGhpcy5wYXJhbXM9Z307aWYoZSE9dW5kZWZpbmVkKXtpZihlLnRsdiE9dW5kZWZpbmVkKXt0aGlzLmhUTFY9ZS50bHY7dGhpcy5pc01vZGlmaWVkPWZhbHNlfX19O0tKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZz1mdW5jdGlvbihjKXtLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBiPW51bGw7dmFyIGE9bnVsbDt0aGlzLmdldFN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN9O3RoaXMuc2V0U3RyaW5nPWZ1bmN0aW9uKGQpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMucz1kO3RoaXMuaFY9dXRmOHRvaGV4KHRoaXMucykudG9Mb3dlckNhc2UoKX07dGhpcy5zZXRTdHJpbmdIZXg9ZnVuY3Rpb24oZCl7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5zPW51bGw7dGhpcy5oVj1kfTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjPT1cInN0cmluZ1wiKXt0aGlzLnNldFN0cmluZyhjKX1lbHNle2lmKHR5cGVvZiBjLnN0ciE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRTdHJpbmcoYy5zdHIpfWVsc2V7aWYodHlwZW9mIGMuaGV4IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFN0cmluZ0hleChjLmhleCl9fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJBYnN0cmFjdFRpbWU9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLkRFUkFic3RyYWN0VGltZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGI9bnVsbDt2YXIgYT1udWxsO3RoaXMubG9jYWxEYXRlVG9VVEM9ZnVuY3Rpb24oZyl7dmFyIGU9Zy5nZXRUaW1lKCkrKGcuZ2V0VGltZXpvbmVPZmZzZXQoKSo2MDAwMCk7dmFyIGY9bmV3IERhdGUoZSk7cmV0dXJuIGZ9O3RoaXMuZm9ybWF0RGF0ZT1mdW5jdGlvbihtLG8sZSl7dmFyIGc9dGhpcy56ZXJvUGFkZGluZzt2YXIgbj10aGlzLmxvY2FsRGF0ZVRvVVRDKG0pO3ZhciBwPVN0cmluZyhuLmdldEZ1bGxZZWFyKCkpO2lmKG89PVwidXRjXCIpe3A9cC5zdWJzdHIoMiwyKX12YXIgbD1nKFN0cmluZyhuLmdldE1vbnRoKCkrMSksMik7dmFyIHE9ZyhTdHJpbmcobi5nZXREYXRlKCkpLDIpO3ZhciBoPWcoU3RyaW5nKG4uZ2V0SG91cnMoKSksMik7dmFyIGk9ZyhTdHJpbmcobi5nZXRNaW51dGVzKCkpLDIpO3ZhciBqPWcoU3RyaW5nKG4uZ2V0U2Vjb25kcygpKSwyKTt2YXIgcj1wK2wrcStoK2krajtpZihlPT09dHJ1ZSl7dmFyIGY9bi5nZXRNaWxsaXNlY29uZHMoKTtpZihmIT0wKXt2YXIgaz1nKFN0cmluZyhmKSwzKTtrPWsucmVwbGFjZSgvWzBdKyQvLFwiXCIpO3I9citcIi5cIitrfX1yZXR1cm4gcitcIlpcIn07dGhpcy56ZXJvUGFkZGluZz1mdW5jdGlvbihlLGQpe2lmKGUubGVuZ3RoPj1kKXtyZXR1cm4gZX1yZXR1cm4gbmV3IEFycmF5KGQtZS5sZW5ndGgrMSkuam9pbihcIjBcIikrZX07dGhpcy5nZXRTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfTt0aGlzLnNldFN0cmluZz1mdW5jdGlvbihkKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLnM9ZDt0aGlzLmhWPXN0b2hleChkKX07dGhpcy5zZXRCeURhdGVWYWx1ZT1mdW5jdGlvbihoLGosZSxkLGYsZyl7dmFyIGk9bmV3IERhdGUoRGF0ZS5VVEMoaCxqLTEsZSxkLGYsZywwKSk7dGhpcy5zZXRCeURhdGUoaSl9O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhWfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkFic3RyYWN0VGltZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUkFic3RyYWN0U3RydWN0dXJlZD1mdW5jdGlvbihiKXtLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPW51bGw7dGhpcy5zZXRCeUFTTjFPYmplY3RBcnJheT1mdW5jdGlvbihjKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLmFzbjFBcnJheT1jfTt0aGlzLmFwcGVuZEFTTjFPYmplY3Q9ZnVuY3Rpb24oYyl7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5hc24xQXJyYXkucHVzaChjKX07dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLmFycmF5IT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFBcnJheT1iLmFycmF5fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cnVjdHVyZWQsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJCb29sZWFuPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJCb29sZWFuLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmhUPVwiMDFcIjtpZihhPT1mYWxzZSl7dGhpcy5oVExWPVwiMDEwMTAwXCJ9ZWxzZXt0aGlzLmhUTFY9XCIwMTAxZmZcIn19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJCb29sZWFuLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuREVSSW50ZWdlcj1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSSW50ZWdlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5oVD1cIjAyXCI7dGhpcy5zZXRCeUJpZ0ludGVnZXI9ZnVuY3Rpb24oYil7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5oVj1LSlVSLmFzbjEuQVNOMVV0aWwuYmlnSW50VG9NaW5Ud29zQ29tcGxlbWVudHNIZXgoYil9O3RoaXMuc2V0QnlJbnRlZ2VyPWZ1bmN0aW9uKGMpe3ZhciBiPW5ldyBCaWdJbnRlZ2VyKFN0cmluZyhjKSwxMCk7dGhpcy5zZXRCeUJpZ0ludGVnZXIoYil9O3RoaXMuc2V0VmFsdWVIZXg9ZnVuY3Rpb24oYil7dGhpcy5oVj1ifTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhLmJpZ2ludCE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeUJpZ0ludGVnZXIoYS5iaWdpbnQpfWVsc2V7aWYodHlwZW9mIGFbXCJpbnRcIl0hPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlJbnRlZ2VyKGFbXCJpbnRcIl0pfWVsc2V7aWYodHlwZW9mIGE9PVwibnVtYmVyXCIpe3RoaXMuc2V0QnlJbnRlZ2VyKGEpfWVsc2V7aWYodHlwZW9mIGEuaGV4IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFZhbHVlSGV4KGEuaGV4KX19fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSSW50ZWdlcixLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUkJpdFN0cmluZz1mdW5jdGlvbihiKXtpZihiIT09dW5kZWZpbmVkJiZ0eXBlb2YgYi5vYmohPT1cInVuZGVmaW5lZFwiKXt2YXIgYT1LSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KGIub2JqKTtiLmhleD1cIjAwXCIrYS5nZXRFbmNvZGVkSGV4KCl9S0pVUi5hc24xLkRFUkJpdFN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5oVD1cIjAzXCI7dGhpcy5zZXRIZXhWYWx1ZUluY2x1ZGluZ1VudXNlZEJpdHM9ZnVuY3Rpb24oYyl7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5oVj1jfTt0aGlzLnNldFVudXNlZEJpdHNBbmRIZXhWYWx1ZT1mdW5jdGlvbihjLGUpe2lmKGM8MHx8NzxjKXt0aHJvd1widW51c2VkIGJpdHMgc2hhbGwgYmUgZnJvbSAwIHRvIDc6IHUgPSBcIitjfXZhciBkPVwiMFwiK2M7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5oVj1kK2V9O3RoaXMuc2V0QnlCaW5hcnlTdHJpbmc9ZnVuY3Rpb24oZSl7ZT1lLnJlcGxhY2UoLzArJC8sXCJcIik7dmFyIGY9OC1lLmxlbmd0aCU4O2lmKGY9PTgpe2Y9MH1mb3IodmFyIGc9MDtnPD1mO2crKyl7ZSs9XCIwXCJ9dmFyIGo9XCJcIjtmb3IodmFyIGc9MDtnPGUubGVuZ3RoLTE7Zys9OCl7dmFyIGQ9ZS5zdWJzdHIoZyw4KTt2YXIgYz1wYXJzZUludChkLDIpLnRvU3RyaW5nKDE2KTtpZihjLmxlbmd0aD09MSl7Yz1cIjBcIitjfWorPWN9dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5oVj1cIjBcIitmK2p9O3RoaXMuc2V0QnlCb29sZWFuQXJyYXk9ZnVuY3Rpb24oZSl7dmFyIGQ9XCJcIjtmb3IodmFyIGM9MDtjPGUubGVuZ3RoO2MrKyl7aWYoZVtjXT09dHJ1ZSl7ZCs9XCIxXCJ9ZWxzZXtkKz1cIjBcIn19dGhpcy5zZXRCeUJpbmFyeVN0cmluZyhkKX07dGhpcy5uZXdGYWxzZUFycmF5PWZ1bmN0aW9uKGUpe3ZhciBjPW5ldyBBcnJheShlKTtmb3IodmFyIGQ9MDtkPGU7ZCsrKXtjW2RdPWZhbHNlfXJldHVybiBjfTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiPT1cInN0cmluZ1wiJiZiLnRvTG93ZXJDYXNlKCkubWF0Y2goL15bMC05YS1mXSskLykpe3RoaXMuc2V0SGV4VmFsdWVJbmNsdWRpbmdVbnVzZWRCaXRzKGIpfWVsc2V7aWYodHlwZW9mIGIuaGV4IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEhleFZhbHVlSW5jbHVkaW5nVW51c2VkQml0cyhiLmhleCl9ZWxzZXtpZih0eXBlb2YgYi5iaW4hPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlCaW5hcnlTdHJpbmcoYi5iaW4pfWVsc2V7aWYodHlwZW9mIGIuYXJyYXkhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlCb29sZWFuQXJyYXkoYi5hcnJheSl9fX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkJpdFN0cmluZyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nPWZ1bmN0aW9uKGIpe2lmKGIhPT11bmRlZmluZWQmJnR5cGVvZiBiLm9iaiE9PVwidW5kZWZpbmVkXCIpe3ZhciBhPUtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3QoYi5vYmopO2IuaGV4PWEuZ2V0RW5jb2RlZEhleCgpfUtKVVIuYXNuMS5ERVJPY3RldFN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxiKTt0aGlzLmhUPVwiMDRcIn07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyk7S0pVUi5hc24xLkRFUk51bGw9ZnVuY3Rpb24oKXtLSlVSLmFzbjEuREVSTnVsbC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5oVD1cIjA1XCI7dGhpcy5oVExWPVwiMDUwMFwifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSTnVsbCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXI9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCIwNlwiO3RoaXMuc2V0VmFsdWVIZXg9ZnVuY3Rpb24oYil7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5zPW51bGw7dGhpcy5oVj1ifTt0aGlzLnNldFZhbHVlT2lkU3RyaW5nPWZ1bmN0aW9uKGIpe3ZhciBjPW9pZHRvaGV4KGIpO2lmKGM9PW51bGwpe3Rocm93IG5ldyBFcnJvcihcIm1hbGZvcm1lZCBvaWQgc3RyaW5nOiBcIitiKX10aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLnM9bnVsbDt0aGlzLmhWPWN9O3RoaXMuc2V0VmFsdWVOYW1lPWZ1bmN0aW9uKGMpe3ZhciBiPUtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZChjKTtpZihiIT09XCJcIil7dGhpcy5zZXRWYWx1ZU9pZFN0cmluZyhiKX1lbHNle3Rocm93IG5ldyBFcnJvcihcIkRFUk9iamVjdElkZW50aWZpZXIgb2lkTmFtZSB1bmRlZmluZWQ6IFwiK2MpfX07dGhpcy5zZXRWYWx1ZU5hbWVPck9pZD1mdW5jdGlvbihiKXtpZihiLm1hdGNoKC9eWzAtMl0uWzAtOS5dKyQvKSl7dGhpcy5zZXRWYWx1ZU9pZFN0cmluZyhiKX1lbHNle3RoaXMuc2V0VmFsdWVOYW1lKGIpfX07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9O3RoaXMuc2V0QnlQYXJhbT1mdW5jdGlvbihiKXtpZih0eXBlb2YgYj09PVwic3RyaW5nXCIpe3RoaXMuc2V0VmFsdWVOYW1lT3JPaWQoYil9ZWxzZXtpZihiLm9pZCE9PXVuZGVmaW5lZCl7dGhpcy5zZXRWYWx1ZU5hbWVPck9pZChiLm9pZCl9ZWxzZXtpZihiLm5hbWUhPT11bmRlZmluZWQpe3RoaXMuc2V0VmFsdWVOYW1lT3JPaWQoYi5uYW1lKX1lbHNle2lmKGIuaGV4IT09dW5kZWZpbmVkKXt0aGlzLnNldFZhbHVlSGV4KGIuaGV4KX19fX19O2lmKGEhPT11bmRlZmluZWQpe3RoaXMuc2V0QnlQYXJhbShhKX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuREVSRW51bWVyYXRlZD1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSRW51bWVyYXRlZC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5oVD1cIjBhXCI7dGhpcy5zZXRCeUJpZ0ludGVnZXI9ZnVuY3Rpb24oYil7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5oVj1LSlVSLmFzbjEuQVNOMVV0aWwuYmlnSW50VG9NaW5Ud29zQ29tcGxlbWVudHNIZXgoYil9O3RoaXMuc2V0QnlJbnRlZ2VyPWZ1bmN0aW9uKGMpe3ZhciBiPW5ldyBCaWdJbnRlZ2VyKFN0cmluZyhjKSwxMCk7dGhpcy5zZXRCeUJpZ0ludGVnZXIoYil9O3RoaXMuc2V0VmFsdWVIZXg9ZnVuY3Rpb24oYil7dGhpcy5oVj1ifTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhW1wiaW50XCJdIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5SW50ZWdlcihhW1wiaW50XCJdKX1lbHNle2lmKHR5cGVvZiBhPT1cIm51bWJlclwiKXt0aGlzLnNldEJ5SW50ZWdlcihhKX1lbHNle2lmKHR5cGVvZiBhLmhleCE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRWYWx1ZUhleChhLmhleCl9fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSRW51bWVyYXRlZCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUlVURjhTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUlVURjhTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjBjXCJ9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJVVEY4U3RyaW5nLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyk7S0pVUi5hc24xLkRFUk51bWVyaWNTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUk51bWVyaWNTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjEyXCJ9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJOdW1lcmljU3RyaW5nLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyk7S0pVUi5hc24xLkRFUlByaW50YWJsZVN0cmluZz1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSUHJpbnRhYmxlU3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIxM1wifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSUHJpbnRhYmxlU3RyaW5nLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyk7S0pVUi5hc24xLkRFUlRlbGV0ZXhTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUlRlbGV0ZXhTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjE0XCJ9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJUZWxldGV4U3RyaW5nLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyk7S0pVUi5hc24xLkRFUklBNVN0cmluZz1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSSUE1U3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIxNlwifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSSUE1U3RyaW5nLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyk7S0pVUi5hc24xLkRFUlZpc2libGVTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUklBNVN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMWFcIn07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlZpc2libGVTdHJpbmcsS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nKTtLSlVSLmFzbjEuREVSQk1QU3RyaW5nPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJCTVBTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjFlXCJ9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJCTVBTdHJpbmcsS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nKTtLSlVSLmFzbjEuREVSVVRDVGltZT1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSVVRDVGltZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMTdcIjt0aGlzLnNldEJ5RGF0ZT1mdW5jdGlvbihiKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLmRhdGU9Yjt0aGlzLnM9dGhpcy5mb3JtYXREYXRlKHRoaXMuZGF0ZSxcInV0Y1wiKTt0aGlzLmhWPXN0b2hleCh0aGlzLnMpfTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtpZih0eXBlb2YgdGhpcy5kYXRlPT1cInVuZGVmaW5lZFwiJiZ0eXBlb2YgdGhpcy5zPT1cInVuZGVmaW5lZFwiKXt0aGlzLmRhdGU9bmV3IERhdGUoKTt0aGlzLnM9dGhpcy5mb3JtYXREYXRlKHRoaXMuZGF0ZSxcInV0Y1wiKTt0aGlzLmhWPXN0b2hleCh0aGlzLnMpfXJldHVybiB0aGlzLmhWfTtpZihhIT09dW5kZWZpbmVkKXtpZihhLnN0ciE9PXVuZGVmaW5lZCl7dGhpcy5zZXRTdHJpbmcoYS5zdHIpfWVsc2V7aWYodHlwZW9mIGE9PVwic3RyaW5nXCImJmEubWF0Y2goL15bMC05XXsxMn1aJC8pKXt0aGlzLnNldFN0cmluZyhhKX1lbHNle2lmKGEuaGV4IT09dW5kZWZpbmVkKXt0aGlzLnNldFN0cmluZ0hleChhLmhleCl9ZWxzZXtpZihhLmRhdGUhPT11bmRlZmluZWQpe3RoaXMuc2V0QnlEYXRlKGEuZGF0ZSl9fX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlVUQ1RpbWUsS0pVUi5hc24xLkRFUkFic3RyYWN0VGltZSk7S0pVUi5hc24xLkRFUkdlbmVyYWxpemVkVGltZT1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIxOFwiO3RoaXMud2l0aE1pbGxpcz1mYWxzZTt0aGlzLnNldEJ5RGF0ZT1mdW5jdGlvbihiKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLmRhdGU9Yjt0aGlzLnM9dGhpcy5mb3JtYXREYXRlKHRoaXMuZGF0ZSxcImdlblwiLHRoaXMud2l0aE1pbGxpcyk7dGhpcy5oVj1zdG9oZXgodGhpcy5zKX07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5kYXRlPT09dW5kZWZpbmVkJiZ0aGlzLnM9PT11bmRlZmluZWQpe3RoaXMuZGF0ZT1uZXcgRGF0ZSgpO3RoaXMucz10aGlzLmZvcm1hdERhdGUodGhpcy5kYXRlLFwiZ2VuXCIsdGhpcy53aXRoTWlsbGlzKTt0aGlzLmhWPXN0b2hleCh0aGlzLnMpfXJldHVybiB0aGlzLmhWfTtpZihhIT09dW5kZWZpbmVkKXtpZihhLnN0ciE9PXVuZGVmaW5lZCl7dGhpcy5zZXRTdHJpbmcoYS5zdHIpfWVsc2V7aWYodHlwZW9mIGE9PVwic3RyaW5nXCImJmEubWF0Y2goL15bMC05XXsxNH1aJC8pKXt0aGlzLnNldFN0cmluZyhhKX1lbHNle2lmKGEuaGV4IT09dW5kZWZpbmVkKXt0aGlzLnNldFN0cmluZ0hleChhLmhleCl9ZWxzZXtpZihhLmRhdGUhPT11bmRlZmluZWQpe3RoaXMuc2V0QnlEYXRlKGEuZGF0ZSl9fX19aWYoYS5taWxsaXM9PT10cnVlKXt0aGlzLndpdGhNaWxsaXM9dHJ1ZX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFRpbWUpO0tKVVIuYXNuMS5ERVJTZXF1ZW5jZT1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSU2VxdWVuY2Uuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjMwXCI7dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7dmFyIGM9XCJcIjtmb3IodmFyIGI9MDtiPHRoaXMuYXNuMUFycmF5Lmxlbmd0aDtiKyspe3ZhciBkPXRoaXMuYXNuMUFycmF5W2JdO2MrPWQuZ2V0RW5jb2RlZEhleCgpfXRoaXMuaFY9YztyZXR1cm4gdGhpcy5oVn19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJ1Y3R1cmVkKTtLSlVSLmFzbjEuREVSU2V0PWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJTZXQuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjMxXCI7dGhpcy5zb3J0RmxhZz10cnVlO3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3ZhciBiPW5ldyBBcnJheSgpO2Zvcih2YXIgYz0wO2M8dGhpcy5hc24xQXJyYXkubGVuZ3RoO2MrKyl7dmFyIGQ9dGhpcy5hc24xQXJyYXlbY107Yi5wdXNoKGQuZ2V0RW5jb2RlZEhleCgpKX1pZih0aGlzLnNvcnRGbGFnPT10cnVlKXtiLnNvcnQoKX10aGlzLmhWPWIuam9pbihcIlwiKTtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhLnNvcnRmbGFnIT1cInVuZGVmaW5lZFwiJiZhLnNvcnRmbGFnPT1mYWxzZSl7dGhpcy5zb3J0RmxhZz1mYWxzZX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSU2V0LEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cnVjdHVyZWQpO0tKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3Q9ZnVuY3Rpb24oYil7S0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3RoaXMuaFQ9XCJhMFwiO3RoaXMuaFY9XCJcIjt0aGlzLmlzRXhwbGljaXQ9dHJ1ZTt0aGlzLmFzbjFPYmplY3Q9bnVsbDt0aGlzLnNldEFTTjFPYmplY3Q9ZnVuY3Rpb24oYyxkLGUpe3RoaXMuaFQ9ZDt0aGlzLmlzRXhwbGljaXQ9Yzt0aGlzLmFzbjFPYmplY3Q9ZTtpZih0aGlzLmlzRXhwbGljaXQpe3RoaXMuaFY9dGhpcy5hc24xT2JqZWN0LmdldEVuY29kZWRIZXgoKTt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZX1lbHNle3RoaXMuaFY9bnVsbDt0aGlzLmhUTFY9ZS5nZXRFbmNvZGVkSGV4KCk7dGhpcy5oVExWPXRoaXMuaFRMVi5yZXBsYWNlKC9eLi4vLGQpO3RoaXMuaXNNb2RpZmllZD1mYWxzZX19O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhWfTt0aGlzLnNldEJ5UGFyYW09ZnVuY3Rpb24oYyl7aWYoYy50YWchPXVuZGVmaW5lZCl7dGhpcy5oVD1jLnRhZ31pZihjLmV4cGxpY2l0IT11bmRlZmluZWQpe3RoaXMuaXNFeHBsaWNpdD1jLmV4cGxpY2l0fWlmKGMudGFnZSE9dW5kZWZpbmVkKXt0aGlzLmhUPWMudGFnZTt0aGlzLmlzRXhwbGljaXQ9dHJ1ZX1pZihjLnRhZ2khPXVuZGVmaW5lZCl7dGhpcy5oVD1jLnRhZ2k7dGhpcy5pc0V4cGxpY2l0PWZhbHNlfWlmKGMub2JqIT11bmRlZmluZWQpe2lmKGMub2JqIGluc3RhbmNlb2YgYS5BU04xT2JqZWN0KXt0aGlzLmFzbjFPYmplY3Q9Yy5vYmo7dGhpcy5zZXRBU04xT2JqZWN0KHRoaXMuaXNFeHBsaWNpdCx0aGlzLmhULHRoaXMuYXNuMU9iamVjdCl9ZWxzZXtpZih0eXBlb2YgYy5vYmo9PVwib2JqZWN0XCIpe3RoaXMuYXNuMU9iamVjdD1hLkFTTjFVdGlsLm5ld09iamVjdChjLm9iaik7dGhpcy5zZXRBU04xT2JqZWN0KHRoaXMuaXNFeHBsaWNpdCx0aGlzLmhULHRoaXMuYXNuMU9iamVjdCl9fX19O2lmKGIhPXVuZGVmaW5lZCl7dGhpcy5zZXRCeVBhcmFtKGIpfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7XG52YXIgQVNOMUhFWD1uZXcgZnVuY3Rpb24oKXt9O0FTTjFIRVguZ2V0TGJsZW49ZnVuY3Rpb24oYyxhKXtpZihjLnN1YnN0cihhKzIsMSkhPVwiOFwiKXtyZXR1cm4gMX12YXIgYj1wYXJzZUludChjLnN1YnN0cihhKzMsMSkpO2lmKGI9PTApe3JldHVybiAtMX1pZigwPGImJmI8MTApe3JldHVybiBiKzF9cmV0dXJuIC0yfTtBU04xSEVYLmdldEw9ZnVuY3Rpb24oYyxiKXt2YXIgYT1BU04xSEVYLmdldExibGVuKGMsYik7aWYoYTwxKXtyZXR1cm5cIlwifXJldHVybiBjLnN1YnN0cihiKzIsYSoyKX07QVNOMUhFWC5nZXRWYmxlbj1mdW5jdGlvbihkLGEpe3ZhciBjLGI7Yz1BU04xSEVYLmdldEwoZCxhKTtpZihjPT1cIlwiKXtyZXR1cm4gLTF9aWYoYy5zdWJzdHIoMCwxKT09PVwiOFwiKXtiPW5ldyBCaWdJbnRlZ2VyKGMuc3Vic3RyKDIpLDE2KX1lbHNle2I9bmV3IEJpZ0ludGVnZXIoYywxNil9cmV0dXJuIGIuaW50VmFsdWUoKX07QVNOMUhFWC5nZXRWaWR4PWZ1bmN0aW9uKGMsYil7dmFyIGE9QVNOMUhFWC5nZXRMYmxlbihjLGIpO2lmKGE8MCl7cmV0dXJuIGF9cmV0dXJuIGIrKGErMSkqMn07QVNOMUhFWC5nZXRWPWZ1bmN0aW9uKGQsYSl7dmFyIGM9QVNOMUhFWC5nZXRWaWR4KGQsYSk7dmFyIGI9QVNOMUhFWC5nZXRWYmxlbihkLGEpO3JldHVybiBkLnN1YnN0cihjLGIqMil9O0FTTjFIRVguZ2V0VExWPWZ1bmN0aW9uKGIsYSl7cmV0dXJuIGIuc3Vic3RyKGEsMikrQVNOMUhFWC5nZXRMKGIsYSkrQVNOMUhFWC5nZXRWKGIsYSl9O0FTTjFIRVguZ2V0VExWYmxlbj1mdW5jdGlvbihiLGEpe3JldHVybiAyK0FTTjFIRVguZ2V0TGJsZW4oYixhKSoyK0FTTjFIRVguZ2V0VmJsZW4oYixhKSoyfTtBU04xSEVYLmdldE5leHRTaWJsaW5nSWR4PWZ1bmN0aW9uKGQsYSl7dmFyIGM9QVNOMUhFWC5nZXRWaWR4KGQsYSk7dmFyIGI9QVNOMUhFWC5nZXRWYmxlbihkLGEpO3JldHVybiBjK2IqMn07QVNOMUhFWC5nZXRDaGlsZElkeD1mdW5jdGlvbihlLGspe3ZhciBsPUFTTjFIRVg7dmFyIGo9W107dmFyIGMsZixnO2M9bC5nZXRWaWR4KGUsayk7Zj1sLmdldFZibGVuKGUsaykqMjtpZihlLnN1YnN0cihrLDIpPT1cIjAzXCIpe2MrPTI7Zi09Mn1nPTA7dmFyIGQ9Yzt3aGlsZShnPD1mKXt2YXIgYj1sLmdldFRMVmJsZW4oZSxkKTtnKz1iO2lmKGc8PWYpe2oucHVzaChkKX1kKz1iO2lmKGc+PWYpe2JyZWFrfX1yZXR1cm4gan07QVNOMUhFWC5nZXROdGhDaGlsZElkeD1mdW5jdGlvbihkLGIsZSl7dmFyIGM9QVNOMUhFWC5nZXRDaGlsZElkeChkLGIpO3JldHVybiBjW2VdfTtBU04xSEVYLmdldElkeGJ5TGlzdD1mdW5jdGlvbihlLGQsYyxpKXt2YXIgZz1BU04xSEVYO3ZhciBmLGI7aWYoYy5sZW5ndGg9PTApe2lmKGkhPT11bmRlZmluZWQpe2lmKGUuc3Vic3RyKGQsMikhPT1pKXtyZXR1cm4gLTF9fXJldHVybiBkfWY9Yy5zaGlmdCgpO2I9Zy5nZXRDaGlsZElkeChlLGQpO2lmKGY+PWIubGVuZ3RoKXtyZXR1cm4gLTF9cmV0dXJuIGcuZ2V0SWR4YnlMaXN0KGUsYltmXSxjLGkpfTtBU04xSEVYLmdldElkeGJ5TGlzdEV4PWZ1bmN0aW9uKGYsayxiLGcpe3ZhciBtPUFTTjFIRVg7dmFyIGQsbDtpZihiLmxlbmd0aD09MCl7aWYoZyE9PXVuZGVmaW5lZCl7aWYoZi5zdWJzdHIoaywyKSE9PWcpe3JldHVybiAtMX19cmV0dXJuIGt9ZD1iLnNoaWZ0KCk7bD1tLmdldENoaWxkSWR4KGYsayk7dmFyIGo9MDtmb3IodmFyIGU9MDtlPGwubGVuZ3RoO2UrKyl7dmFyIGM9Zi5zdWJzdHIobFtlXSwyKTtpZigodHlwZW9mIGQ9PVwibnVtYmVyXCImJighbS5pc0NvbnRleHRUYWcoYykpJiZqPT1kKXx8KHR5cGVvZiBkPT1cInN0cmluZ1wiJiZtLmlzQ29udGV4dFRhZyhjLGQpKSl7cmV0dXJuIG0uZ2V0SWR4YnlMaXN0RXgoZixsW2VdLGIsZyl9aWYoIW0uaXNDb250ZXh0VGFnKGMpKXtqKyt9fXJldHVybiAtMX07QVNOMUhFWC5nZXRUTFZieUxpc3Q9ZnVuY3Rpb24oZCxjLGIsZil7dmFyIGU9QVNOMUhFWDt2YXIgYT1lLmdldElkeGJ5TGlzdChkLGMsYixmKTtpZihhPT0tMSl7cmV0dXJuIG51bGx9aWYoYT49ZC5sZW5ndGgpe3JldHVybiBudWxsfXJldHVybiBlLmdldFRMVihkLGEpfTtBU04xSEVYLmdldFRMVmJ5TGlzdEV4PWZ1bmN0aW9uKGQsYyxiLGYpe3ZhciBlPUFTTjFIRVg7dmFyIGE9ZS5nZXRJZHhieUxpc3RFeChkLGMsYixmKTtpZihhPT0tMSl7cmV0dXJuIG51bGx9cmV0dXJuIGUuZ2V0VExWKGQsYSl9O0FTTjFIRVguZ2V0VmJ5TGlzdD1mdW5jdGlvbihlLGMsYixnLGkpe3ZhciBmPUFTTjFIRVg7dmFyIGEsZDthPWYuZ2V0SWR4YnlMaXN0KGUsYyxiLGcpO2lmKGE9PS0xKXtyZXR1cm4gbnVsbH1pZihhPj1lLmxlbmd0aCl7cmV0dXJuIG51bGx9ZD1mLmdldFYoZSxhKTtpZihpPT09dHJ1ZSl7ZD1kLnN1YnN0cigyKX1yZXR1cm4gZH07QVNOMUhFWC5nZXRWYnlMaXN0RXg9ZnVuY3Rpb24oYixlLGEsZCxmKXt2YXIgaj1BU04xSEVYO3ZhciBnLGMsaTtnPWouZ2V0SWR4YnlMaXN0RXgoYixlLGEsZCk7aWYoZz09LTEpe3JldHVybiBudWxsfWk9ai5nZXRWKGIsZyk7aWYoYi5zdWJzdHIoZywyKT09XCIwM1wiJiZmIT09ZmFsc2Upe2k9aS5zdWJzdHIoMil9cmV0dXJuIGl9O0FTTjFIRVguZ2V0SW50PWZ1bmN0aW9uKGUsYixmKXtpZihmPT11bmRlZmluZWQpe2Y9LTF9dHJ5e3ZhciBjPWUuc3Vic3RyKGIsMik7aWYoYyE9XCIwMlwiJiZjIT1cIjAzXCIpe3JldHVybiBmfXZhciBhPUFTTjFIRVguZ2V0VihlLGIpO2lmKGM9PVwiMDJcIil7cmV0dXJuIHBhcnNlSW50KGEsMTYpfWVsc2V7cmV0dXJuIGJpdHN0cnRvaW50KGEpfX1jYXRjaChkKXtyZXR1cm4gZn19O0FTTjFIRVguZ2V0T0lEPWZ1bmN0aW9uKGMsYSxkKXtpZihkPT11bmRlZmluZWQpe2Q9bnVsbH10cnl7aWYoYy5zdWJzdHIoYSwyKSE9XCIwNlwiKXtyZXR1cm4gZH12YXIgZT1BU04xSEVYLmdldFYoYyxhKTtyZXR1cm4gaGV4dG9vaWQoZSl9Y2F0Y2goYil7cmV0dXJuIGR9fTtBU04xSEVYLmdldE9JRE5hbWU9ZnVuY3Rpb24oZCxhLGYpe2lmKGY9PXVuZGVmaW5lZCl7Zj1udWxsfXRyeXt2YXIgZT1BU04xSEVYLmdldE9JRChkLGEsZik7aWYoZT09Zil7cmV0dXJuIGZ9dmFyIGI9S0pVUi5hc24xLng1MDkuT0lELm9pZDJuYW1lKGUpO2lmKGI9PVwiXCIpe3JldHVybiBlfXJldHVybiBifWNhdGNoKGMpe3JldHVybiBmfX07QVNOMUhFWC5nZXRTdHJpbmc9ZnVuY3Rpb24oZCxiLGUpe2lmKGU9PXVuZGVmaW5lZCl7ZT1udWxsfXRyeXt2YXIgYT1BU04xSEVYLmdldFYoZCxiKTtyZXR1cm4gaGV4dG9yc3RyKGEpfWNhdGNoKGMpe3JldHVybiBlfX07QVNOMUhFWC5oZXh0b29pZHN0cj1mdW5jdGlvbihlKXt2YXIgaD1mdW5jdGlvbihiLGEpe2lmKGIubGVuZ3RoPj1hKXtyZXR1cm4gYn1yZXR1cm4gbmV3IEFycmF5KGEtYi5sZW5ndGgrMSkuam9pbihcIjBcIikrYn07dmFyIGw9W107dmFyIG89ZS5zdWJzdHIoMCwyKTt2YXIgZj1wYXJzZUludChvLDE2KTtsWzBdPW5ldyBTdHJpbmcoTWF0aC5mbG9vcihmLzQwKSk7bFsxXT1uZXcgU3RyaW5nKGYlNDApO3ZhciBtPWUuc3Vic3RyKDIpO3ZhciBrPVtdO2Zvcih2YXIgZz0wO2c8bS5sZW5ndGgvMjtnKyspe2sucHVzaChwYXJzZUludChtLnN1YnN0cihnKjIsMiksMTYpKX12YXIgaj1bXTt2YXIgZD1cIlwiO2Zvcih2YXIgZz0wO2c8ay5sZW5ndGg7ZysrKXtpZihrW2ddJjEyOCl7ZD1kK2goKGtbZ10mMTI3KS50b1N0cmluZygyKSw3KX1lbHNle2Q9ZCtoKChrW2ddJjEyNykudG9TdHJpbmcoMiksNyk7ai5wdXNoKG5ldyBTdHJpbmcocGFyc2VJbnQoZCwyKSkpO2Q9XCJcIn19dmFyIG49bC5qb2luKFwiLlwiKTtpZihqLmxlbmd0aD4wKXtuPW4rXCIuXCIrai5qb2luKFwiLlwiKX1yZXR1cm4gbn07QVNOMUhFWC5kdW1wPWZ1bmN0aW9uKHQsYyxsLGcpe3ZhciBwPUFTTjFIRVg7dmFyIGo9cC5nZXRWO3ZhciB5PXAuZHVtcDt2YXIgdz1wLmdldENoaWxkSWR4O3ZhciBlPXQ7aWYodCBpbnN0YW5jZW9mIEtKVVIuYXNuMS5BU04xT2JqZWN0KXtlPXQuZ2V0RW5jb2RlZEhleCgpfXZhciBxPWZ1bmN0aW9uKEEsaSl7aWYoQS5sZW5ndGg8PWkqMil7cmV0dXJuIEF9ZWxzZXt2YXIgdj1BLnN1YnN0cigwLGkpK1wiLi4odG90YWwgXCIrQS5sZW5ndGgvMitcImJ5dGVzKS4uXCIrQS5zdWJzdHIoQS5sZW5ndGgtaSxpKTtyZXR1cm4gdn19O2lmKGM9PT11bmRlZmluZWQpe2M9e29tbWl0X2xvbmdfb2N0ZXQ6MzJ9fWlmKGw9PT11bmRlZmluZWQpe2w9MH1pZihnPT09dW5kZWZpbmVkKXtnPVwiXCJ9dmFyIHg9Yy5vbW1pdF9sb25nX29jdGV0O3ZhciB6PWUuc3Vic3RyKGwsMik7aWYoej09XCIwMVwiKXt2YXIgaD1qKGUsbCk7aWYoaD09XCIwMFwiKXtyZXR1cm4gZytcIkJPT0xFQU4gRkFMU0VcXG5cIn1lbHNle3JldHVybiBnK1wiQk9PTEVBTiBUUlVFXFxuXCJ9fWlmKHo9PVwiMDJcIil7dmFyIGg9aihlLGwpO3JldHVybiBnK1wiSU5URUdFUiBcIitxKGgseCkrXCJcXG5cIn1pZih6PT1cIjAzXCIpe3ZhciBoPWooZSxsKTtpZihwLmlzQVNOMUhFWChoLnN1YnN0cigyKSkpe3ZhciBrPWcrXCJCSVRTVFJJTkcsIGVuY2Fwc3VsYXRlc1xcblwiO2s9ayt5KGguc3Vic3RyKDIpLGMsMCxnK1wiICBcIik7cmV0dXJuIGt9ZWxzZXtyZXR1cm4gZytcIkJJVFNUUklORyBcIitxKGgseCkrXCJcXG5cIn19aWYoej09XCIwNFwiKXt2YXIgaD1qKGUsbCk7aWYocC5pc0FTTjFIRVgoaCkpe3ZhciBrPWcrXCJPQ1RFVFNUUklORywgZW5jYXBzdWxhdGVzXFxuXCI7az1rK3koaCxjLDAsZytcIiAgXCIpO3JldHVybiBrfWVsc2V7cmV0dXJuIGcrXCJPQ1RFVFNUUklORyBcIitxKGgseCkrXCJcXG5cIn19aWYoej09XCIwNVwiKXtyZXR1cm4gZytcIk5VTExcXG5cIn1pZih6PT1cIjA2XCIpe3ZhciBtPWooZSxsKTt2YXIgYj1LSlVSLmFzbjEuQVNOMVV0aWwub2lkSGV4VG9JbnQobSk7dmFyIG89S0pVUi5hc24xLng1MDkuT0lELm9pZDJuYW1lKGIpO3ZhciBhPWIucmVwbGFjZSgvXFwuL2csXCIgXCIpO2lmKG8hPVwiXCIpe3JldHVybiBnK1wiT2JqZWN0SWRlbnRpZmllciBcIitvK1wiIChcIithK1wiKVxcblwifWVsc2V7cmV0dXJuIGcrXCJPYmplY3RJZGVudGlmaWVyIChcIithK1wiKVxcblwifX1pZih6PT1cIjBhXCIpe3JldHVybiBnK1wiRU5VTUVSQVRFRCBcIitwYXJzZUludChqKGUsbCkpK1wiXFxuXCJ9aWYoej09XCIwY1wiKXtyZXR1cm4gZytcIlVURjhTdHJpbmcgJ1wiK2hleHRvdXRmOChqKGUsbCkpK1wiJ1xcblwifWlmKHo9PVwiMTNcIil7cmV0dXJuIGcrXCJQcmludGFibGVTdHJpbmcgJ1wiK2hleHRvdXRmOChqKGUsbCkpK1wiJ1xcblwifWlmKHo9PVwiMTRcIil7cmV0dXJuIGcrXCJUZWxldGV4U3RyaW5nICdcIitoZXh0b3V0ZjgoaihlLGwpKStcIidcXG5cIn1pZih6PT1cIjE2XCIpe3JldHVybiBnK1wiSUE1U3RyaW5nICdcIitoZXh0b3V0ZjgoaihlLGwpKStcIidcXG5cIn1pZih6PT1cIjE3XCIpe3JldHVybiBnK1wiVVRDVGltZSBcIitoZXh0b3V0ZjgoaihlLGwpKStcIlxcblwifWlmKHo9PVwiMThcIil7cmV0dXJuIGcrXCJHZW5lcmFsaXplZFRpbWUgXCIraGV4dG91dGY4KGooZSxsKSkrXCJcXG5cIn1pZih6PT1cIjFhXCIpe3JldHVybiBnK1wiVmlzdWFsU3RyaW5nICdcIitoZXh0b3V0ZjgoaihlLGwpKStcIidcXG5cIn1pZih6PT1cIjFlXCIpe3JldHVybiBnK1wiQk1QU3RyaW5nICdcIitoZXh0b3V0ZjgoaihlLGwpKStcIidcXG5cIn1pZih6PT1cIjMwXCIpe2lmKGUuc3Vic3RyKGwsNCk9PVwiMzAwMFwiKXtyZXR1cm4gZytcIlNFUVVFTkNFIHt9XFxuXCJ9dmFyIGs9ZytcIlNFUVVFTkNFXFxuXCI7dmFyIGQ9dyhlLGwpO3ZhciBmPWM7aWYoKGQubGVuZ3RoPT0yfHxkLmxlbmd0aD09MykmJmUuc3Vic3RyKGRbMF0sMik9PVwiMDZcIiYmZS5zdWJzdHIoZFtkLmxlbmd0aC0xXSwyKT09XCIwNFwiKXt2YXIgbz1wLm9pZG5hbWUoaihlLGRbMF0pKTt2YXIgcj1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGMpKTtyLng1MDlFeHROYW1lPW87Zj1yfWZvcih2YXIgdT0wO3U8ZC5sZW5ndGg7dSsrKXtrPWsreShlLGYsZFt1XSxnK1wiICBcIil9cmV0dXJuIGt9aWYoej09XCIzMVwiKXt2YXIgaz1nK1wiU0VUXFxuXCI7dmFyIGQ9dyhlLGwpO2Zvcih2YXIgdT0wO3U8ZC5sZW5ndGg7dSsrKXtrPWsreShlLGMsZFt1XSxnK1wiICBcIil9cmV0dXJuIGt9dmFyIHo9cGFyc2VJbnQoeiwxNik7aWYoKHomMTI4KSE9MCl7dmFyIG49eiYzMTtpZigoeiYzMikhPTApe3ZhciBrPWcrXCJbXCIrbitcIl1cXG5cIjt2YXIgZD13KGUsbCk7Zm9yKHZhciB1PTA7dTxkLmxlbmd0aDt1Kyspe2s9ayt5KGUsYyxkW3VdLGcrXCIgIFwiKX1yZXR1cm4ga31lbHNle3ZhciBoPWooZSxsKTtpZihBU04xSEVYLmlzQVNOMUhFWChoKSl7dmFyIGs9ZytcIltcIituK1wiXVxcblwiO2s9ayt5KGgsYywwLGcrXCIgIFwiKTtyZXR1cm4ga31lbHNle2lmKGguc3Vic3RyKDAsOCk9PVwiNjg3NDc0NzBcIil7aD1oZXh0b3V0ZjgoaCl9ZWxzZXtpZihjLng1MDlFeHROYW1lPT09XCJzdWJqZWN0QWx0TmFtZVwiJiZuPT0yKXtoPWhleHRvdXRmOChoKX19fXZhciBrPWcrXCJbXCIrbitcIl0gXCIraCtcIlxcblwiO3JldHVybiBrfX1yZXR1cm4gZytcIlVOS05PV04oXCIreitcIikgXCIraihlLGwpK1wiXFxuXCJ9O0FTTjFIRVguaXNDb250ZXh0VGFnPWZ1bmN0aW9uKGMsYil7Yz1jLnRvTG93ZXJDYXNlKCk7dmFyIGYsZTt0cnl7Zj1wYXJzZUludChjLDE2KX1jYXRjaChkKXtyZXR1cm4gLTF9aWYoYj09PXVuZGVmaW5lZCl7aWYoKGYmMTkyKT09MTI4KXtyZXR1cm4gdHJ1ZX1lbHNle3JldHVybiBmYWxzZX19dHJ5e3ZhciBhPWIubWF0Y2goL15cXFtbMC05XStcXF0kLyk7aWYoYT09bnVsbCl7cmV0dXJuIGZhbHNlfWU9cGFyc2VJbnQoYi5zdWJzdHIoMSxiLmxlbmd0aC0xKSwxMCk7aWYoZT4zMSl7cmV0dXJuIGZhbHNlfWlmKCgoZiYxOTIpPT0xMjgpJiYoKGYmMzEpPT1lKSl7cmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlfWNhdGNoKGQpe3JldHVybiBmYWxzZX19O0FTTjFIRVguaXNBU04xSEVYPWZ1bmN0aW9uKGUpe3ZhciBkPUFTTjFIRVg7aWYoZS5sZW5ndGglMj09MSl7cmV0dXJuIGZhbHNlfXZhciBjPWQuZ2V0VmJsZW4oZSwwKTt2YXIgYj1lLnN1YnN0cigwLDIpO3ZhciBmPWQuZ2V0TChlLDApO3ZhciBhPWUubGVuZ3RoLWIubGVuZ3RoLWYubGVuZ3RoO2lmKGE9PWMqMil7cmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlfTtBU04xSEVYLmNoZWNrU3RyaWN0REVSPWZ1bmN0aW9uKGcsbyxkLGMscil7dmFyIHM9QVNOMUhFWDtpZihkPT09dW5kZWZpbmVkKXtpZih0eXBlb2YgZyE9XCJzdHJpbmdcIil7dGhyb3cgbmV3IEVycm9yKFwibm90IGhleCBzdHJpbmdcIil9Zz1nLnRvTG93ZXJDYXNlKCk7aWYoIUtKVVIubGFuZy5TdHJpbmcuaXNIZXgoZykpe3Rocm93IG5ldyBFcnJvcihcIm5vdCBoZXggc3RyaW5nXCIpfWQ9Zy5sZW5ndGg7Yz1nLmxlbmd0aC8yO2lmKGM8MTI4KXtyPTF9ZWxzZXtyPU1hdGguY2VpbChjLnRvU3RyaW5nKDE2KSkrMX19dmFyIGs9cy5nZXRMKGcsbyk7aWYoay5sZW5ndGg+cioyKXt0aHJvdyBuZXcgRXJyb3IoXCJMIG9mIFRMViB0b28gbG9uZzogaWR4PVwiK28pfXZhciBuPXMuZ2V0VmJsZW4oZyxvKTtpZihuPmMpe3Rocm93IG5ldyBFcnJvcihcInZhbHVlIG9mIEwgdG9vIGxvbmcgdGhhbiBoZXg6IGlkeD1cIitvKX12YXIgcT1zLmdldFRMVihnLG8pO3ZhciBmPXEubGVuZ3RoLTItcy5nZXRMKGcsbykubGVuZ3RoO2lmKGYhPT0obioyKSl7dGhyb3cgbmV3IEVycm9yKFwiViBzdHJpbmcgbGVuZ3RoIGFuZCBMJ3MgdmFsdWUgbm90IHRoZSBzYW1lOlwiK2YrXCIvXCIrKG4qMikpfWlmKG89PT0wKXtpZihnLmxlbmd0aCE9cS5sZW5ndGgpe3Rocm93IG5ldyBFcnJvcihcInRvdGFsIGxlbmd0aCBhbmQgVExWIGxlbmd0aCB1bm1hdGNoOlwiK2cubGVuZ3RoK1wiIT1cIitxLmxlbmd0aCl9fXZhciBiPWcuc3Vic3RyKG8sMik7aWYoYj09PVwiMDJcIil7dmFyIGE9cy5nZXRWaWR4KGcsbyk7aWYoZy5zdWJzdHIoYSwyKT09XCIwMFwiJiZnLmNoYXJDb2RlQXQoYSsyKTw1Nil7dGhyb3cgbmV3IEVycm9yKFwibm90IGxlYXN0IHplcm9zIGZvciBERVIgSU5URUdFUlwiKX19aWYocGFyc2VJbnQoYiwxNikmMzIpe3ZhciBwPXMuZ2V0VmJsZW4oZyxvKTt2YXIgbT0wO3ZhciBsPXMuZ2V0Q2hpbGRJZHgoZyxvKTtmb3IodmFyIGU9MDtlPGwubGVuZ3RoO2UrKyl7dmFyIGo9cy5nZXRUTFYoZyxsW2VdKTttKz1qLmxlbmd0aDtzLmNoZWNrU3RyaWN0REVSKGcsbFtlXSxkLGMscil9aWYoKHAqMikhPW0pe3Rocm93IG5ldyBFcnJvcihcInN1bSBvZiBjaGlsZHJlbidzIFRMViBsZW5ndGggYW5kIEwgdW5tYXRjaDogXCIrKHAqMikrXCIhPVwiK20pfX19O0FTTjFIRVgub2lkbmFtZT1mdW5jdGlvbihhKXt2YXIgYz1LSlVSLmFzbjE7aWYoS0pVUi5sYW5nLlN0cmluZy5pc0hleChhKSl7YT1jLkFTTjFVdGlsLm9pZEhleFRvSW50KGEpfXZhciBiPWMueDUwOS5PSUQub2lkMm5hbWUoYSk7aWYoYj09PVwiXCIpe2I9YX1yZXR1cm4gYn07XG52YXIgS0pVUjtpZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIubGFuZz09XCJ1bmRlZmluZWRcInx8IUtKVVIubGFuZyl7S0pVUi5sYW5nPXt9fUtKVVIubGFuZy5TdHJpbmc9ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIEJhc2U2NHgoKXt9ZnVuY3Rpb24gc3RvQkEoZCl7dmFyIGI9bmV3IEFycmF5KCk7Zm9yKHZhciBjPTA7YzxkLmxlbmd0aDtjKyspe2JbY109ZC5jaGFyQ29kZUF0KGMpfXJldHVybiBifWZ1bmN0aW9uIEJBdG9zKGIpe3ZhciBkPVwiXCI7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe2Q9ZCtTdHJpbmcuZnJvbUNoYXJDb2RlKGJbY10pfXJldHVybiBkfWZ1bmN0aW9uIEJBdG9oZXgoYil7dmFyIGU9XCJcIjtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGM9YltkXS50b1N0cmluZygxNik7aWYoYy5sZW5ndGg9PTEpe2M9XCIwXCIrY31lPWUrY31yZXR1cm4gZX1mdW5jdGlvbiBzdG9oZXgoYSl7cmV0dXJuIEJBdG9oZXgoc3RvQkEoYSkpfWZ1bmN0aW9uIHN0b2I2NChhKXtyZXR1cm4gaGV4MmI2NChzdG9oZXgoYSkpfWZ1bmN0aW9uIHN0b2I2NHUoYSl7cmV0dXJuIGI2NHRvYjY0dShoZXgyYjY0KHN0b2hleChhKSkpfWZ1bmN0aW9uIGI2NHV0b3MoYSl7cmV0dXJuIEJBdG9zKGI2NHRvQkEoYjY0dXRvYjY0KGEpKSl9ZnVuY3Rpb24gYjY0dG9iNjR1KGEpe2E9YS5yZXBsYWNlKC9cXD0vZyxcIlwiKTthPWEucmVwbGFjZSgvXFwrL2csXCItXCIpO2E9YS5yZXBsYWNlKC9cXC8vZyxcIl9cIik7cmV0dXJuIGF9ZnVuY3Rpb24gYjY0dXRvYjY0KGEpe2lmKGEubGVuZ3RoJTQ9PTIpe2E9YStcIj09XCJ9ZWxzZXtpZihhLmxlbmd0aCU0PT0zKXthPWErXCI9XCJ9fWE9YS5yZXBsYWNlKC8tL2csXCIrXCIpO2E9YS5yZXBsYWNlKC9fL2csXCIvXCIpO3JldHVybiBhfWZ1bmN0aW9uIGhleHRvYjY0dShhKXtpZihhLmxlbmd0aCUyPT0xKXthPVwiMFwiK2F9cmV0dXJuIGI2NHRvYjY0dShoZXgyYjY0KGEpKX1mdW5jdGlvbiBiNjR1dG9oZXgoYSl7cmV0dXJuIGI2NHRvaGV4KGI2NHV0b2I2NChhKSl9dmFyIHV0Zjh0b2I2NHUsYjY0dXRvdXRmODtpZih0eXBlb2YgQnVmZmVyPT09XCJmdW5jdGlvblwiKXt1dGY4dG9iNjR1PWZ1bmN0aW9uKGEpe3JldHVybiBiNjR0b2I2NHUoQnVmZmVyLmZyb20oYSxcInV0ZjhcIikudG9TdHJpbmcoXCJiYXNlNjRcIikpfTtiNjR1dG91dGY4PWZ1bmN0aW9uKGEpe3JldHVybiBCdWZmZXIuZnJvbShiNjR1dG9iNjQoYSksXCJiYXNlNjRcIikudG9TdHJpbmcoXCJ1dGY4XCIpfX1lbHNle3V0Zjh0b2I2NHU9ZnVuY3Rpb24oYSl7cmV0dXJuIGhleHRvYjY0dSh1cmljbXB0b2hleChlbmNvZGVVUklDb21wb25lbnRBbGwoYSkpKX07YjY0dXRvdXRmOD1mdW5jdGlvbihhKXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGhleHRvdXJpY21wKGI2NHV0b2hleChhKSkpfX1mdW5jdGlvbiB1dGY4dG9iNjQoYSl7cmV0dXJuIGhleDJiNjQodXJpY21wdG9oZXgoZW5jb2RlVVJJQ29tcG9uZW50QWxsKGEpKSl9ZnVuY3Rpb24gYjY0dG91dGY4KGEpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoaGV4dG91cmljbXAoYjY0dG9oZXgoYSkpKX1mdW5jdGlvbiB1dGY4dG9oZXgoYSl7cmV0dXJuIHVyaWNtcHRvaGV4KGVuY29kZVVSSUNvbXBvbmVudEFsbChhKSl9ZnVuY3Rpb24gaGV4dG91dGY4KGEpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoaGV4dG91cmljbXAoYSkpfWZ1bmN0aW9uIGhleHRvcnN0cihjKXt2YXIgYj1cIlwiO2Zvcih2YXIgYT0wO2E8Yy5sZW5ndGgtMTthKz0yKXtiKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGMuc3Vic3RyKGEsMiksMTYpKX1yZXR1cm4gYn1mdW5jdGlvbiByc3RydG9oZXgoYyl7dmFyIGE9XCJcIjtmb3IodmFyIGI9MDtiPGMubGVuZ3RoO2IrKyl7YSs9KFwiMFwiK2MuY2hhckNvZGVBdChiKS50b1N0cmluZygxNikpLnNsaWNlKC0yKX1yZXR1cm4gYX1mdW5jdGlvbiBoZXh0b2I2NChhKXtyZXR1cm4gaGV4MmI2NChhKX1mdW5jdGlvbiBoZXh0b2I2NG5sKGIpe3ZhciBhPWhleHRvYjY0KGIpO3ZhciBjPWEucmVwbGFjZSgvKC57NjR9KS9nLFwiJDFcXHJcXG5cIik7Yz1jLnJlcGxhY2UoL1xcclxcbiQvLFwiXCIpO3JldHVybiBjfWZ1bmN0aW9uIGI2NG5sdG9oZXgoYil7dmFyIGE9Yi5yZXBsYWNlKC9bXjAtOUEtWmEtelxcLys9XSovZyxcIlwiKTt2YXIgYz1iNjR0b2hleChhKTtyZXR1cm4gY31mdW5jdGlvbiBoZXh0b3BlbShhLGIpe3ZhciBjPWhleHRvYjY0bmwoYSk7cmV0dXJuXCItLS0tLUJFR0lOIFwiK2IrXCItLS0tLVxcclxcblwiK2MrXCJcXHJcXG4tLS0tLUVORCBcIitiK1wiLS0tLS1cXHJcXG5cIn1mdW5jdGlvbiBwZW10b2hleChhLGIpe2lmKGEuaW5kZXhPZihcIi0tLS0tQkVHSU4gXCIpPT0tMSl7dGhyb3dcImNhbid0IGZpbmQgUEVNIGhlYWRlcjogXCIrYn1pZihiIT09dW5kZWZpbmVkKXthPWEucmVwbGFjZShuZXcgUmVnRXhwKFwiXlteXSotLS0tLUJFR0lOIFwiK2IrXCItLS0tLVwiKSxcIlwiKTthPWEucmVwbGFjZShuZXcgUmVnRXhwKFwiLS0tLS1FTkQgXCIrYitcIi0tLS0tW15dKiRcIiksXCJcIil9ZWxzZXthPWEucmVwbGFjZSgvXlteXSotLS0tLUJFR0lOIFteLV0rLS0tLS0vLFwiXCIpO2E9YS5yZXBsYWNlKC8tLS0tLUVORCBbXi1dKy0tLS0tW15dKiQvLFwiXCIpfXJldHVybiBiNjRubHRvaGV4KGEpfWZ1bmN0aW9uIGhleHRvQXJyYXlCdWZmZXIoZCl7aWYoZC5sZW5ndGglMiE9MCl7dGhyb3dcImlucHV0IGlzIG5vdCBldmVuIGxlbmd0aFwifWlmKGQubWF0Y2goL15bMC05QS1GYS1mXSskLyk9PW51bGwpe3Rocm93XCJpbnB1dCBpcyBub3QgaGV4YWRlY2ltYWxcIn12YXIgYj1uZXcgQXJyYXlCdWZmZXIoZC5sZW5ndGgvMik7dmFyIGE9bmV3IERhdGFWaWV3KGIpO2Zvcih2YXIgYz0wO2M8ZC5sZW5ndGgvMjtjKyspe2Euc2V0VWludDgoYyxwYXJzZUludChkLnN1YnN0cihjKjIsMiksMTYpKX1yZXR1cm4gYn1mdW5jdGlvbiBBcnJheUJ1ZmZlcnRvaGV4KGIpe3ZhciBkPVwiXCI7dmFyIGE9bmV3IERhdGFWaWV3KGIpO2Zvcih2YXIgYz0wO2M8Yi5ieXRlTGVuZ3RoO2MrKyl7ZCs9KFwiMDBcIithLmdldFVpbnQ4KGMpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpfXJldHVybiBkfWZ1bmN0aW9uIHp1bHV0b21zZWMobil7dmFyIGwsaixtLGUsZixpLGIsazt2YXIgYSxoLGcsYztjPW4ubWF0Y2goL14oXFxkezJ9fFxcZHs0fSkoXFxkXFxkKShcXGRcXGQpKFxcZFxcZCkoXFxkXFxkKShcXGRcXGQpKHxcXC5cXGQrKVokLyk7aWYoYyl7YT1jWzFdO2w9cGFyc2VJbnQoYSk7aWYoYS5sZW5ndGg9PT0yKXtpZig1MDw9bCYmbDwxMDApe2w9MTkwMCtsfWVsc2V7aWYoMDw9bCYmbDw1MCl7bD0yMDAwK2x9fX1qPXBhcnNlSW50KGNbMl0pLTE7bT1wYXJzZUludChjWzNdKTtlPXBhcnNlSW50KGNbNF0pO2Y9cGFyc2VJbnQoY1s1XSk7aT1wYXJzZUludChjWzZdKTtiPTA7aD1jWzddO2lmKGghPT1cIlwiKXtnPShoLnN1YnN0cigxKStcIjAwXCIpLnN1YnN0cigwLDMpO2I9cGFyc2VJbnQoZyl9cmV0dXJuIERhdGUuVVRDKGwsaixtLGUsZixpLGIpfXRocm93XCJ1bnN1cHBvcnRlZCB6dWx1IGZvcm1hdDogXCIrbn1mdW5jdGlvbiB6dWx1dG9zZWMoYSl7dmFyIGI9enVsdXRvbXNlYyhhKTtyZXR1cm4gfn4oYi8xMDAwKX1mdW5jdGlvbiB6dWx1dG9kYXRlKGEpe3JldHVybiBuZXcgRGF0ZSh6dWx1dG9tc2VjKGEpKX1mdW5jdGlvbiBkYXRldG96dWx1KGcsZSxmKXt2YXIgYjt2YXIgYT1nLmdldFVUQ0Z1bGxZZWFyKCk7aWYoZSl7aWYoYTwxOTUwfHwyMDQ5PGEpe3Rocm93XCJub3QgcHJvcGVyIHllYXIgZm9yIFVUQ1RpbWU6IFwiK2F9Yj0oXCJcIithKS5zbGljZSgtMil9ZWxzZXtiPShcIjAwMFwiK2EpLnNsaWNlKC00KX1iKz0oXCIwXCIrKGcuZ2V0VVRDTW9udGgoKSsxKSkuc2xpY2UoLTIpO2IrPShcIjBcIitnLmdldFVUQ0RhdGUoKSkuc2xpY2UoLTIpO2IrPShcIjBcIitnLmdldFVUQ0hvdXJzKCkpLnNsaWNlKC0yKTtiKz0oXCIwXCIrZy5nZXRVVENNaW51dGVzKCkpLnNsaWNlKC0yKTtiKz0oXCIwXCIrZy5nZXRVVENTZWNvbmRzKCkpLnNsaWNlKC0yKTtpZihmKXt2YXIgYz1nLmdldFVUQ01pbGxpc2Vjb25kcygpO2lmKGMhPT0wKXtjPShcIjAwXCIrYykuc2xpY2UoLTMpO2M9Yy5yZXBsYWNlKC8wKyQvZyxcIlwiKTtiKz1cIi5cIitjfX1iKz1cIlpcIjtyZXR1cm4gYn1mdW5jdGlvbiB1cmljbXB0b2hleChhKXtyZXR1cm4gYS5yZXBsYWNlKC8lL2csXCJcIil9ZnVuY3Rpb24gaGV4dG91cmljbXAoYSl7cmV0dXJuIGEucmVwbGFjZSgvKC4uKS9nLFwiJSQxXCIpfWZ1bmN0aW9uIGlwdjZ0b2hleChnKXt2YXIgYj1cIm1hbGZvcm1lZCBJUHY2IGFkZHJlc3NcIjtpZighZy5tYXRjaCgvXlswLTlBLUZhLWY6XSskLykpe3Rocm93IGJ9Zz1nLnRvTG93ZXJDYXNlKCk7dmFyIGQ9Zy5zcGxpdChcIjpcIikubGVuZ3RoLTE7aWYoZDwyKXt0aHJvdyBifXZhciBlPVwiOlwiLnJlcGVhdCg3LWQrMik7Zz1nLnJlcGxhY2UoXCI6OlwiLGUpO3ZhciBjPWcuc3BsaXQoXCI6XCIpO2lmKGMubGVuZ3RoIT04KXt0aHJvdyBifWZvcih2YXIgZj0wO2Y8ODtmKyspe2NbZl09KFwiMDAwMFwiK2NbZl0pLnNsaWNlKC00KX1yZXR1cm4gYy5qb2luKFwiXCIpfWZ1bmN0aW9uIGhleHRvaXB2NihlKXtpZighZS5tYXRjaCgvXlswLTlBLUZhLWZdezMyfSQvKSl7dGhyb3dcIm1hbGZvcm1lZCBJUHY2IGFkZHJlc3Mgb2N0ZXRcIn1lPWUudG9Mb3dlckNhc2UoKTt2YXIgYj1lLm1hdGNoKC8uezEsNH0vZyk7Zm9yKHZhciBkPTA7ZDw4O2QrKyl7YltkXT1iW2RdLnJlcGxhY2UoL14wKy8sXCJcIik7aWYoYltkXT09XCJcIil7YltkXT1cIjBcIn19ZT1cIjpcIitiLmpvaW4oXCI6XCIpK1wiOlwiO3ZhciBjPWUubWF0Y2goLzooMDopezIsfS9nKTtpZihjPT09bnVsbCl7cmV0dXJuIGUuc2xpY2UoMSwtMSl9dmFyIGY9XCJcIjtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7aWYoY1tkXS5sZW5ndGg+Zi5sZW5ndGgpe2Y9Y1tkXX19ZT1lLnJlcGxhY2UoZixcIjo6XCIpO3JldHVybiBlLnNsaWNlKDEsLTEpfWZ1bmN0aW9uIGhleHRvaXAoYil7dmFyIGQ9XCJtYWxmb3JtZWQgaGV4IHZhbHVlXCI7aWYoIWIubWF0Y2goL14oWzAtOUEtRmEtZl1bMC05QS1GYS1mXSl7MSx9JC8pKXt0aHJvdyBkfWlmKGIubGVuZ3RoPT04KXt2YXIgYzt0cnl7Yz1wYXJzZUludChiLnN1YnN0cigwLDIpLDE2KStcIi5cIitwYXJzZUludChiLnN1YnN0cigyLDIpLDE2KStcIi5cIitwYXJzZUludChiLnN1YnN0cig0LDIpLDE2KStcIi5cIitwYXJzZUludChiLnN1YnN0cig2LDIpLDE2KTtyZXR1cm4gY31jYXRjaChhKXt0aHJvdyBkfX1lbHNle2lmKGIubGVuZ3RoPT0zMil7cmV0dXJuIGhleHRvaXB2NihiKX1lbHNle3JldHVybiBifX19ZnVuY3Rpb24gaXB0b2hleChmKXt2YXIgaj1cIm1hbGZvcm1lZCBJUCBhZGRyZXNzXCI7Zj1mLnRvTG93ZXJDYXNlKGYpO2lmKGYubWF0Y2goL15bMC05Ll0rJC8pKXt2YXIgYj1mLnNwbGl0KFwiLlwiKTtpZihiLmxlbmd0aCE9PTQpe3Rocm93IGp9dmFyIGc9XCJcIjt0cnl7Zm9yKHZhciBlPTA7ZTw0O2UrKyl7dmFyIGg9cGFyc2VJbnQoYltlXSk7Zys9KFwiMFwiK2gudG9TdHJpbmcoMTYpKS5zbGljZSgtMil9cmV0dXJuIGd9Y2F0Y2goYyl7dGhyb3cgan19ZWxzZXtpZihmLm1hdGNoKC9eWzAtOWEtZjpdKyQvKSYmZi5pbmRleE9mKFwiOlwiKSE9PS0xKXtyZXR1cm4gaXB2NnRvaGV4KGYpfWVsc2V7dGhyb3cgan19fWZ1bmN0aW9uIGVuY29kZVVSSUNvbXBvbmVudEFsbChhKXt2YXIgZD1lbmNvZGVVUklDb21wb25lbnQoYSk7dmFyIGI9XCJcIjtmb3IodmFyIGM9MDtjPGQubGVuZ3RoO2MrKyl7aWYoZFtjXT09XCIlXCIpe2I9YitkLnN1YnN0cihjLDMpO2M9YysyfWVsc2V7Yj1iK1wiJVwiK3N0b2hleChkW2NdKX19cmV0dXJuIGJ9ZnVuY3Rpb24gbmV3bGluZV90b1VuaXgoYSl7YT1hLnJlcGxhY2UoL1xcclxcbi9tZyxcIlxcblwiKTtyZXR1cm4gYX1mdW5jdGlvbiBuZXdsaW5lX3RvRG9zKGEpe2E9YS5yZXBsYWNlKC9cXHJcXG4vbWcsXCJcXG5cIik7YT1hLnJlcGxhY2UoL1xcbi9tZyxcIlxcclxcblwiKTtyZXR1cm4gYX1LSlVSLmxhbmcuU3RyaW5nLmlzSW50ZWdlcj1mdW5jdGlvbihhKXtpZihhLm1hdGNoKC9eWzAtOV0rJC8pKXtyZXR1cm4gdHJ1ZX1lbHNle2lmKGEubWF0Y2goL14tWzAtOV0rJC8pKXtyZXR1cm4gdHJ1ZX1lbHNle3JldHVybiBmYWxzZX19fTtLSlVSLmxhbmcuU3RyaW5nLmlzSGV4PWZ1bmN0aW9uKGEpe3JldHVybiBpc2hleChhKX07ZnVuY3Rpb24gaXNoZXgoYSl7aWYoYS5sZW5ndGglMj09MCYmKGEubWF0Y2goL15bMC05YS1mXSskLyl8fGEubWF0Y2goL15bMC05QS1GXSskLykpKXtyZXR1cm4gdHJ1ZX1lbHNle3JldHVybiBmYWxzZX19S0pVUi5sYW5nLlN0cmluZy5pc0Jhc2U2ND1mdW5jdGlvbihhKXthPWEucmVwbGFjZSgvXFxzKy9nLFwiXCIpO2lmKGEubWF0Y2goL15bMC05QS1aYS16K1xcL10rPXswLDN9JC8pJiZhLmxlbmd0aCU0PT0wKXtyZXR1cm4gdHJ1ZX1lbHNle3JldHVybiBmYWxzZX19O0tKVVIubGFuZy5TdHJpbmcuaXNCYXNlNjRVUkw9ZnVuY3Rpb24oYSl7aWYoYS5tYXRjaCgvWysvPV0vKSl7cmV0dXJuIGZhbHNlfWE9YjY0dXRvYjY0KGEpO3JldHVybiBLSlVSLmxhbmcuU3RyaW5nLmlzQmFzZTY0KGEpfTtLSlVSLmxhbmcuU3RyaW5nLmlzSW50ZWdlckFycmF5PWZ1bmN0aW9uKGEpe2E9YS5yZXBsYWNlKC9cXHMrL2csXCJcIik7aWYoYS5tYXRjaCgvXlxcW1swLTksXStcXF0kLykpe3JldHVybiB0cnVlfWVsc2V7cmV0dXJuIGZhbHNlfX07S0pVUi5sYW5nLlN0cmluZy5pc1ByaW50YWJsZT1mdW5jdGlvbihhKXtpZihhLm1hdGNoKC9eWzAtOUEtWmEteiAnKCkrLC0uLzo9P10qJC8pIT09bnVsbCl7cmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlfTtLSlVSLmxhbmcuU3RyaW5nLmlzSUE1PWZ1bmN0aW9uKGEpe2lmKGEubWF0Y2goL15bXFx4MjAtXFx4MjFcXHgyMy1cXHg3Zl0qJC8pIT09bnVsbCl7cmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlfTtLSlVSLmxhbmcuU3RyaW5nLmlzTWFpbD1mdW5jdGlvbihhKXtpZihhLm1hdGNoKC9eW0EtWmEtejAtOV17MX1bQS1aYS16MC05Xy4tXSpAezF9W0EtWmEtejAtOV8uLV17MSx9XFwuW0EtWmEtejAtOV17MSx9JC8pIT09bnVsbCl7cmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlfTtmdW5jdGlvbiBoZXh0b3Bvc2hleChhKXtpZihhLmxlbmd0aCUyPT0xKXtyZXR1cm5cIjBcIithfWlmKGEuc3Vic3RyKDAsMSk+XCI3XCIpe3JldHVyblwiMDBcIithfXJldHVybiBhfWZ1bmN0aW9uIGludGFyeXN0cnRvaGV4KGIpe2I9Yi5yZXBsYWNlKC9eXFxzKlxcW1xccyovLFwiXCIpO2I9Yi5yZXBsYWNlKC9cXHMqXFxdXFxzKiQvLFwiXCIpO2I9Yi5yZXBsYWNlKC9cXHMqL2csXCJcIik7dHJ5e3ZhciBjPWIuc3BsaXQoLywvKS5tYXAoZnVuY3Rpb24oZyxlLGgpe3ZhciBmPXBhcnNlSW50KGcpO2lmKGY8MHx8MjU1PGYpe3Rocm93XCJpbnRlZ2VyIG5vdCBpbiByYW5nZSAwLTI1NVwifXZhciBkPShcIjAwXCIrZi50b1N0cmluZygxNikpLnNsaWNlKC0yKTtyZXR1cm4gZH0pLmpvaW4oXCJcIik7cmV0dXJuIGN9Y2F0Y2goYSl7dGhyb3dcIm1hbGZvcm1lZCBpbnRlZ2VyIGFycmF5IHN0cmluZzogXCIrYX19dmFyIHN0cmRpZmZpZHg9ZnVuY3Rpb24oYyxhKXt2YXIgZD1jLmxlbmd0aDtpZihjLmxlbmd0aD5hLmxlbmd0aCl7ZD1hLmxlbmd0aH1mb3IodmFyIGI9MDtiPGQ7YisrKXtpZihjLmNoYXJDb2RlQXQoYikhPWEuY2hhckNvZGVBdChiKSl7cmV0dXJuIGJ9fWlmKGMubGVuZ3RoIT1hLmxlbmd0aCl7cmV0dXJuIGR9cmV0dXJuIC0xfTtmdW5jdGlvbiBvaWR0b2hleChnKXt2YXIgZj1mdW5jdGlvbihhKXt2YXIgbD1hLnRvU3RyaW5nKDE2KTtpZihsLmxlbmd0aD09MSl7bD1cIjBcIitsfXJldHVybiBsfTt2YXIgZT1mdW5jdGlvbihwKXt2YXIgbz1cIlwiO3ZhciBsPXBhcnNlSW50KHAsMTApO3ZhciBhPWwudG9TdHJpbmcoMik7dmFyIG09Ny1hLmxlbmd0aCU3O2lmKG09PTcpe209MH12YXIgcj1cIlwiO2Zvcih2YXIgbj0wO248bTtuKyspe3IrPVwiMFwifWE9cithO2Zvcih2YXIgbj0wO248YS5sZW5ndGgtMTtuKz03KXt2YXIgcT1hLnN1YnN0cihuLDcpO2lmKG4hPWEubGVuZ3RoLTcpe3E9XCIxXCIrcX1vKz1mKHBhcnNlSW50KHEsMikpfXJldHVybiBvfTt0cnl7aWYoIWcubWF0Y2goL15bMC05Ll0rJC8pKXtyZXR1cm4gbnVsbH12YXIgaj1cIlwiO3ZhciBiPWcuc3BsaXQoXCIuXCIpO3ZhciBrPXBhcnNlSW50KGJbMF0sMTApKjQwK3BhcnNlSW50KGJbMV0sMTApO2orPWYoayk7Yi5zcGxpY2UoMCwyKTtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7ais9ZShiW2RdKX1yZXR1cm4gan1jYXRjaChjKXtyZXR1cm4gbnVsbH19ZnVuY3Rpb24gaGV4dG9vaWQoZyl7aWYoIWlzaGV4KGcpKXtyZXR1cm4gbnVsbH10cnl7dmFyIG09W107dmFyIHA9Zy5zdWJzdHIoMCwyKTt2YXIgZT1wYXJzZUludChwLDE2KTttWzBdPW5ldyBTdHJpbmcoTWF0aC5mbG9vcihlLzQwKSk7bVsxXT1uZXcgU3RyaW5nKGUlNDApO3ZhciBuPWcuc3Vic3RyKDIpO3ZhciBsPVtdO2Zvcih2YXIgZj0wO2Y8bi5sZW5ndGgvMjtmKyspe2wucHVzaChwYXJzZUludChuLnN1YnN0cihmKjIsMiksMTYpKX12YXIgaz1bXTt2YXIgZD1cIlwiO2Zvcih2YXIgZj0wO2Y8bC5sZW5ndGg7ZisrKXtpZihsW2ZdJjEyOCl7ZD1kK3N0cnBhZCgobFtmXSYxMjcpLnRvU3RyaW5nKDIpLDcpfWVsc2V7ZD1kK3N0cnBhZCgobFtmXSYxMjcpLnRvU3RyaW5nKDIpLDcpO2sucHVzaChuZXcgU3RyaW5nKHBhcnNlSW50KGQsMikpKTtkPVwiXCJ9fXZhciBvPW0uam9pbihcIi5cIik7aWYoay5sZW5ndGg+MCl7bz1vK1wiLlwiK2suam9pbihcIi5cIil9cmV0dXJuIG99Y2F0Y2goail7cmV0dXJuIG51bGx9fXZhciBzdHJwYWQ9ZnVuY3Rpb24oYyxiLGEpe2lmKGE9PXVuZGVmaW5lZCl7YT1cIjBcIn1pZihjLmxlbmd0aD49Yil7cmV0dXJuIGN9cmV0dXJuIG5ldyBBcnJheShiLWMubGVuZ3RoKzEpLmpvaW4oYSkrY307ZnVuY3Rpb24gYml0c3RydG9pbnQoZSl7dHJ5e3ZhciBhPWUuc3Vic3RyKDAsMik7aWYoYT09XCIwMFwiKXtyZXR1cm4gcGFyc2VJbnQoZS5zdWJzdHIoMiksMTYpfXZhciBiPXBhcnNlSW50KGEsMTYpO3ZhciBmPWUuc3Vic3RyKDIpO3ZhciBkPXBhcnNlSW50KGYsMTYpLnRvU3RyaW5nKDIpO2lmKGQ9PVwiMFwiKXtkPVwiMDAwMDAwMDBcIn1kPWQuc2xpY2UoMCwwLWIpO3JldHVybiBwYXJzZUludChkLDIpfWNhdGNoKGMpe3JldHVybiAtMX19ZnVuY3Rpb24gaW50dG9iaXRzdHIoZSl7dmFyIGM9TnVtYmVyKGUpLnRvU3RyaW5nKDIpO3ZhciBiPTgtYy5sZW5ndGglODtpZihiPT04KXtiPTB9Yz1jK3N0cnBhZChcIlwiLGIsXCIwXCIpO3ZhciBkPXBhcnNlSW50KGMsMikudG9TdHJpbmcoMTYpO2lmKGQubGVuZ3RoJTI9PTEpe2Q9XCIwXCIrZH12YXIgYT1cIjBcIitiO3JldHVybiBhK2R9O1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmNyeXB0bz09XCJ1bmRlZmluZWRcInx8IUtKVVIuY3J5cHRvKXtLSlVSLmNyeXB0bz17fX1LSlVSLmNyeXB0by5VdGlsPW5ldyBmdW5jdGlvbigpe3RoaXMuRElHRVNUSU5GT0hFQUQ9e3NoYTE6XCIzMDIxMzAwOTA2MDUyYjBlMDMwMjFhMDUwMDA0MTRcIixzaGEyMjQ6XCIzMDJkMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDQwNTAwMDQxY1wiLHNoYTI1NjpcIjMwMzEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMTA1MDAwNDIwXCIsc2hhMzg0OlwiMzA0MTMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjAyMDUwMDA0MzBcIixzaGE1MTI6XCIzMDUxMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDMwNTAwMDQ0MFwiLG1kMjpcIjMwMjAzMDBjMDYwODJhODY0ODg2ZjcwZDAyMDIwNTAwMDQxMFwiLG1kNTpcIjMwMjAzMDBjMDYwODJhODY0ODg2ZjcwZDAyMDUwNTAwMDQxMFwiLHJpcGVtZDE2MDpcIjMwMjEzMDA5MDYwNTJiMjQwMzAyMDEwNTAwMDQxNFwiLH07dGhpcy5ERUZBVUxUUFJPVklERVI9e21kNTpcImNyeXB0b2pzXCIsc2hhMTpcImNyeXB0b2pzXCIsc2hhMjI0OlwiY3J5cHRvanNcIixzaGEyNTY6XCJjcnlwdG9qc1wiLHNoYTM4NDpcImNyeXB0b2pzXCIsc2hhNTEyOlwiY3J5cHRvanNcIixyaXBlbWQxNjA6XCJjcnlwdG9qc1wiLGhtYWNtZDU6XCJjcnlwdG9qc1wiLGhtYWNzaGExOlwiY3J5cHRvanNcIixobWFjc2hhMjI0OlwiY3J5cHRvanNcIixobWFjc2hhMjU2OlwiY3J5cHRvanNcIixobWFjc2hhMzg0OlwiY3J5cHRvanNcIixobWFjc2hhNTEyOlwiY3J5cHRvanNcIixobWFjcmlwZW1kMTYwOlwiY3J5cHRvanNcIixNRDV3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixTSEExd2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjI0d2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjU2d2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMzg0d2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBNTEyd2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsUklQRU1EMTYwd2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsTUQ1d2l0aEVDRFNBOlwiY3J5cHRvanMvanNyc2FcIixTSEExd2l0aEVDRFNBOlwiY3J5cHRvanMvanNyc2FcIixTSEEyMjR3aXRoRUNEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTI1NndpdGhFQ0RTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMzg0d2l0aEVDRFNBOlwiY3J5cHRvanMvanNyc2FcIixTSEE1MTJ3aXRoRUNEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFJJUEVNRDE2MHdpdGhFQ0RTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMXdpdGhEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTIyNHdpdGhEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTI1NndpdGhEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLE1ENXdpdGhSU0FhbmRNR0YxOlwiY3J5cHRvanMvanNyc2FcIixTSEF3aXRoUlNBYW5kTUdGMTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMXdpdGhSU0FhbmRNR0YxOlwiY3J5cHRvanMvanNyc2FcIixTSEEyMjR3aXRoUlNBYW5kTUdGMTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjU2d2l0aFJTQWFuZE1HRjE6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTM4NHdpdGhSU0FhbmRNR0YxOlwiY3J5cHRvanMvanNyc2FcIixTSEE1MTJ3aXRoUlNBYW5kTUdGMTpcImNyeXB0b2pzL2pzcnNhXCIsUklQRU1EMTYwd2l0aFJTQWFuZE1HRjE6XCJjcnlwdG9qcy9qc3JzYVwiLH07dGhpcy5DUllQVE9KU01FU1NBR0VESUdFU1ROQU1FPXttZDU6Q3J5cHRvSlMuYWxnby5NRDUsc2hhMTpDcnlwdG9KUy5hbGdvLlNIQTEsc2hhMjI0OkNyeXB0b0pTLmFsZ28uU0hBMjI0LHNoYTI1NjpDcnlwdG9KUy5hbGdvLlNIQTI1NixzaGEzODQ6Q3J5cHRvSlMuYWxnby5TSEEzODQsc2hhNTEyOkNyeXB0b0pTLmFsZ28uU0hBNTEyLHJpcGVtZDE2MDpDcnlwdG9KUy5hbGdvLlJJUEVNRDE2MH07dGhpcy5nZXREaWdlc3RJbmZvSGV4PWZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIHRoaXMuRElHRVNUSU5GT0hFQURbYl09PVwidW5kZWZpbmVkXCIpe3Rocm93XCJhbGcgbm90IHN1cHBvcnRlZCBpbiBVdGlsLkRJR0VTVElORk9IRUFEOiBcIitifXJldHVybiB0aGlzLkRJR0VTVElORk9IRUFEW2JdK2F9O3RoaXMuZ2V0UGFkZGVkRGlnZXN0SW5mb0hleD1mdW5jdGlvbihoLGEsail7dmFyIGM9dGhpcy5nZXREaWdlc3RJbmZvSGV4KGgsYSk7dmFyIGQ9ai80O2lmKGMubGVuZ3RoKzIyPmQpe3Rocm93XCJrZXkgaXMgdG9vIHNob3J0IGZvciBTaWdBbGc6IGtleWxlbj1cIitqK1wiLFwiK2F9dmFyIGI9XCIwMDAxXCI7dmFyIGs9XCIwMFwiK2M7dmFyIGc9XCJcIjt2YXIgbD1kLWIubGVuZ3RoLWsubGVuZ3RoO2Zvcih2YXIgZj0wO2Y8bDtmKz0yKXtnKz1cImZmXCJ9dmFyIGU9YitnK2s7cmV0dXJuIGV9O3RoaXMuaGFzaFN0cmluZz1mdW5jdGlvbihhLGMpe3ZhciBiPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6Y30pO3JldHVybiBiLmRpZ2VzdFN0cmluZyhhKX07dGhpcy5oYXNoSGV4PWZ1bmN0aW9uKGIsYyl7dmFyIGE9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzpjfSk7cmV0dXJuIGEuZGlnZXN0SGV4KGIpfTt0aGlzLnNoYTE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaGFzaFN0cmluZyhhLFwic2hhMVwiKX07dGhpcy5zaGEyNTY9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaGFzaFN0cmluZyhhLFwic2hhMjU2XCIpfTt0aGlzLnNoYTI1NkhleD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5oYXNoSGV4KGEsXCJzaGEyNTZcIil9O3RoaXMuc2hhNTEyPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmhhc2hTdHJpbmcoYSxcInNoYTUxMlwiKX07dGhpcy5zaGE1MTJIZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaGFzaEhleChhLFwic2hhNTEyXCIpfTt0aGlzLmlzS2V5PWZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBSU0FLZXl8fGEgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5EU0F8fGEgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSl7cmV0dXJuIHRydWV9ZWxzZXtyZXR1cm4gZmFsc2V9fX07S0pVUi5jcnlwdG8uVXRpbC5tZDU9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzpcIm1kNVwiLHByb3Y6XCJjcnlwdG9qc1wifSk7cmV0dXJuIGIuZGlnZXN0U3RyaW5nKGEpfTtLSlVSLmNyeXB0by5VdGlsLnJpcGVtZDE2MD1mdW5jdGlvbihhKXt2YXIgYj1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOlwicmlwZW1kMTYwXCIscHJvdjpcImNyeXB0b2pzXCJ9KTtyZXR1cm4gYi5kaWdlc3RTdHJpbmcoYSl9O0tKVVIuY3J5cHRvLlV0aWwuU0VDVVJFUkFORE9NR0VOPW5ldyBTZWN1cmVSYW5kb20oKTtLSlVSLmNyeXB0by5VdGlsLmdldFJhbmRvbUhleE9mTmJ5dGVzPWZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBBcnJheShiKTtLSlVSLmNyeXB0by5VdGlsLlNFQ1VSRVJBTkRPTUdFTi5uZXh0Qnl0ZXMoYSk7cmV0dXJuIEJBdG9oZXgoYSl9O0tKVVIuY3J5cHRvLlV0aWwuZ2V0UmFuZG9tQmlnSW50ZWdlck9mTmJ5dGVzPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgQmlnSW50ZWdlcihLSlVSLmNyeXB0by5VdGlsLmdldFJhbmRvbUhleE9mTmJ5dGVzKGEpLDE2KX07S0pVUi5jcnlwdG8uVXRpbC5nZXRSYW5kb21IZXhPZk5iaXRzPWZ1bmN0aW9uKGQpe3ZhciBjPWQlODt2YXIgYT0oZC1jKS84O3ZhciBiPW5ldyBBcnJheShhKzEpO0tKVVIuY3J5cHRvLlV0aWwuU0VDVVJFUkFORE9NR0VOLm5leHRCeXRlcyhiKTtiWzBdPSgoKDI1NTw8YykmMjU1KV4yNTUpJmJbMF07cmV0dXJuIEJBdG9oZXgoYil9O0tKVVIuY3J5cHRvLlV0aWwuZ2V0UmFuZG9tQmlnSW50ZWdlck9mTmJpdHM9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBCaWdJbnRlZ2VyKEtKVVIuY3J5cHRvLlV0aWwuZ2V0UmFuZG9tSGV4T2ZOYml0cyhhKSwxNil9O0tKVVIuY3J5cHRvLlV0aWwuZ2V0UmFuZG9tQmlnSW50ZWdlclplcm9Ub01heD1mdW5jdGlvbihiKXt2YXIgYT1iLmJpdExlbmd0aCgpO3doaWxlKDEpe3ZhciBjPUtKVVIuY3J5cHRvLlV0aWwuZ2V0UmFuZG9tQmlnSW50ZWdlck9mTmJpdHMoYSk7aWYoYi5jb21wYXJlVG8oYykhPS0xKXtyZXR1cm4gY319fTtLSlVSLmNyeXB0by5VdGlsLmdldFJhbmRvbUJpZ0ludGVnZXJNaW5Ub01heD1mdW5jdGlvbihlLGIpe3ZhciBjPWUuY29tcGFyZVRvKGIpO2lmKGM9PTEpe3Rocm93XCJiaU1pbiBpcyBncmVhdGVyIHRoYW4gYmlNYXhcIn1pZihjPT0wKXtyZXR1cm4gZX12YXIgYT1iLnN1YnRyYWN0KGUpO3ZhciBkPUtKVVIuY3J5cHRvLlV0aWwuZ2V0UmFuZG9tQmlnSW50ZWdlclplcm9Ub01heChhKTtyZXR1cm4gZC5hZGQoZSl9O0tKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Q9ZnVuY3Rpb24oYyl7dmFyIGI9bnVsbDt2YXIgYT1udWxsO3ZhciBkPW51bGw7dGhpcy5zZXRBbGdBbmRQcm92aWRlcj1mdW5jdGlvbihnLGYpe2c9S0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdC5nZXRDYW5vbmljYWxBbGdOYW1lKGcpO2lmKGchPT1udWxsJiZmPT09dW5kZWZpbmVkKXtmPUtKVVIuY3J5cHRvLlV0aWwuREVGQVVMVFBST1ZJREVSW2ddfWlmKFwiOm1kNTpzaGExOnNoYTIyNDpzaGEyNTY6c2hhMzg0OnNoYTUxMjpyaXBlbWQxNjA6XCIuaW5kZXhPZihnKSE9LTEmJmY9PVwiY3J5cHRvanNcIil7dHJ5e3RoaXMubWQ9S0pVUi5jcnlwdG8uVXRpbC5DUllQVE9KU01FU1NBR0VESUdFU1ROQU1FW2ddLmNyZWF0ZSgpfWNhdGNoKGUpe3Rocm93XCJzZXRBbGdBbmRQcm92aWRlciBoYXNoIGFsZyBzZXQgZmFpbCBhbGc9XCIrZytcIi9cIitlfXRoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKGgpe3RoaXMubWQudXBkYXRlKGgpfTt0aGlzLnVwZGF0ZUhleD1mdW5jdGlvbihoKXt2YXIgaT1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGgpO3RoaXMubWQudXBkYXRlKGkpfTt0aGlzLmRpZ2VzdD1mdW5jdGlvbigpe3ZhciBoPXRoaXMubWQuZmluYWxpemUoKTtyZXR1cm4gaC50b1N0cmluZyhDcnlwdG9KUy5lbmMuSGV4KX07dGhpcy5kaWdlc3RTdHJpbmc9ZnVuY3Rpb24oaCl7dGhpcy51cGRhdGVTdHJpbmcoaCk7cmV0dXJuIHRoaXMuZGlnZXN0KCl9O3RoaXMuZGlnZXN0SGV4PWZ1bmN0aW9uKGgpe3RoaXMudXBkYXRlSGV4KGgpO3JldHVybiB0aGlzLmRpZ2VzdCgpfX1pZihcIjpzaGEyNTY6XCIuaW5kZXhPZihnKSE9LTEmJmY9PVwic2pjbFwiKXt0cnl7dGhpcy5tZD1uZXcgc2pjbC5oYXNoLnNoYTI1NigpfWNhdGNoKGUpe3Rocm93XCJzZXRBbGdBbmRQcm92aWRlciBoYXNoIGFsZyBzZXQgZmFpbCBhbGc9XCIrZytcIi9cIitlfXRoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKGgpe3RoaXMubWQudXBkYXRlKGgpfTt0aGlzLnVwZGF0ZUhleD1mdW5jdGlvbihpKXt2YXIgaD1zamNsLmNvZGVjLmhleC50b0JpdHMoaSk7dGhpcy5tZC51cGRhdGUoaCl9O3RoaXMuZGlnZXN0PWZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5tZC5maW5hbGl6ZSgpO3JldHVybiBzamNsLmNvZGVjLmhleC5mcm9tQml0cyhoKX07dGhpcy5kaWdlc3RTdHJpbmc9ZnVuY3Rpb24oaCl7dGhpcy51cGRhdGVTdHJpbmcoaCk7cmV0dXJuIHRoaXMuZGlnZXN0KCl9O3RoaXMuZGlnZXN0SGV4PWZ1bmN0aW9uKGgpe3RoaXMudXBkYXRlSGV4KGgpO3JldHVybiB0aGlzLmRpZ2VzdCgpfX19O3RoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKGUpe3Rocm93XCJ1cGRhdGVTdHJpbmcoc3RyKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ05hbWUrXCIvXCIrdGhpcy5wcm92TmFtZX07dGhpcy51cGRhdGVIZXg9ZnVuY3Rpb24oZSl7dGhyb3dcInVwZGF0ZUhleChoZXgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnTmFtZStcIi9cIit0aGlzLnByb3ZOYW1lfTt0aGlzLmRpZ2VzdD1mdW5jdGlvbigpe3Rocm93XCJkaWdlc3QoKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ05hbWUrXCIvXCIrdGhpcy5wcm92TmFtZX07dGhpcy5kaWdlc3RTdHJpbmc9ZnVuY3Rpb24oZSl7dGhyb3dcImRpZ2VzdFN0cmluZyhzdHIpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnTmFtZStcIi9cIit0aGlzLnByb3ZOYW1lfTt0aGlzLmRpZ2VzdEhleD1mdW5jdGlvbihlKXt0aHJvd1wiZGlnZXN0SGV4KGhleCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdOYW1lK1wiL1wiK3RoaXMucHJvdk5hbWV9O2lmKGMhPT11bmRlZmluZWQpe2lmKGMuYWxnIT09dW5kZWZpbmVkKXt0aGlzLmFsZ05hbWU9Yy5hbGc7aWYoYy5wcm92PT09dW5kZWZpbmVkKXt0aGlzLnByb3ZOYW1lPUtKVVIuY3J5cHRvLlV0aWwuREVGQVVMVFBST1ZJREVSW3RoaXMuYWxnTmFtZV19dGhpcy5zZXRBbGdBbmRQcm92aWRlcih0aGlzLmFsZ05hbWUsdGhpcy5wcm92TmFtZSl9fX07S0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdC5nZXRDYW5vbmljYWxBbGdOYW1lPWZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT09XCJzdHJpbmdcIil7YT1hLnRvTG93ZXJDYXNlKCk7YT1hLnJlcGxhY2UoLy0vLFwiXCIpfXJldHVybiBhfTtLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0LmdldEhhc2hMZW5ndGg9ZnVuY3Rpb24oYyl7dmFyIGI9S0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdDt2YXIgYT1iLmdldENhbm9uaWNhbEFsZ05hbWUoYyk7aWYoYi5IQVNITEVOR1RIW2FdPT09dW5kZWZpbmVkKXt0aHJvd1wibm90IHN1cHBvcnRlZCBhbGdvcml0aG06IFwiK2N9cmV0dXJuIGIuSEFTSExFTkdUSFthXX07S0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdC5IQVNITEVOR1RIPXttZDU6MTYsc2hhMToyMCxzaGEyMjQ6Mjgsc2hhMjU2OjMyLHNoYTM4NDo0OCxzaGE1MTI6NjQscmlwZW1kMTYwOjIwfTtLSlVSLmNyeXB0by5NYWM9ZnVuY3Rpb24oZCl7dmFyIGY9bnVsbDt2YXIgYz1udWxsO3ZhciBhPW51bGw7dmFyIGU9bnVsbDt2YXIgYj1udWxsO3RoaXMuc2V0QWxnQW5kUHJvdmlkZXI9ZnVuY3Rpb24oayxpKXtrPWsudG9Mb3dlckNhc2UoKTtpZihrPT1udWxsKXtrPVwiaG1hY3NoYTFcIn1rPWsudG9Mb3dlckNhc2UoKTtpZihrLnN1YnN0cigwLDQpIT1cImhtYWNcIil7dGhyb3dcInNldEFsZ0FuZFByb3ZpZGVyIHVuc3VwcG9ydGVkIEhNQUMgYWxnOiBcIitrfWlmKGk9PT11bmRlZmluZWQpe2k9S0pVUi5jcnlwdG8uVXRpbC5ERUZBVUxUUFJPVklERVJba119dGhpcy5hbGdQcm92PWsrXCIvXCIraTt2YXIgZz1rLnN1YnN0cig0KTtpZihcIjptZDU6c2hhMTpzaGEyMjQ6c2hhMjU2OnNoYTM4NDpzaGE1MTI6cmlwZW1kMTYwOlwiLmluZGV4T2YoZykhPS0xJiZpPT1cImNyeXB0b2pzXCIpe3RyeXt2YXIgaj1LSlVSLmNyeXB0by5VdGlsLkNSWVBUT0pTTUVTU0FHRURJR0VTVE5BTUVbZ107dGhpcy5tYWM9Q3J5cHRvSlMuYWxnby5ITUFDLmNyZWF0ZShqLHRoaXMucGFzcyl9Y2F0Y2goaCl7dGhyb3dcInNldEFsZ0FuZFByb3ZpZGVyIGhhc2ggYWxnIHNldCBmYWlsIGhhc2hBbGc9XCIrZytcIi9cIitofXRoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKGwpe3RoaXMubWFjLnVwZGF0ZShsKX07dGhpcy51cGRhdGVIZXg9ZnVuY3Rpb24obCl7dmFyIG09Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShsKTt0aGlzLm1hYy51cGRhdGUobSl9O3RoaXMuZG9GaW5hbD1mdW5jdGlvbigpe3ZhciBsPXRoaXMubWFjLmZpbmFsaXplKCk7cmV0dXJuIGwudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLkhleCl9O3RoaXMuZG9GaW5hbFN0cmluZz1mdW5jdGlvbihsKXt0aGlzLnVwZGF0ZVN0cmluZyhsKTtyZXR1cm4gdGhpcy5kb0ZpbmFsKCl9O3RoaXMuZG9GaW5hbEhleD1mdW5jdGlvbihsKXt0aGlzLnVwZGF0ZUhleChsKTtyZXR1cm4gdGhpcy5kb0ZpbmFsKCl9fX07dGhpcy51cGRhdGVTdHJpbmc9ZnVuY3Rpb24oZyl7dGhyb3dcInVwZGF0ZVN0cmluZyhzdHIpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnUHJvdn07dGhpcy51cGRhdGVIZXg9ZnVuY3Rpb24oZyl7dGhyb3dcInVwZGF0ZUhleChoZXgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnUHJvdn07dGhpcy5kb0ZpbmFsPWZ1bmN0aW9uKCl7dGhyb3dcImRpZ2VzdCgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnUHJvdn07dGhpcy5kb0ZpbmFsU3RyaW5nPWZ1bmN0aW9uKGcpe3Rocm93XCJkaWdlc3RTdHJpbmcoc3RyKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ1Byb3Z9O3RoaXMuZG9GaW5hbEhleD1mdW5jdGlvbihnKXt0aHJvd1wiZGlnZXN0SGV4KGhleCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdQcm92fTt0aGlzLnNldFBhc3N3b3JkPWZ1bmN0aW9uKGgpe2lmKHR5cGVvZiBoPT1cInN0cmluZ1wiKXt2YXIgZz1oO2lmKGgubGVuZ3RoJTI9PTF8fCFoLm1hdGNoKC9eWzAtOUEtRmEtZl0rJC8pKXtnPXJzdHJ0b2hleChoKX10aGlzLnBhc3M9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShnKTtyZXR1cm59aWYodHlwZW9mIGghPVwib2JqZWN0XCIpe3Rocm93XCJLSlVSLmNyeXB0by5NYWMgdW5zdXBwb3J0ZWQgcGFzc3dvcmQgdHlwZTogXCIraH12YXIgZz1udWxsO2lmKGguaGV4IT09dW5kZWZpbmVkKXtpZihoLmhleC5sZW5ndGglMiE9MHx8IWguaGV4Lm1hdGNoKC9eWzAtOUEtRmEtZl0rJC8pKXt0aHJvd1wiTWFjOiB3cm9uZyBoZXggcGFzc3dvcmQ6IFwiK2guaGV4fWc9aC5oZXh9aWYoaC51dGY4IT09dW5kZWZpbmVkKXtnPXV0Zjh0b2hleChoLnV0ZjgpfWlmKGgucnN0ciE9PXVuZGVmaW5lZCl7Zz1yc3RydG9oZXgoaC5yc3RyKX1pZihoLmI2NCE9PXVuZGVmaW5lZCl7Zz1iNjR0b2hleChoLmI2NCl9aWYoaC5iNjR1IT09dW5kZWZpbmVkKXtnPWI2NHV0b2hleChoLmI2NHUpfWlmKGc9PW51bGwpe3Rocm93XCJLSlVSLmNyeXB0by5NYWMgdW5zdXBwb3J0ZWQgcGFzc3dvcmQgdHlwZTogXCIraH10aGlzLnBhc3M9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShnKX07aWYoZCE9PXVuZGVmaW5lZCl7aWYoZC5wYXNzIT09dW5kZWZpbmVkKXt0aGlzLnNldFBhc3N3b3JkKGQucGFzcyl9aWYoZC5hbGchPT11bmRlZmluZWQpe3RoaXMuYWxnTmFtZT1kLmFsZztpZihkLnByb3Y9PT11bmRlZmluZWQpe3RoaXMucHJvdk5hbWU9S0pVUi5jcnlwdG8uVXRpbC5ERUZBVUxUUFJPVklERVJbdGhpcy5hbGdOYW1lXX10aGlzLnNldEFsZ0FuZFByb3ZpZGVyKHRoaXMuYWxnTmFtZSx0aGlzLnByb3ZOYW1lKX19fTtLSlVSLmNyeXB0by5TaWduYXR1cmU9ZnVuY3Rpb24obyl7dmFyIHE9bnVsbDt2YXIgbj1udWxsO3ZhciByPW51bGw7dmFyIGM9bnVsbDt2YXIgbD1udWxsO3ZhciBkPW51bGw7dmFyIGs9bnVsbDt2YXIgaD1udWxsO3ZhciBwPW51bGw7dmFyIGU9bnVsbDt2YXIgYj0tMTt2YXIgZz1udWxsO3ZhciBqPW51bGw7dmFyIGE9bnVsbDt2YXIgaT1udWxsO3ZhciBmPW51bGw7dGhpcy5fc2V0QWxnTmFtZXM9ZnVuY3Rpb24oKXt2YXIgcz10aGlzLmFsZ05hbWUubWF0Y2goL14oLispd2l0aCguKykkLyk7aWYocyl7dGhpcy5tZEFsZ05hbWU9c1sxXS50b0xvd2VyQ2FzZSgpO3RoaXMucHVia2V5QWxnTmFtZT1zWzJdLnRvTG93ZXJDYXNlKCk7aWYodGhpcy5wdWJrZXlBbGdOYW1lPT1cInJzYWFuZG1nZjFcIiYmdGhpcy5tZEFsZ05hbWU9PVwic2hhXCIpe3RoaXMubWRBbGdOYW1lPVwic2hhMVwifX19O3RoaXMuX3plcm9QYWRkaW5nT2ZTaWduYXR1cmU9ZnVuY3Rpb24oeCx3KXt2YXIgdj1cIlwiO3ZhciB0PXcvNC14Lmxlbmd0aDtmb3IodmFyIHU9MDt1PHQ7dSsrKXt2PXYrXCIwXCJ9cmV0dXJuIHYreH07dGhpcy5zZXRBbGdBbmRQcm92aWRlcj1mdW5jdGlvbih1LHQpe3RoaXMuX3NldEFsZ05hbWVzKCk7aWYodCE9XCJjcnlwdG9qcy9qc3JzYVwiKXt0aHJvdyBuZXcgRXJyb3IoXCJwcm92aWRlciBub3Qgc3VwcG9ydGVkOiBcIit0KX1pZihcIjptZDU6c2hhMTpzaGEyMjQ6c2hhMjU2OnNoYTM4NDpzaGE1MTI6cmlwZW1kMTYwOlwiLmluZGV4T2YodGhpcy5tZEFsZ05hbWUpIT0tMSl7dHJ5e3RoaXMubWQ9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzp0aGlzLm1kQWxnTmFtZX0pfWNhdGNoKHMpe3Rocm93IG5ldyBFcnJvcihcInNldEFsZ0FuZFByb3ZpZGVyIGhhc2ggYWxnIHNldCBmYWlsIGFsZz1cIit0aGlzLm1kQWxnTmFtZStcIi9cIitzKX10aGlzLmluaXQ9ZnVuY3Rpb24odyx4KXt2YXIgeT1udWxsO3RyeXtpZih4PT09dW5kZWZpbmVkKXt5PUtFWVVUSUwuZ2V0S2V5KHcpfWVsc2V7eT1LRVlVVElMLmdldEtleSh3LHgpfX1jYXRjaCh2KXt0aHJvd1wiaW5pdCBmYWlsZWQ6XCIrdn1pZih5LmlzUHJpdmF0ZT09PXRydWUpe3RoaXMucHJ2S2V5PXk7dGhpcy5zdGF0ZT1cIlNJR05cIn1lbHNle2lmKHkuaXNQdWJsaWM9PT10cnVlKXt0aGlzLnB1YktleT15O3RoaXMuc3RhdGU9XCJWRVJJRllcIn1lbHNle3Rocm93XCJpbml0IGZhaWxlZC46XCIreX19fTt0aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbih2KXt0aGlzLm1kLnVwZGF0ZVN0cmluZyh2KX07dGhpcy51cGRhdGVIZXg9ZnVuY3Rpb24odil7dGhpcy5tZC51cGRhdGVIZXgodil9O3RoaXMuc2lnbj1mdW5jdGlvbigpe3RoaXMuc0hhc2hIZXg9dGhpcy5tZC5kaWdlc3QoKTtpZih0aGlzLnBydktleT09PXVuZGVmaW5lZCYmdGhpcy5lY3BydmhleCE9PXVuZGVmaW5lZCYmdGhpcy5lY2N1cnZlbmFtZSE9PXVuZGVmaW5lZCYmS0pVUi5jcnlwdG8uRUNEU0EhPT11bmRlZmluZWQpe3RoaXMucHJ2S2V5PW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6dGhpcy5lY2N1cnZlbmFtZSxwcnY6dGhpcy5lY3BydmhleH0pfWlmKHRoaXMucHJ2S2V5IGluc3RhbmNlb2YgUlNBS2V5JiZ0aGlzLnB1YmtleUFsZ05hbWU9PT1cInJzYWFuZG1nZjFcIil7dGhpcy5oU2lnbj10aGlzLnBydktleS5zaWduV2l0aE1lc3NhZ2VIYXNoUFNTKHRoaXMuc0hhc2hIZXgsdGhpcy5tZEFsZ05hbWUsdGhpcy5wc3NTYWx0TGVuKX1lbHNle2lmKHRoaXMucHJ2S2V5IGluc3RhbmNlb2YgUlNBS2V5JiZ0aGlzLnB1YmtleUFsZ05hbWU9PT1cInJzYVwiKXt0aGlzLmhTaWduPXRoaXMucHJ2S2V5LnNpZ25XaXRoTWVzc2FnZUhhc2godGhpcy5zSGFzaEhleCx0aGlzLm1kQWxnTmFtZSl9ZWxzZXtpZih0aGlzLnBydktleSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBKXt0aGlzLmhTaWduPXRoaXMucHJ2S2V5LnNpZ25XaXRoTWVzc2FnZUhhc2godGhpcy5zSGFzaEhleCl9ZWxzZXtpZih0aGlzLnBydktleSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkRTQSl7dGhpcy5oU2lnbj10aGlzLnBydktleS5zaWduV2l0aE1lc3NhZ2VIYXNoKHRoaXMuc0hhc2hIZXgpfWVsc2V7dGhyb3dcIlNpZ25hdHVyZTogdW5zdXBwb3J0ZWQgcHJpdmF0ZSBrZXkgYWxnOiBcIit0aGlzLnB1YmtleUFsZ05hbWV9fX19cmV0dXJuIHRoaXMuaFNpZ259O3RoaXMuc2lnblN0cmluZz1mdW5jdGlvbih2KXt0aGlzLnVwZGF0ZVN0cmluZyh2KTtyZXR1cm4gdGhpcy5zaWduKCl9O3RoaXMuc2lnbkhleD1mdW5jdGlvbih2KXt0aGlzLnVwZGF0ZUhleCh2KTtyZXR1cm4gdGhpcy5zaWduKCl9O3RoaXMudmVyaWZ5PWZ1bmN0aW9uKHYpe3RoaXMuc0hhc2hIZXg9dGhpcy5tZC5kaWdlc3QoKTtpZih0aGlzLnB1YktleT09PXVuZGVmaW5lZCYmdGhpcy5lY3B1YmhleCE9PXVuZGVmaW5lZCYmdGhpcy5lY2N1cnZlbmFtZSE9PXVuZGVmaW5lZCYmS0pVUi5jcnlwdG8uRUNEU0EhPT11bmRlZmluZWQpe3RoaXMucHViS2V5PW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6dGhpcy5lY2N1cnZlbmFtZSxwdWI6dGhpcy5lY3B1YmhleH0pfWlmKHRoaXMucHViS2V5IGluc3RhbmNlb2YgUlNBS2V5JiZ0aGlzLnB1YmtleUFsZ05hbWU9PT1cInJzYWFuZG1nZjFcIil7cmV0dXJuIHRoaXMucHViS2V5LnZlcmlmeVdpdGhNZXNzYWdlSGFzaFBTUyh0aGlzLnNIYXNoSGV4LHYsdGhpcy5tZEFsZ05hbWUsdGhpcy5wc3NTYWx0TGVuKX1lbHNle2lmKHRoaXMucHViS2V5IGluc3RhbmNlb2YgUlNBS2V5JiZ0aGlzLnB1YmtleUFsZ05hbWU9PT1cInJzYVwiKXtyZXR1cm4gdGhpcy5wdWJLZXkudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoKHRoaXMuc0hhc2hIZXgsdil9ZWxzZXtpZihLSlVSLmNyeXB0by5FQ0RTQSE9PXVuZGVmaW5lZCYmdGhpcy5wdWJLZXkgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSl7cmV0dXJuIHRoaXMucHViS2V5LnZlcmlmeVdpdGhNZXNzYWdlSGFzaCh0aGlzLnNIYXNoSGV4LHYpfWVsc2V7aWYoS0pVUi5jcnlwdG8uRFNBIT09dW5kZWZpbmVkJiZ0aGlzLnB1YktleSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkRTQSl7cmV0dXJuIHRoaXMucHViS2V5LnZlcmlmeVdpdGhNZXNzYWdlSGFzaCh0aGlzLnNIYXNoSGV4LHYpfWVsc2V7dGhyb3dcIlNpZ25hdHVyZTogdW5zdXBwb3J0ZWQgcHVibGljIGtleSBhbGc6IFwiK3RoaXMucHVia2V5QWxnTmFtZX19fX19fX07dGhpcy5pbml0PWZ1bmN0aW9uKHMsdCl7dGhyb3dcImluaXQoa2V5LCBwYXNzKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKHMpe3Rocm93XCJ1cGRhdGVTdHJpbmcoc3RyKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMudXBkYXRlSGV4PWZ1bmN0aW9uKHMpe3Rocm93XCJ1cGRhdGVIZXgoaGV4KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMuc2lnbj1mdW5jdGlvbigpe3Rocm93XCJzaWduKCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLnNpZ25TdHJpbmc9ZnVuY3Rpb24ocyl7dGhyb3dcImRpZ2VzdFN0cmluZyhzdHIpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy5zaWduSGV4PWZ1bmN0aW9uKHMpe3Rocm93XCJkaWdlc3RIZXgoaGV4KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMudmVyaWZ5PWZ1bmN0aW9uKHMpe3Rocm93XCJ2ZXJpZnkoaFNpZ1ZhbCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLmluaXRQYXJhbXM9bztpZihvIT09dW5kZWZpbmVkKXtpZihvLmFsZyE9PXVuZGVmaW5lZCl7dGhpcy5hbGdOYW1lPW8uYWxnO2lmKG8ucHJvdj09PXVuZGVmaW5lZCl7dGhpcy5wcm92TmFtZT1LSlVSLmNyeXB0by5VdGlsLkRFRkFVTFRQUk9WSURFUlt0aGlzLmFsZ05hbWVdfWVsc2V7dGhpcy5wcm92TmFtZT1vLnByb3Z9dGhpcy5hbGdQcm92TmFtZT10aGlzLmFsZ05hbWUrXCI6XCIrdGhpcy5wcm92TmFtZTt0aGlzLnNldEFsZ0FuZFByb3ZpZGVyKHRoaXMuYWxnTmFtZSx0aGlzLnByb3ZOYW1lKTt0aGlzLl9zZXRBbGdOYW1lcygpfWlmKG8ucHNzc2FsdGxlbiE9PXVuZGVmaW5lZCl7dGhpcy5wc3NTYWx0TGVuPW8ucHNzc2FsdGxlbn1pZihvLnBydmtleXBlbSE9PXVuZGVmaW5lZCl7aWYoby5wcnZrZXlwYXMhPT11bmRlZmluZWQpe3Rocm93XCJib3RoIHBydmtleXBlbSBhbmQgcHJ2a2V5cGFzIHBhcmFtZXRlcnMgbm90IHN1cHBvcnRlZFwifWVsc2V7dHJ5e3ZhciBxPUtFWVVUSUwuZ2V0S2V5KG8ucHJ2a2V5cGVtKTt0aGlzLmluaXQocSl9Y2F0Y2gobSl7dGhyb3dcImZhdGFsIGVycm9yIHRvIGxvYWQgcGVtIHByaXZhdGUga2V5OiBcIittfX19fX07S0pVUi5jcnlwdG8uQ2lwaGVyPWZ1bmN0aW9uKGEpe307S0pVUi5jcnlwdG8uQ2lwaGVyLmVuY3J5cHQ9ZnVuY3Rpb24oZSxmLGQpe2lmKGYgaW5zdGFuY2VvZiBSU0FLZXkmJmYuaXNQdWJsaWMpe3ZhciBjPUtKVVIuY3J5cHRvLkNpcGhlci5nZXRBbGdCeUtleUFuZE5hbWUoZixkKTtpZihjPT09XCJSU0FcIil7cmV0dXJuIGYuZW5jcnlwdChlKX1pZihjPT09XCJSU0FPQUVQXCIpe3JldHVybiBmLmVuY3J5cHRPQUVQKGUsXCJzaGExXCIpfXZhciBiPWMubWF0Y2goL15SU0FPQUVQKFxcZCspJC8pO2lmKGIhPT1udWxsKXtyZXR1cm4gZi5lbmNyeXB0T0FFUChlLFwic2hhXCIrYlsxXSl9dGhyb3dcIkNpcGhlci5lbmNyeXB0OiB1bnN1cHBvcnRlZCBhbGdvcml0aG0gZm9yIFJTQUtleTogXCIrZH1lbHNle3Rocm93XCJDaXBoZXIuZW5jcnlwdDogdW5zdXBwb3J0ZWQga2V5IG9yIGFsZ29yaXRobVwifX07S0pVUi5jcnlwdG8uQ2lwaGVyLmRlY3J5cHQ9ZnVuY3Rpb24oZSxmLGQpe2lmKGYgaW5zdGFuY2VvZiBSU0FLZXkmJmYuaXNQcml2YXRlKXt2YXIgYz1LSlVSLmNyeXB0by5DaXBoZXIuZ2V0QWxnQnlLZXlBbmROYW1lKGYsZCk7aWYoYz09PVwiUlNBXCIpe3JldHVybiBmLmRlY3J5cHQoZSl9aWYoYz09PVwiUlNBT0FFUFwiKXtyZXR1cm4gZi5kZWNyeXB0T0FFUChlLFwic2hhMVwiKX12YXIgYj1jLm1hdGNoKC9eUlNBT0FFUChcXGQrKSQvKTtpZihiIT09bnVsbCl7cmV0dXJuIGYuZGVjcnlwdE9BRVAoZSxcInNoYVwiK2JbMV0pfXRocm93XCJDaXBoZXIuZGVjcnlwdDogdW5zdXBwb3J0ZWQgYWxnb3JpdGhtIGZvciBSU0FLZXk6IFwiK2R9ZWxzZXt0aHJvd1wiQ2lwaGVyLmRlY3J5cHQ6IHVuc3VwcG9ydGVkIGtleSBvciBhbGdvcml0aG1cIn19O0tKVVIuY3J5cHRvLkNpcGhlci5nZXRBbGdCeUtleUFuZE5hbWU9ZnVuY3Rpb24oYixhKXtpZihiIGluc3RhbmNlb2YgUlNBS2V5KXtpZihcIjpSU0E6UlNBT0FFUDpSU0FPQUVQMjI0OlJTQU9BRVAyNTY6UlNBT0FFUDM4NDpSU0FPQUVQNTEyOlwiLmluZGV4T2YoYSkhPS0xKXtyZXR1cm4gYX1pZihhPT09bnVsbHx8YT09PXVuZGVmaW5lZCl7cmV0dXJuXCJSU0FcIn10aHJvd1wiZ2V0QWxnQnlLZXlBbmROYW1lOiBub3Qgc3VwcG9ydGVkIGFsZ29yaXRobSBuYW1lIGZvciBSU0FLZXk6IFwiK2F9dGhyb3dcImdldEFsZ0J5S2V5QW5kTmFtZTogbm90IHN1cHBvcnRlZCBhbGdvcml0aG0gbmFtZTogXCIrYX07S0pVUi5jcnlwdG8uT0lEPW5ldyBmdW5jdGlvbigpe3RoaXMub2lkaGV4Mm5hbWU9e1wiMmE4NjQ4ODZmNzBkMDEwMTAxXCI6XCJyc2FFbmNyeXB0aW9uXCIsXCIyYTg2NDhjZTNkMDIwMVwiOlwiZWNQdWJsaWNLZXlcIixcIjJhODY0OGNlMzgwNDAxXCI6XCJkc2FcIixcIjJhODY0OGNlM2QwMzAxMDdcIjpcInNlY3AyNTZyMVwiLFwiMmI4MTA0MDAxZlwiOlwic2VjcDE5MmsxXCIsXCIyYjgxMDQwMDIxXCI6XCJzZWNwMjI0cjFcIixcIjJiODEwNDAwMGFcIjpcInNlY3AyNTZrMVwiLFwiMmI4MTA0MDAyM1wiOlwic2VjcDUyMXIxXCIsXCIyYjgxMDQwMDIyXCI6XCJzZWNwMzg0cjFcIixcIjJhODY0OGNlMzgwNDAzXCI6XCJTSEExd2l0aERTQVwiLFwiNjA4NjQ4MDE2NTAzMDQwMzAxXCI6XCJTSEEyMjR3aXRoRFNBXCIsXCI2MDg2NDgwMTY1MDMwNDAzMDJcIjpcIlNIQTI1NndpdGhEU0FcIix9fTtcbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5jcnlwdG89PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmNyeXB0byl7S0pVUi5jcnlwdG89e319S0pVUi5jcnlwdG8uRUNEU0E9ZnVuY3Rpb24oZSl7dmFyIGc9XCJzZWNwMjU2cjFcIjt2YXIgcD1udWxsO3ZhciBiPW51bGw7dmFyIGk9bnVsbDt2YXIgaj1FcnJvcixmPUJpZ0ludGVnZXIsaD1FQ1BvaW50RnAsbT1LSlVSLmNyeXB0by5FQ0RTQSxjPUtKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIsZD1tLmdldE5hbWUscT1BU04xSEVYLG49cS5nZXRWYnlMaXN0RXgsaz1xLmlzQVNOMUhFWDt2YXIgYT1uZXcgU2VjdXJlUmFuZG9tKCk7dmFyIG89bnVsbDt0aGlzLnR5cGU9XCJFQ1wiO3RoaXMuaXNQcml2YXRlPWZhbHNlO3RoaXMuaXNQdWJsaWM9ZmFsc2U7ZnVuY3Rpb24gbCh4LHQsdyxzKXt2YXIgcj1NYXRoLm1heCh0LmJpdExlbmd0aCgpLHMuYml0TGVuZ3RoKCkpO3ZhciB5PXguYWRkMkQodyk7dmFyIHY9eC5jdXJ2ZS5nZXRJbmZpbml0eSgpO2Zvcih2YXIgdT1yLTE7dT49MDstLXUpe3Y9di50d2ljZTJEKCk7di56PWYuT05FO2lmKHQudGVzdEJpdCh1KSl7aWYocy50ZXN0Qml0KHUpKXt2PXYuYWRkMkQoeSl9ZWxzZXt2PXYuYWRkMkQoeCl9fWVsc2V7aWYocy50ZXN0Qml0KHUpKXt2PXYuYWRkMkQodyl9fX1yZXR1cm4gdn10aGlzLmdldEJpZ1JhbmRvbT1mdW5jdGlvbihyKXtyZXR1cm4gbmV3IGYoci5iaXRMZW5ndGgoKSxhKS5tb2Qoci5zdWJ0cmFjdChmLk9ORSkpLmFkZChmLk9ORSl9O3RoaXMuc2V0TmFtZWRDdXJ2ZT1mdW5jdGlvbihyKXt0aGlzLmVjcGFyYW1zPWMuZ2V0QnlOYW1lKHIpO3RoaXMucHJ2S2V5SGV4PW51bGw7dGhpcy5wdWJLZXlIZXg9bnVsbDt0aGlzLmN1cnZlTmFtZT1yfTt0aGlzLnNldFByaXZhdGVLZXlIZXg9ZnVuY3Rpb24ocil7dGhpcy5pc1ByaXZhdGU9dHJ1ZTt0aGlzLnBydktleUhleD1yfTt0aGlzLnNldFB1YmxpY0tleUhleD1mdW5jdGlvbihyKXt0aGlzLmlzUHVibGljPXRydWU7dGhpcy5wdWJLZXlIZXg9cn07dGhpcy5nZXRQdWJsaWNLZXlYWUhleD1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHViS2V5SGV4O2lmKHQuc3Vic3RyKDAsMikhPT1cIjA0XCIpe3Rocm93XCJ0aGlzIG1ldGhvZCBzdXBwb3J0cyB1bmNvbXByZXNzZWQgZm9ybWF0KDA0KSBvbmx5XCJ9dmFyIHM9dGhpcy5lY3BhcmFtcy5rZXlsZW4vNDtpZih0Lmxlbmd0aCE9PTIrcyoyKXt0aHJvd1wibWFsZm9ybWVkIHB1YmxpYyBrZXkgaGV4IGxlbmd0aFwifXZhciByPXt9O3IueD10LnN1YnN0cigyLHMpO3IueT10LnN1YnN0cigyK3MpO3JldHVybiByfTt0aGlzLmdldFNob3J0TklTVFBDdXJ2ZU5hbWU9ZnVuY3Rpb24oKXt2YXIgcj10aGlzLmN1cnZlTmFtZTtpZihyPT09XCJzZWNwMjU2cjFcInx8cj09PVwiTklTVCBQLTI1NlwifHxyPT09XCJQLTI1NlwifHxyPT09XCJwcmltZTI1NnYxXCIpe3JldHVyblwiUC0yNTZcIn1pZihyPT09XCJzZWNwMzg0cjFcInx8cj09PVwiTklTVCBQLTM4NFwifHxyPT09XCJQLTM4NFwiKXtyZXR1cm5cIlAtMzg0XCJ9cmV0dXJuIG51bGx9O3RoaXMuZ2VuZXJhdGVLZXlQYWlySGV4PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lY3BhcmFtcy5uO3ZhciB3PXRoaXMuZ2V0QmlnUmFuZG9tKHQpO3ZhciB1PXRoaXMuZWNwYXJhbXMuRy5tdWx0aXBseSh3KTt2YXIgej11LmdldFgoKS50b0JpZ0ludGVnZXIoKTt2YXIgeD11LmdldFkoKS50b0JpZ0ludGVnZXIoKTt2YXIgcj10aGlzLmVjcGFyYW1zLmtleWxlbi80O3ZhciB2PShcIjAwMDAwMDAwMDBcIit3LnRvU3RyaW5nKDE2KSkuc2xpY2UoLXIpO3ZhciBBPShcIjAwMDAwMDAwMDBcIit6LnRvU3RyaW5nKDE2KSkuc2xpY2UoLXIpO3ZhciB5PShcIjAwMDAwMDAwMDBcIit4LnRvU3RyaW5nKDE2KSkuc2xpY2UoLXIpO3ZhciBzPVwiMDRcIitBK3k7dGhpcy5zZXRQcml2YXRlS2V5SGV4KHYpO3RoaXMuc2V0UHVibGljS2V5SGV4KHMpO3JldHVybntlY3BydmhleDp2LGVjcHViaGV4OnN9fTt0aGlzLnNpZ25XaXRoTWVzc2FnZUhhc2g9ZnVuY3Rpb24ocil7cmV0dXJuIHRoaXMuc2lnbkhleChyLHRoaXMucHJ2S2V5SGV4KX07dGhpcy5zaWduSGV4PWZ1bmN0aW9uKHgsdSl7dmFyIEE9bmV3IGYodSwxNik7dmFyIHY9dGhpcy5lY3BhcmFtcy5uO3ZhciB6PW5ldyBmKHguc3Vic3RyaW5nKDAsdGhpcy5lY3BhcmFtcy5rZXlsZW4vNCksMTYpO2Rve3ZhciB3PXRoaXMuZ2V0QmlnUmFuZG9tKHYpO3ZhciBCPXRoaXMuZWNwYXJhbXMuRzt2YXIgeT1CLm11bHRpcGx5KHcpO3ZhciB0PXkuZ2V0WCgpLnRvQmlnSW50ZWdlcigpLm1vZCh2KX13aGlsZSh0LmNvbXBhcmVUbyhmLlpFUk8pPD0wKTt2YXIgQz13Lm1vZEludmVyc2UodikubXVsdGlwbHkoei5hZGQoQS5tdWx0aXBseSh0KSkpLm1vZCh2KTtyZXR1cm4gbS5iaVJTU2lnVG9BU04xU2lnKHQsQyl9O3RoaXMuc2lnbj1mdW5jdGlvbih3LEIpe3ZhciB6PUI7dmFyIHU9dGhpcy5lY3BhcmFtcy5uO3ZhciB5PWYuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKHcpO2Rve3ZhciB2PXRoaXMuZ2V0QmlnUmFuZG9tKHUpO3ZhciBBPXRoaXMuZWNwYXJhbXMuRzt2YXIgeD1BLm11bHRpcGx5KHYpO3ZhciB0PXguZ2V0WCgpLnRvQmlnSW50ZWdlcigpLm1vZCh1KX13aGlsZSh0LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pPD0wKTt2YXIgQz12Lm1vZEludmVyc2UodSkubXVsdGlwbHkoeS5hZGQoei5tdWx0aXBseSh0KSkpLm1vZCh1KTtyZXR1cm4gdGhpcy5zZXJpYWxpemVTaWcodCxDKX07dGhpcy52ZXJpZnlXaXRoTWVzc2FnZUhhc2g9ZnVuY3Rpb24ocyxyKXtyZXR1cm4gdGhpcy52ZXJpZnlIZXgocyxyLHRoaXMucHViS2V5SGV4KX07dGhpcy52ZXJpZnlIZXg9ZnVuY3Rpb24odix5LHUpe3RyeXt2YXIgdCxCO3ZhciB3PW0ucGFyc2VTaWdIZXgoeSk7dD13LnI7Qj13LnM7dmFyIHg9aC5kZWNvZGVGcm9tSGV4KHRoaXMuZWNwYXJhbXMuY3VydmUsdSk7dmFyIHo9bmV3IGYodi5zdWJzdHJpbmcoMCx0aGlzLmVjcGFyYW1zLmtleWxlbi80KSwxNik7cmV0dXJuIHRoaXMudmVyaWZ5UmF3KHosdCxCLHgpfWNhdGNoKEEpe3JldHVybiBmYWxzZX19O3RoaXMudmVyaWZ5PWZ1bmN0aW9uKHosQSx1KXt2YXIgdyx0O2lmKEJpdGNvaW4uVXRpbC5pc0FycmF5KEEpKXt2YXIgeT10aGlzLnBhcnNlU2lnKEEpO3c9eS5yO3Q9eS5zfWVsc2V7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBBJiZBLnImJkEucyl7dz1BLnI7dD1BLnN9ZWxzZXt0aHJvd1wiSW52YWxpZCB2YWx1ZSBmb3Igc2lnbmF0dXJlXCJ9fXZhciB2O2lmKHUgaW5zdGFuY2VvZiBFQ1BvaW50RnApe3Y9dX1lbHNle2lmKEJpdGNvaW4uVXRpbC5pc0FycmF5KHUpKXt2PWguZGVjb2RlRnJvbSh0aGlzLmVjcGFyYW1zLmN1cnZlLHUpfWVsc2V7dGhyb3dcIkludmFsaWQgZm9ybWF0IGZvciBwdWJrZXkgdmFsdWUsIG11c3QgYmUgYnl0ZSBhcnJheSBvciBFQ1BvaW50RnBcIn19dmFyIHg9Zi5mcm9tQnl0ZUFycmF5VW5zaWduZWQoeik7cmV0dXJuIHRoaXMudmVyaWZ5UmF3KHgsdyx0LHYpfTt0aGlzLnZlcmlmeVJhdz1mdW5jdGlvbih6LHQsRSx5KXt2YXIgeD10aGlzLmVjcGFyYW1zLm47dmFyIEQ9dGhpcy5lY3BhcmFtcy5HO2lmKHQuY29tcGFyZVRvKGYuT05FKTwwfHx0LmNvbXBhcmVUbyh4KT49MCl7cmV0dXJuIGZhbHNlfWlmKEUuY29tcGFyZVRvKGYuT05FKTwwfHxFLmNvbXBhcmVUbyh4KT49MCl7cmV0dXJuIGZhbHNlfXZhciBBPUUubW9kSW52ZXJzZSh4KTt2YXIgdz16Lm11bHRpcGx5KEEpLm1vZCh4KTt2YXIgdT10Lm11bHRpcGx5KEEpLm1vZCh4KTt2YXIgQj1ELm11bHRpcGx5KHcpLmFkZCh5Lm11bHRpcGx5KHUpKTt2YXIgQz1CLmdldFgoKS50b0JpZ0ludGVnZXIoKS5tb2QoeCk7cmV0dXJuIEMuZXF1YWxzKHQpfTt0aGlzLnNlcmlhbGl6ZVNpZz1mdW5jdGlvbih2LHUpe3ZhciB3PXYudG9CeXRlQXJyYXlTaWduZWQoKTt2YXIgdD11LnRvQnl0ZUFycmF5U2lnbmVkKCk7dmFyIHg9W107eC5wdXNoKDIpO3gucHVzaCh3Lmxlbmd0aCk7eD14LmNvbmNhdCh3KTt4LnB1c2goMik7eC5wdXNoKHQubGVuZ3RoKTt4PXguY29uY2F0KHQpO3gudW5zaGlmdCh4Lmxlbmd0aCk7eC51bnNoaWZ0KDQ4KTtyZXR1cm4geH07dGhpcy5wYXJzZVNpZz1mdW5jdGlvbih5KXt2YXIgeDtpZih5WzBdIT00OCl7dGhyb3cgbmV3IEVycm9yKFwiU2lnbmF0dXJlIG5vdCBhIHZhbGlkIERFUlNlcXVlbmNlXCIpfXg9MjtpZih5W3hdIT0yKXt0aHJvdyBuZXcgRXJyb3IoXCJGaXJzdCBlbGVtZW50IGluIHNpZ25hdHVyZSBtdXN0IGJlIGEgREVSSW50ZWdlclwiKX12YXIgdz15LnNsaWNlKHgrMix4KzIreVt4KzFdKTt4Kz0yK3lbeCsxXTtpZih5W3hdIT0yKXt0aHJvdyBuZXcgRXJyb3IoXCJTZWNvbmQgZWxlbWVudCBpbiBzaWduYXR1cmUgbXVzdCBiZSBhIERFUkludGVnZXJcIil9dmFyIHQ9eS5zbGljZSh4KzIseCsyK3lbeCsxXSk7eCs9Mit5W3grMV07dmFyIHY9Zi5mcm9tQnl0ZUFycmF5VW5zaWduZWQodyk7dmFyIHU9Zi5mcm9tQnl0ZUFycmF5VW5zaWduZWQodCk7cmV0dXJue3I6dixzOnV9fTt0aGlzLnBhcnNlU2lnQ29tcGFjdD1mdW5jdGlvbih3KXtpZih3Lmxlbmd0aCE9PTY1KXt0aHJvd1wiU2lnbmF0dXJlIGhhcyB0aGUgd3JvbmcgbGVuZ3RoXCJ9dmFyIHQ9d1swXS0yNztpZih0PDB8fHQ+Nyl7dGhyb3dcIkludmFsaWQgc2lnbmF0dXJlIHR5cGVcIn12YXIgeD10aGlzLmVjcGFyYW1zLm47dmFyIHY9Zi5mcm9tQnl0ZUFycmF5VW5zaWduZWQody5zbGljZSgxLDMzKSkubW9kKHgpO3ZhciB1PWYuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKHcuc2xpY2UoMzMsNjUpKS5tb2QoeCk7cmV0dXJue3I6dixzOnUsaTp0fX07dGhpcy5yZWFkUEtDUzVQcnZLZXlIZXg9ZnVuY3Rpb24odSl7aWYoayh1KT09PWZhbHNlKXt0aHJvdyBuZXcgRXJyb3IoXCJub3QgQVNOLjEgaGV4IHN0cmluZ1wiKX12YXIgcix0LHY7dHJ5e3I9bih1LDAsW1wiWzBdXCIsMF0sXCIwNlwiKTt0PW4odSwwLFsxXSxcIjA0XCIpO3RyeXt2PW4odSwwLFtcIlsxXVwiLDBdLFwiMDNcIil9Y2F0Y2gocyl7fX1jYXRjaChzKXt0aHJvdyBuZXcgRXJyb3IoXCJtYWxmb3JtZWQgUEtDUyMxLzUgcGxhaW4gRUNDIHByaXZhdGUga2V5XCIpfXRoaXMuY3VydmVOYW1lPWQocik7aWYodGhpcy5jdXJ2ZU5hbWU9PT11bmRlZmluZWQpe3Rocm93XCJ1bnN1cHBvcnRlZCBjdXJ2ZSBuYW1lXCJ9dGhpcy5zZXROYW1lZEN1cnZlKHRoaXMuY3VydmVOYW1lKTt0aGlzLnNldFB1YmxpY0tleUhleCh2KTt0aGlzLnNldFByaXZhdGVLZXlIZXgodCk7dGhpcy5pc1B1YmxpYz1mYWxzZX07dGhpcy5yZWFkUEtDUzhQcnZLZXlIZXg9ZnVuY3Rpb24odil7aWYoayh2KT09PWZhbHNlKXt0aHJvdyBuZXcgaihcIm5vdCBBU04uMSBoZXggc3RyaW5nXCIpfXZhciB0LHIsdSx3O3RyeXt0PW4odiwwLFsxLDBdLFwiMDZcIik7cj1uKHYsMCxbMSwxXSxcIjA2XCIpO3U9bih2LDAsWzIsMCwxXSxcIjA0XCIpO3RyeXt3PW4odiwwLFsyLDAsXCJbMV1cIiwwXSxcIjAzXCIpfWNhdGNoKHMpe319Y2F0Y2gocyl7dGhyb3cgbmV3IGooXCJtYWxmb3JtZWQgUEtDUyM4IHBsYWluIEVDQyBwcml2YXRlIGtleVwiKX10aGlzLmN1cnZlTmFtZT1kKHIpO2lmKHRoaXMuY3VydmVOYW1lPT09dW5kZWZpbmVkKXt0aHJvdyBuZXcgaihcInVuc3VwcG9ydGVkIGN1cnZlIG5hbWVcIil9dGhpcy5zZXROYW1lZEN1cnZlKHRoaXMuY3VydmVOYW1lKTt0aGlzLnNldFB1YmxpY0tleUhleCh3KTt0aGlzLnNldFByaXZhdGVLZXlIZXgodSk7dGhpcy5pc1B1YmxpYz1mYWxzZX07dGhpcy5yZWFkUEtDUzhQdWJLZXlIZXg9ZnVuY3Rpb24odSl7aWYoayh1KT09PWZhbHNlKXt0aHJvdyBuZXcgaihcIm5vdCBBU04uMSBoZXggc3RyaW5nXCIpfXZhciB0LHIsdjt0cnl7dD1uKHUsMCxbMCwwXSxcIjA2XCIpO3I9bih1LDAsWzAsMV0sXCIwNlwiKTt2PW4odSwwLFsxXSxcIjAzXCIpfWNhdGNoKHMpe3Rocm93IG5ldyBqKFwibWFsZm9ybWVkIFBLQ1MjOCBFQ0MgcHVibGljIGtleVwiKX10aGlzLmN1cnZlTmFtZT1kKHIpO2lmKHRoaXMuY3VydmVOYW1lPT09bnVsbCl7dGhyb3cgbmV3IGooXCJ1bnN1cHBvcnRlZCBjdXJ2ZSBuYW1lXCIpfXRoaXMuc2V0TmFtZWRDdXJ2ZSh0aGlzLmN1cnZlTmFtZSk7dGhpcy5zZXRQdWJsaWNLZXlIZXgodil9O3RoaXMucmVhZENlcnRQdWJLZXlIZXg9ZnVuY3Rpb24odCx2KXtpZihrKHQpPT09ZmFsc2Upe3Rocm93IG5ldyBqKFwibm90IEFTTi4xIGhleCBzdHJpbmdcIil9dmFyIHIsdTt0cnl7cj1uKHQsMCxbMCw1LDAsMV0sXCIwNlwiKTt1PW4odCwwLFswLDUsMV0sXCIwM1wiKX1jYXRjaChzKXt0aHJvdyBuZXcgaihcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBFQ0MgcHVibGljIGtleVwiKX10aGlzLmN1cnZlTmFtZT1kKHIpO2lmKHRoaXMuY3VydmVOYW1lPT09bnVsbCl7dGhyb3cgbmV3IGooXCJ1bnN1cHBvcnRlZCBjdXJ2ZSBuYW1lXCIpfXRoaXMuc2V0TmFtZWRDdXJ2ZSh0aGlzLmN1cnZlTmFtZSk7dGhpcy5zZXRQdWJsaWNLZXlIZXgodSl9O2lmKGUhPT11bmRlZmluZWQpe2lmKGUuY3VydmUhPT11bmRlZmluZWQpe3RoaXMuY3VydmVOYW1lPWUuY3VydmV9fWlmKHRoaXMuY3VydmVOYW1lPT09dW5kZWZpbmVkKXt0aGlzLmN1cnZlTmFtZT1nfXRoaXMuc2V0TmFtZWRDdXJ2ZSh0aGlzLmN1cnZlTmFtZSk7aWYoZSE9PXVuZGVmaW5lZCl7aWYoZS5wcnYhPT11bmRlZmluZWQpe3RoaXMuc2V0UHJpdmF0ZUtleUhleChlLnBydil9aWYoZS5wdWIhPT11bmRlZmluZWQpe3RoaXMuc2V0UHVibGljS2V5SGV4KGUucHViKX19fTtLSlVSLmNyeXB0by5FQ0RTQS5wYXJzZVNpZ0hleD1mdW5jdGlvbihhKXt2YXIgYj1LSlVSLmNyeXB0by5FQ0RTQS5wYXJzZVNpZ0hleEluSGV4UlMoYSk7dmFyIGQ9bmV3IEJpZ0ludGVnZXIoYi5yLDE2KTt2YXIgYz1uZXcgQmlnSW50ZWdlcihiLnMsMTYpO3JldHVybntyOmQsczpjfX07S0pVUi5jcnlwdG8uRUNEU0EucGFyc2VTaWdIZXhJbkhleFJTPWZ1bmN0aW9uKGYpe3ZhciBqPUFTTjFIRVgsaT1qLmdldENoaWxkSWR4LGc9ai5nZXRWO2ouY2hlY2tTdHJpY3RERVIoZiwwKTtpZihmLnN1YnN0cigwLDIpIT1cIjMwXCIpe3Rocm93IG5ldyBFcnJvcihcInNpZ25hdHVyZSBpcyBub3QgYSBBU04uMSBzZXF1ZW5jZVwiKX12YXIgaD1pKGYsMCk7aWYoaC5sZW5ndGghPTIpe3Rocm93IG5ldyBFcnJvcihcInNpZ25hdHVyZSBzaGFsbCBoYXZlIHR3byBlbGVtZW50c1wiKX12YXIgZT1oWzBdO3ZhciBkPWhbMV07aWYoZi5zdWJzdHIoZSwyKSE9XCIwMlwiKXt0aHJvdyBuZXcgRXJyb3IoXCIxc3QgaXRlbSBub3QgQVNOLjEgaW50ZWdlclwiKX1pZihmLnN1YnN0cihkLDIpIT1cIjAyXCIpe3Rocm93IG5ldyBFcnJvcihcIjJuZCBpdGVtIG5vdCBBU04uMSBpbnRlZ2VyXCIpfXZhciBjPWcoZixlKTt2YXIgYj1nKGYsZCk7cmV0dXJue3I6YyxzOmJ9fTtLSlVSLmNyeXB0by5FQ0RTQS5hc24xU2lnVG9Db25jYXRTaWc9ZnVuY3Rpb24oYyl7dmFyIGQ9S0pVUi5jcnlwdG8uRUNEU0EucGFyc2VTaWdIZXhJbkhleFJTKGMpO3ZhciBiPWQucjt2YXIgYT1kLnM7aWYoYi5zdWJzdHIoMCwyKT09XCIwMFwiJiYoYi5sZW5ndGglMzIpPT0yKXtiPWIuc3Vic3RyKDIpfWlmKGEuc3Vic3RyKDAsMik9PVwiMDBcIiYmKGEubGVuZ3RoJTMyKT09Mil7YT1hLnN1YnN0cigyKX1pZigoYi5sZW5ndGglMzIpPT0zMCl7Yj1cIjAwXCIrYn1pZigoYS5sZW5ndGglMzIpPT0zMCl7YT1cIjAwXCIrYX1pZihiLmxlbmd0aCUzMiE9MCl7dGhyb3dcInVua25vd24gRUNEU0Egc2lnIHIgbGVuZ3RoIGVycm9yXCJ9aWYoYS5sZW5ndGglMzIhPTApe3Rocm93XCJ1bmtub3duIEVDRFNBIHNpZyBzIGxlbmd0aCBlcnJvclwifXJldHVybiBiK2F9O0tKVVIuY3J5cHRvLkVDRFNBLmNvbmNhdFNpZ1RvQVNOMVNpZz1mdW5jdGlvbihhKXtpZigoKChhLmxlbmd0aC8yKSo4KSUoMTYqOCkpIT0wKXt0aHJvd1widW5rbm93biBFQ0RTQSBjb25jYXRpbmF0ZWQgci1zIHNpZyAgbGVuZ3RoIGVycm9yXCJ9dmFyIGM9YS5zdWJzdHIoMCxhLmxlbmd0aC8yKTt2YXIgYj1hLnN1YnN0cihhLmxlbmd0aC8yKTtyZXR1cm4gS0pVUi5jcnlwdG8uRUNEU0EuaGV4UlNTaWdUb0FTTjFTaWcoYyxiKX07S0pVUi5jcnlwdG8uRUNEU0EuaGV4UlNTaWdUb0FTTjFTaWc9ZnVuY3Rpb24oYixhKXt2YXIgZD1uZXcgQmlnSW50ZWdlcihiLDE2KTt2YXIgYz1uZXcgQmlnSW50ZWdlcihhLDE2KTtyZXR1cm4gS0pVUi5jcnlwdG8uRUNEU0EuYmlSU1NpZ1RvQVNOMVNpZyhkLGMpfTtLSlVSLmNyeXB0by5FQ0RTQS5iaVJTU2lnVG9BU04xU2lnPWZ1bmN0aW9uKGYsZCl7dmFyIGM9S0pVUi5hc24xO3ZhciBiPW5ldyBjLkRFUkludGVnZXIoe2JpZ2ludDpmfSk7dmFyIGE9bmV3IGMuREVSSW50ZWdlcih7YmlnaW50OmR9KTt2YXIgZT1uZXcgYy5ERVJTZXF1ZW5jZSh7YXJyYXk6W2IsYV19KTtyZXR1cm4gZS5nZXRFbmNvZGVkSGV4KCl9O0tKVVIuY3J5cHRvLkVDRFNBLmdldE5hbWU9ZnVuY3Rpb24oYSl7aWYoYT09PVwiMmI4MTA0MDAxZlwiKXtyZXR1cm5cInNlY3AxOTJrMVwifWlmKGE9PT1cIjJhODY0OGNlM2QwMzAxMDdcIil7cmV0dXJuXCJzZWNwMjU2cjFcIn1pZihhPT09XCIyYjgxMDQwMDBhXCIpe3JldHVyblwic2VjcDI1NmsxXCJ9aWYoYT09PVwiMmI4MTA0MDAyMVwiKXtyZXR1cm5cInNlY3AyMjRyMVwifWlmKGE9PT1cIjJiODEwNDAwMjJcIil7cmV0dXJuXCJzZWNwMzg0cjFcIn1pZihcInxzZWNwMjU2cjF8TklTVCBQLTI1NnxQLTI1NnxwcmltZTI1NnYxfFwiLmluZGV4T2YoYSkhPT0tMSl7cmV0dXJuXCJzZWNwMjU2cjFcIn1pZihcInxzZWNwMjU2azF8XCIuaW5kZXhPZihhKSE9PS0xKXtyZXR1cm5cInNlY3AyNTZrMVwifWlmKFwifHNlY3AyMjRyMXxOSVNUIFAtMjI0fFAtMjI0fFwiLmluZGV4T2YoYSkhPT0tMSl7cmV0dXJuXCJzZWNwMjI0cjFcIn1pZihcInxzZWNwMzg0cjF8TklTVCBQLTM4NHxQLTM4NHxcIi5pbmRleE9mKGEpIT09LTEpe3JldHVyblwic2VjcDM4NHIxXCJ9cmV0dXJuIG51bGx9O1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmNyeXB0bz09XCJ1bmRlZmluZWRcInx8IUtKVVIuY3J5cHRvKXtLSlVSLmNyeXB0bz17fX1LSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCPW5ldyBmdW5jdGlvbigpe3ZhciBiPXt9O3ZhciBjPXt9O2Z1bmN0aW9uIGEoZCl7cmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGQsMTYpfXRoaXMuZ2V0QnlOYW1lPWZ1bmN0aW9uKGUpe3ZhciBkPWU7aWYodHlwZW9mIGNbZF0hPVwidW5kZWZpbmVkXCIpe2Q9Y1tlXX1pZih0eXBlb2YgYltkXSE9XCJ1bmRlZmluZWRcIil7cmV0dXJuIGJbZF19dGhyb3dcInVucmVnaXN0ZXJlZCBFQyBjdXJ2ZSBuYW1lOiBcIitkfTt0aGlzLnJlZ2lzdD1mdW5jdGlvbihBLGwsbyxnLG0sZSxqLGYsayx1LGQseCl7YltBXT17fTt2YXIgcz1hKG8pO3ZhciB6PWEoZyk7dmFyIHk9YShtKTt2YXIgdD1hKGUpO3ZhciB3PWEoaik7dmFyIHI9bmV3IEVDQ3VydmVGcChzLHoseSk7dmFyIHE9ci5kZWNvZGVQb2ludEhleChcIjA0XCIrZitrKTtiW0FdW1wibmFtZVwiXT1BO2JbQV1bXCJrZXlsZW5cIl09bDtiW0FdW1wiY3VydmVcIl09cjtiW0FdW1wiR1wiXT1xO2JbQV1bXCJuXCJdPXQ7YltBXVtcImhcIl09dztiW0FdW1wib2lkXCJdPWQ7YltBXVtcImluZm9cIl09eDtmb3IodmFyIHY9MDt2PHUubGVuZ3RoO3YrKyl7Y1t1W3ZdXT1BfX19O0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDEyOHIxXCIsMTI4LFwiRkZGRkZGRkRGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZcIixcIkZGRkZGRkZERkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZDXCIsXCJFODc1NzlDMTEwNzlGNDNERDgyNDk5M0MyQ0VFNUVEM1wiLFwiRkZGRkZGRkUwMDAwMDAwMDc1QTMwRDFCOTAzOEExMTVcIixcIjFcIixcIjE2MUZGNzUyOEI4OTlCMkQwQzI4NjA3Q0E1MkM1Qjg2XCIsXCJDRjVBQzgzOTVCQUZFQjEzQzAyREEyOTJEREVEN0E4M1wiLFtdLFwiXCIsXCJzZWNwMTI4cjEgOiBTRUNHIGN1cnZlIG92ZXIgYSAxMjggYml0IHByaW1lIGZpZWxkXCIpO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDE2MGsxXCIsMTYwLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGQUM3M1wiLFwiMFwiLFwiN1wiLFwiMDEwMDAwMDAwMDAwMDAwMDAwMDAwMUI4RkExNkRGQUI5QUNBMTZCNkIzXCIsXCIxXCIsXCIzQjRDMzgyQ0UzN0FBMTkyQTQwMTlFNzYzMDM2RjRGNURENEQ3RUJCXCIsXCI5MzhDRjkzNTMxOEZEQ0VENkJDMjgyODY1MzE3MzNDM0YwM0M0RkVFXCIsW10sXCJcIixcInNlY3AxNjBrMSA6IFNFQ0cgY3VydmUgb3ZlciBhIDE2MCBiaXQgcHJpbWUgZmllbGRcIik7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMTYwcjFcIiwxNjAsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjdGRkZGRkZGXCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjdGRkZGRkZDXCIsXCIxQzk3QkVGQzU0QkQ3QThCNjVBQ0Y4OUY4MUQ0RDRBREM1NjVGQTQ1XCIsXCIwMTAwMDAwMDAwMDAwMDAwMDAwMDAxRjRDOEY5MjdBRUQzQ0E3NTIyNTdcIixcIjFcIixcIjRBOTZCNTY4OEVGNTczMjg0NjY0Njk4OTY4QzM4QkI5MTNDQkZDODJcIixcIjIzQTYyODU1MzE2ODk0N0Q1OURDQzkxMjA0MjM1MTM3N0FDNUZCMzJcIixbXSxcIlwiLFwic2VjcDE2MHIxIDogU0VDRyBjdXJ2ZSBvdmVyIGEgMTYwIGJpdCBwcmltZSBmaWVsZFwiKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AxOTJrMVwiLDE5MixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRUUzN1wiLFwiMFwiLFwiM1wiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFMjZGMkZDMTcwRjY5NDY2QTc0REVGRDhEXCIsXCIxXCIsXCJEQjRGRjEwRUMwNTdFOUFFMjZCMDdEMDI4MEI3RjQzNDFEQTVEMUIxRUFFMDZDN0RcIixcIjlCMkYyRjZEOUM1NjI4QTc4NDQxNjNEMDE1QkU4NjM0NDA4MkFBODhEOTVFMkY5RFwiLFtdKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AxOTJyMVwiLDE5MixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkZGRkZGRkZGRkZGRlwiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRkZGRkZGRkZDXCIsXCI2NDIxMDUxOUU1OUM4MEU3MEZBN0U5QUI3MjI0MzA0OUZFQjhERUVDQzE0NkI5QjFcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjk5REVGODM2MTQ2QkM5QjFCNEQyMjgzMVwiLFwiMVwiLFwiMTg4REE4MEVCMDMwOTBGNjdDQkYyMEVCNDNBMTg4MDBGNEZGMEFGRDgyRkYxMDEyXCIsXCIwNzE5MkI5NUZGQzhEQTc4NjMxMDExRUQ2QjI0Q0RENTczRjk3N0ExMUU3OTQ4MTFcIixbXSk7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMjI0cjFcIiwyMjQsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMVwiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVcIixcIkI0MDUwQTg1MEMwNEIzQUJGNTQxMzI1NjUwNDRCMEI3RDdCRkQ4QkEyNzBCMzk0MzIzNTVGRkI0XCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGMTZBMkUwQjhGMDNFMTNERDI5NDU1QzVDMkEzRFwiLFwiMVwiLFwiQjcwRTBDQkQ2QkI0QkY3RjMyMTM5MEI5NEEwM0MxRDM1NkMyMTEyMjM0MzI4MEQ2MTE1QzFEMjFcIixcIkJEMzc2Mzg4QjVGNzIzRkI0QzIyREZFNkNENDM3NUEwNUEwNzQ3NjQ0NEQ1ODE5OTg1MDA3RTM0XCIsW10pO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDI1NmsxXCIsMjU2LFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkMyRlwiLFwiMFwiLFwiN1wiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVCQUFFRENFNkFGNDhBMDNCQkZEMjVFOENEMDM2NDE0MVwiLFwiMVwiLFwiNzlCRTY2N0VGOURDQkJBQzU1QTA2Mjk1Q0U4NzBCMDcwMjlCRkNEQjJEQ0UyOEQ5NTlGMjgxNUIxNkY4MTc5OFwiLFwiNDgzQURBNzcyNkEzQzQ2NTVEQTRGQkZDMEUxMTA4QThGRDE3QjQ0OEE2ODU1NDE5OUM0N0QwOEZGQjEwRDRCOFwiLFtdKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AyNTZyMVwiLDI1NixcIkZGRkZGRkZGMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZcIixcIkZGRkZGRkZGMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkNcIixcIjVBQzYzNUQ4QUEzQTkzRTdCM0VCQkQ1NTc2OTg4NkJDNjUxRDA2QjBDQzUzQjBGNjNCQ0UzQzNFMjdEMjYwNEJcIixcIkZGRkZGRkZGMDAwMDAwMDBGRkZGRkZGRkZGRkZGRkZGQkNFNkZBQURBNzE3OUU4NEYzQjlDQUMyRkM2MzI1NTFcIixcIjFcIixcIjZCMTdEMUYyRTEyQzQyNDdGOEJDRTZFNTYzQTQ0MEYyNzcwMzdEODEyREVCMzNBMEY0QTEzOTQ1RDg5OEMyOTZcIixcIjRGRTM0MkUyRkUxQTdGOUI4RUU3RUI0QTdDMEY5RTE2MkJDRTMzNTc2QjMxNUVDRUNCQjY0MDY4MzdCRjUxRjVcIixbXCJOSVNUIFAtMjU2XCIsXCJQLTI1NlwiLFwicHJpbWUyNTZ2MVwiXSk7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMzg0cjFcIiwzODQsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkZGRkYwMDAwMDAwMDAwMDAwMDAwRkZGRkZGRkZcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGQ1wiLFwiQjMzMTJGQTdFMjNFRTdFNDk4OEUwNTZCRTNGODJEMTkxODFEOUM2RUZFODE0MTEyMDMxNDA4OEY1MDEzODc1QUM2NTYzOThEOEEyRUQxOUQyQTg1QzhFREQzRUMyQUVGXCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZDNzYzNEQ4MUY0MzcyRERGNTgxQTBEQjI0OEIwQTc3QUVDRUMxOTZBQ0NDNTI5NzNcIixcIjFcIixcIkFBODdDQTIyQkU4QjA1Mzc4RUIxQzcxRUYzMjBBRDc0NkUxRDNCNjI4QkE3OUI5ODU5Rjc0MUUwODI1NDJBMzg1NTAyRjI1REJGNTUyOTZDM0E1NDVFMzg3Mjc2MEFCN1wiLFwiMzYxN2RlNGE5NjI2MmM2ZjVkOWU5OGJmOTI5MmRjMjlmOGY0MWRiZDI4OWExNDdjZTlkYTMxMTNiNWYwYjhjMDBhNjBiMWNlMWQ3ZTgxOWQ3YTQzMWQ3YzkwZWEwZTVmXCIsW1wiTklTVCBQLTM4NFwiLFwiUC0zODRcIl0pO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDUyMXIxXCIsNTIxLFwiMUZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZcIixcIjFGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZDXCIsXCIwNTE5NTNFQjk2MThFMUM5QTFGOTI5QTIxQTBCNjg1NDBFRUEyREE3MjVCOTlCMzE1RjNCOEI0ODk5MThFRjEwOUUxNTYxOTM5NTFFQzdFOTM3QjE2NTJDMEJEM0JCMUJGMDczNTczREY4ODNEMkMzNEYxRUY0NTFGRDQ2QjUwM0YwMFwiLFwiMUZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQTUxODY4NzgzQkYyRjk2NkI3RkNDMDE0OEY3MDlBNUQwM0JCNUM5Qjg4OTlDNDdBRUJCNkZCNzFFOTEzODY0MDlcIixcIjFcIixcIkM2ODU4RTA2QjcwNDA0RTlDRDlFM0VDQjY2MjM5NUI0NDI5QzY0ODEzOTA1M0ZCNTIxRjgyOEFGNjA2QjREM0RCQUExNEI1RTc3RUZFNzU5MjhGRTFEQzEyN0EyRkZBOERFMzM0OEIzQzE4NTZBNDI5QkY5N0U3RTMxQzJFNUJENjZcIixcIjAxMTgzOTI5NmE3ODlhM2JjMDA0NWM4YTVmYjQyYzdkMWJkOTk4ZjU0NDQ5NTc5YjQ0NjgxN2FmYmQxNzI3M2U2NjJjOTdlZTcyOTk1ZWY0MjY0MGM1NTBiOTAxM2ZhZDA3NjEzNTNjNzA4NmEyNzJjMjQwODhiZTk0NzY5ZmQxNjY1MFwiLFtcIk5JU1QgUC01MjFcIixcIlAtNTIxXCJdKTtcbnZhciBLRVlVVElMPWZ1bmN0aW9uKCl7dmFyIGQ9ZnVuY3Rpb24ocCxyLHEpe3JldHVybiBrKENyeXB0b0pTLkFFUyxwLHIscSl9O3ZhciBlPWZ1bmN0aW9uKHAscixxKXtyZXR1cm4gayhDcnlwdG9KUy5UcmlwbGVERVMscCxyLHEpfTt2YXIgYT1mdW5jdGlvbihwLHIscSl7cmV0dXJuIGsoQ3J5cHRvSlMuREVTLHAscixxKX07dmFyIGs9ZnVuY3Rpb24ocyx4LHUscSl7dmFyIHI9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh4KTt2YXIgdz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHUpO3ZhciBwPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UocSk7dmFyIHQ9e307dC5rZXk9dzt0Lml2PXA7dC5jaXBoZXJ0ZXh0PXI7dmFyIHY9cy5kZWNyeXB0KHQsdyx7aXY6cH0pO3JldHVybiBDcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeSh2KX07dmFyIGw9ZnVuY3Rpb24ocCxyLHEpe3JldHVybiBnKENyeXB0b0pTLkFFUyxwLHIscSl9O3ZhciBvPWZ1bmN0aW9uKHAscixxKXtyZXR1cm4gZyhDcnlwdG9KUy5UcmlwbGVERVMscCxyLHEpfTt2YXIgZj1mdW5jdGlvbihwLHIscSl7cmV0dXJuIGcoQ3J5cHRvSlMuREVTLHAscixxKX07dmFyIGc9ZnVuY3Rpb24odCx5LHYscSl7dmFyIHM9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh5KTt2YXIgeD1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHYpO3ZhciBwPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UocSk7dmFyIHc9dC5lbmNyeXB0KHMseCx7aXY6cH0pO3ZhciByPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uody50b1N0cmluZygpKTt2YXIgdT1DcnlwdG9KUy5lbmMuQmFzZTY0LnN0cmluZ2lmeShyKTtyZXR1cm4gdX07dmFyIGk9e1wiQUVTLTI1Ni1DQkNcIjp7cHJvYzpkLGVwcm9jOmwsa2V5bGVuOjMyLGl2bGVuOjE2fSxcIkFFUy0xOTItQ0JDXCI6e3Byb2M6ZCxlcHJvYzpsLGtleWxlbjoyNCxpdmxlbjoxNn0sXCJBRVMtMTI4LUNCQ1wiOntwcm9jOmQsZXByb2M6bCxrZXlsZW46MTYsaXZsZW46MTZ9LFwiREVTLUVERTMtQ0JDXCI6e3Byb2M6ZSxlcHJvYzpvLGtleWxlbjoyNCxpdmxlbjo4fSxcIkRFUy1DQkNcIjp7cHJvYzphLGVwcm9jOmYsa2V5bGVuOjgsaXZsZW46OH19O3ZhciBjPWZ1bmN0aW9uKHApe3JldHVybiBpW3BdW1wicHJvY1wiXX07dmFyIG09ZnVuY3Rpb24ocCl7dmFyIHI9Q3J5cHRvSlMubGliLldvcmRBcnJheS5yYW5kb20ocCk7dmFyIHE9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocik7cmV0dXJuIHF9O3ZhciBuPWZ1bmN0aW9uKHYpe3ZhciB3PXt9O3ZhciBxPXYubWF0Y2gobmV3IFJlZ0V4cChcIkRFSy1JbmZvOiAoW14sXSspLChbMC05QS1GYS1mXSspXCIsXCJtXCIpKTtpZihxKXt3LmNpcGhlcj1xWzFdO3cuaXZzYWx0PXFbMl19dmFyIHA9di5tYXRjaChuZXcgUmVnRXhwKFwiLS0tLS1CRUdJTiAoW0EtWl0rKSBQUklWQVRFIEtFWS0tLS0tXCIpKTtpZihwKXt3LnR5cGU9cFsxXX12YXIgdT0tMTt2YXIgeD0wO2lmKHYuaW5kZXhPZihcIlxcclxcblxcclxcblwiKSE9LTEpe3U9di5pbmRleE9mKFwiXFxyXFxuXFxyXFxuXCIpO3g9Mn1pZih2LmluZGV4T2YoXCJcXG5cXG5cIikhPS0xKXt1PXYuaW5kZXhPZihcIlxcblxcblwiKTt4PTF9dmFyIHQ9di5pbmRleE9mKFwiLS0tLS1FTkRcIik7aWYodSE9LTEmJnQhPS0xKXt2YXIgcj12LnN1YnN0cmluZyh1K3gqMix0LXgpO3I9ci5yZXBsYWNlKC9cXHMrL2csXCJcIik7dy5kYXRhPXJ9cmV0dXJuIHd9O3ZhciBqPWZ1bmN0aW9uKHEseSxwKXt2YXIgdj1wLnN1YnN0cmluZygwLDE2KTt2YXIgdD1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHYpO3ZhciByPUNyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKHkpO3ZhciB1PWlbcV1bXCJrZXlsZW5cIl0raVtxXVtcIml2bGVuXCJdO3ZhciB4PVwiXCI7dmFyIHc9bnVsbDtmb3IoOzspe3ZhciBzPUNyeXB0b0pTLmFsZ28uTUQ1LmNyZWF0ZSgpO2lmKHchPW51bGwpe3MudXBkYXRlKHcpfXMudXBkYXRlKHIpO3MudXBkYXRlKHQpO3c9cy5maW5hbGl6ZSgpO3g9eCtDcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeSh3KTtpZih4Lmxlbmd0aD49dSoyKXticmVha319dmFyIHo9e307ei5rZXloZXg9eC5zdWJzdHIoMCxpW3FdW1wia2V5bGVuXCJdKjIpO3ouaXZoZXg9eC5zdWJzdHIoaVtxXVtcImtleWxlblwiXSoyLGlbcV1bXCJpdmxlblwiXSoyKTtyZXR1cm4gen07dmFyIGI9ZnVuY3Rpb24ocCx2LHIsdyl7dmFyIHM9Q3J5cHRvSlMuZW5jLkJhc2U2NC5wYXJzZShwKTt2YXIgcT1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeShzKTt2YXIgdT1pW3ZdW1wicHJvY1wiXTt2YXIgdD11KHEscix3KTtyZXR1cm4gdH07dmFyIGg9ZnVuY3Rpb24ocCxzLHEsdSl7dmFyIHI9aVtzXVtcImVwcm9jXCJdO3ZhciB0PXIocCxxLHUpO3JldHVybiB0fTtyZXR1cm57dmVyc2lvbjpcIjEuMC4wXCIscGFyc2VQS0NTNVBFTTpmdW5jdGlvbihwKXtyZXR1cm4gbihwKX0sZ2V0S2V5QW5kVW51c2VkSXZCeVBhc3Njb2RlQW5kSXZzYWx0OmZ1bmN0aW9uKHEscCxyKXtyZXR1cm4gaihxLHAscil9LGRlY3J5cHRLZXlCNjQ6ZnVuY3Rpb24ocCxyLHEscyl7cmV0dXJuIGIocCxyLHEscyl9LGdldERlY3J5cHRlZEtleUhleDpmdW5jdGlvbih5LHgpe3ZhciBxPW4oeSk7dmFyIHQ9cS50eXBlO3ZhciByPXEuY2lwaGVyO3ZhciBwPXEuaXZzYWx0O3ZhciBzPXEuZGF0YTt2YXIgdz1qKHIseCxwKTt2YXIgdj13LmtleWhleDt2YXIgdT1iKHMscix2LHApO3JldHVybiB1fSxnZXRFbmNyeXB0ZWRQS0NTNVBFTUZyb21QcnZLZXlIZXg6ZnVuY3Rpb24oeCxzLEEsdCxyKXt2YXIgcD1cIlwiO2lmKHR5cGVvZiB0PT1cInVuZGVmaW5lZFwifHx0PT1udWxsKXt0PVwiQUVTLTI1Ni1DQkNcIn1pZih0eXBlb2YgaVt0XT09XCJ1bmRlZmluZWRcIil7dGhyb3dcIktFWVVUSUwgdW5zdXBwb3J0ZWQgYWxnb3JpdGhtOiBcIit0fWlmKHR5cGVvZiByPT1cInVuZGVmaW5lZFwifHxyPT1udWxsKXt2YXIgdj1pW3RdW1wiaXZsZW5cIl07dmFyIHU9bSh2KTtyPXUudG9VcHBlckNhc2UoKX12YXIgej1qKHQsQSxyKTt2YXIgeT16LmtleWhleDt2YXIgdz1oKHMsdCx5LHIpO3ZhciBxPXcucmVwbGFjZSgvKC57NjR9KS9nLFwiJDFcXHJcXG5cIik7dmFyIHA9XCItLS0tLUJFR0lOIFwiK3grXCIgUFJJVkFURSBLRVktLS0tLVxcclxcblwiO3ArPVwiUHJvYy1UeXBlOiA0LEVOQ1JZUFRFRFxcclxcblwiO3ArPVwiREVLLUluZm86IFwiK3QrXCIsXCIrcitcIlxcclxcblwiO3ArPVwiXFxyXFxuXCI7cCs9cTtwKz1cIlxcclxcbi0tLS0tRU5EIFwiK3grXCIgUFJJVkFURSBLRVktLS0tLVxcclxcblwiO3JldHVybiBwfSxwYXJzZUhleE9mRW5jcnlwdGVkUEtDUzg6ZnVuY3Rpb24oeSl7dmFyIEI9QVNOMUhFWDt2YXIgej1CLmdldENoaWxkSWR4O3ZhciB3PUIuZ2V0Vjt2YXIgdD17fTt2YXIgcj16KHksMCk7aWYoci5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwKS5pdGVtcyAhPSAyOiBcIityLmxlbmd0aH10LmNpcGhlcnRleHQ9dyh5LHJbMV0pO3ZhciBBPXooeSxyWzBdKTtpZihBLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMCkuaXRlbXMgIT0gMjogXCIrQS5sZW5ndGh9aWYodyh5LEFbMF0pIT1cIjJhODY0ODg2ZjcwZDAxMDUwZFwiKXt0aHJvd1widGhpcyBvbmx5IHN1cHBvcnRzIHBrY3M1UEJFUzJcIn12YXIgcD16KHksQVsxXSk7aWYoQS5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMSkuaXRlbXMgIT0gMjogXCIrcC5sZW5ndGh9dmFyIHE9eih5LHBbMV0pO2lmKHEubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdDogU0VRVUVOQ0UoMC4wLjEuMSkuaXRlbXMgIT0gMjogXCIrcS5sZW5ndGh9aWYodyh5LHFbMF0pIT1cIjJhODY0ODg2ZjcwZDAzMDdcIil7dGhyb3dcInRoaXMgb25seSBzdXBwb3J0cyBUcmlwbGVERVNcIn10LmVuY3J5cHRpb25TY2hlbWVBbGc9XCJUcmlwbGVERVNcIjt0LmVuY3J5cHRpb25TY2hlbWVJVj13KHkscVsxXSk7dmFyIHM9eih5LHBbMF0pO2lmKHMubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdDogU0VRVUVOQ0UoMC4wLjEuMCkuaXRlbXMgIT0gMjogXCIrcy5sZW5ndGh9aWYodyh5LHNbMF0pIT1cIjJhODY0ODg2ZjcwZDAxMDUwY1wiKXt0aHJvd1widGhpcyBvbmx5IHN1cHBvcnRzIHBrY3M1UEJLREYyXCJ9dmFyIHg9eih5LHNbMV0pO2lmKHgubGVuZ3RoPDIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMS4wLjEpLml0ZW1zIDwgMjogXCIreC5sZW5ndGh9dC5wYmtkZjJTYWx0PXcoeSx4WzBdKTt2YXIgdT13KHkseFsxXSk7dHJ5e3QucGJrZGYySXRlcj1wYXJzZUludCh1LDE2KX1jYXRjaCh2KXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdCBwYmtkZjJJdGVyOiBcIit1fXJldHVybiB0fSxnZXRQQktERjJLZXlIZXhGcm9tUGFyYW06ZnVuY3Rpb24odSxwKXt2YXIgdD1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHUucGJrZGYyU2FsdCk7dmFyIHE9dS5wYmtkZjJJdGVyO3ZhciBzPUNyeXB0b0pTLlBCS0RGMihwLHQse2tleVNpemU6MTkyLzMyLGl0ZXJhdGlvbnM6cX0pO3ZhciByPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHMpO3JldHVybiByfSxfZ2V0UGxhaW5QS0NTOEhleEZyb21FbmNyeXB0ZWRQS0NTOFBFTTpmdW5jdGlvbih4LHkpe3ZhciByPXBlbXRvaGV4KHgsXCJFTkNSWVBURUQgUFJJVkFURSBLRVlcIik7dmFyIHA9dGhpcy5wYXJzZUhleE9mRW5jcnlwdGVkUEtDUzgocik7dmFyIHU9S0VZVVRJTC5nZXRQQktERjJLZXlIZXhGcm9tUGFyYW0ocCx5KTt2YXIgdj17fTt2LmNpcGhlcnRleHQ9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShwLmNpcGhlcnRleHQpO3ZhciB0PUNyeXB0b0pTLmVuYy5IZXgucGFyc2UodSk7dmFyIHM9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShwLmVuY3J5cHRpb25TY2hlbWVJVik7dmFyIHc9Q3J5cHRvSlMuVHJpcGxlREVTLmRlY3J5cHQodix0LHtpdjpzfSk7dmFyIHE9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkodyk7cmV0dXJuIHF9LGdldEtleUZyb21FbmNyeXB0ZWRQS0NTOFBFTTpmdW5jdGlvbihzLHEpe3ZhciBwPXRoaXMuX2dldFBsYWluUEtDUzhIZXhGcm9tRW5jcnlwdGVkUEtDUzhQRU0ocyxxKTt2YXIgcj10aGlzLmdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOEhleChwKTtyZXR1cm4gcn0scGFyc2VQbGFpblByaXZhdGVQS0NTOEhleDpmdW5jdGlvbihzKXt2YXIgdj1BU04xSEVYO3ZhciB1PXYuZ2V0Q2hpbGRJZHg7dmFyIHQ9di5nZXRWO3ZhciBxPXt9O3EuYWxncGFyYW09bnVsbDtpZihzLnN1YnN0cigwLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgcGxhaW4gUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDEpXCJ9dmFyIHI9dShzLDApO2lmKHIubGVuZ3RoIT0zKXt0aHJvd1wibWFsZm9ybWVkIHBsYWluIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDAyKVwifWlmKHMuc3Vic3RyKHJbMV0sMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwMylcIn12YXIgcD11KHMsclsxXSk7aWYocC5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDQpXCJ9aWYocy5zdWJzdHIocFswXSwyKSE9XCIwNlwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDA1KVwifXEuYWxnb2lkPXQocyxwWzBdKTtpZihzLnN1YnN0cihwWzFdLDIpPT1cIjA2XCIpe3EuYWxncGFyYW09dChzLHBbMV0pfWlmKHMuc3Vic3RyKHJbMl0sMikhPVwiMDRcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwNilcIn1xLmtleWlkeD12LmdldFZpZHgocyxyWzJdKTtyZXR1cm4gcX0sZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4UEVNOmZ1bmN0aW9uKHEpe3ZhciBwPXBlbXRvaGV4KHEsXCJQUklWQVRFIEtFWVwiKTt2YXIgcj10aGlzLmdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOEhleChwKTtyZXR1cm4gcn0sZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4SGV4OmZ1bmN0aW9uKHApe3ZhciBxPXRoaXMucGFyc2VQbGFpblByaXZhdGVQS0NTOEhleChwKTt2YXIgcjtpZihxLmFsZ29pZD09XCIyYTg2NDg4NmY3MGQwMTAxMDFcIil7cj1uZXcgUlNBS2V5KCl9ZWxzZXtpZihxLmFsZ29pZD09XCIyYTg2NDhjZTM4MDQwMVwiKXtyPW5ldyBLSlVSLmNyeXB0by5EU0EoKX1lbHNle2lmKHEuYWxnb2lkPT1cIjJhODY0OGNlM2QwMjAxXCIpe3I9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKCl9ZWxzZXt0aHJvd1widW5zdXBwb3J0ZWQgcHJpdmF0ZSBrZXkgYWxnb3JpdGhtXCJ9fX1yLnJlYWRQS0NTOFBydktleUhleChwKTtyZXR1cm4gcn0sX2dldEtleUZyb21QdWJsaWNQS0NTOEhleDpmdW5jdGlvbihxKXt2YXIgcDt2YXIgcj1BU04xSEVYLmdldFZieUxpc3QocSwwLFswLDBdLFwiMDZcIik7aWYocj09PVwiMmE4NjQ4ODZmNzBkMDEwMTAxXCIpe3A9bmV3IFJTQUtleSgpfWVsc2V7aWYocj09PVwiMmE4NjQ4Y2UzODA0MDFcIil7cD1uZXcgS0pVUi5jcnlwdG8uRFNBKCl9ZWxzZXtpZihyPT09XCIyYTg2NDhjZTNkMDIwMVwiKXtwPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSgpfWVsc2V7dGhyb3dcInVuc3VwcG9ydGVkIFBLQ1MjOCBwdWJsaWMga2V5IGhleFwifX19cC5yZWFkUEtDUzhQdWJLZXlIZXgocSk7cmV0dXJuIHB9LHBhcnNlUHVibGljUmF3UlNBS2V5SGV4OmZ1bmN0aW9uKHIpe3ZhciB1PUFTTjFIRVg7dmFyIHQ9dS5nZXRDaGlsZElkeDt2YXIgcz11LmdldFY7dmFyIHA9e307aWYoci5zdWJzdHIoMCwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDEpXCJ9dmFyIHE9dChyLDApO2lmKHEubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDIpXCJ9aWYoci5zdWJzdHIocVswXSwyKSE9XCIwMlwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDMpXCJ9cC5uPXMocixxWzBdKTtpZihyLnN1YnN0cihxWzFdLDIpIT1cIjAyXCIpe3Rocm93XCJtYWxmb3JtZWQgUlNBIGtleShjb2RlOjAwNClcIn1wLmU9cyhyLHFbMV0pO3JldHVybiBwfSxwYXJzZVB1YmxpY1BLQ1M4SGV4OmZ1bmN0aW9uKHQpe3ZhciB2PUFTTjFIRVg7dmFyIHU9di5nZXRDaGlsZElkeDt2YXIgcz12LmdldFY7dmFyIHE9e307cS5hbGdwYXJhbT1udWxsO3ZhciByPXUodCwwKTtpZihyLmxlbmd0aCE9Mil7dGhyb3dcIm91dGVyIERFUlNlcXVlbmNlIHNoYWxsIGhhdmUgMiBlbGVtZW50czogXCIrci5sZW5ndGh9dmFyIHc9clswXTtpZih0LnN1YnN0cih3LDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwMSlcIn12YXIgcD11KHQsdyk7aWYocC5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwMilcIn1pZih0LnN1YnN0cihwWzBdLDIpIT1cIjA2XCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwMylcIn1xLmFsZ29pZD1zKHQscFswXSk7aWYodC5zdWJzdHIocFsxXSwyKT09XCIwNlwiKXtxLmFsZ3BhcmFtPXModCxwWzFdKX1lbHNle2lmKHQuc3Vic3RyKHBbMV0sMik9PVwiMzBcIil7cS5hbGdwYXJhbT17fTtxLmFsZ3BhcmFtLnA9di5nZXRWYnlMaXN0KHQscFsxXSxbMF0sXCIwMlwiKTtxLmFsZ3BhcmFtLnE9di5nZXRWYnlMaXN0KHQscFsxXSxbMV0sXCIwMlwiKTtxLmFsZ3BhcmFtLmc9di5nZXRWYnlMaXN0KHQscFsxXSxbMl0sXCIwMlwiKX19aWYodC5zdWJzdHIoclsxXSwyKSE9XCIwM1wiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHB1YmxpYyBrZXkoY29kZTowMDQpXCJ9cS5rZXk9cyh0LHJbMV0pLnN1YnN0cigyKTtyZXR1cm4gcX0sfX0oKTtLRVlVVElMLmdldEtleT1mdW5jdGlvbihsLGssbil7dmFyIEc9QVNOMUhFWCxMPUcuZ2V0Q2hpbGRJZHgsdj1HLmdldFYsZD1HLmdldFZieUxpc3QsYz1LSlVSLmNyeXB0byxpPWMuRUNEU0EsQz1jLkRTQSx3PVJTQUtleSxNPXBlbXRvaGV4LEY9S0VZVVRJTDtpZih0eXBlb2YgdyE9XCJ1bmRlZmluZWRcIiYmbCBpbnN0YW5jZW9mIHcpe3JldHVybiBsfWlmKHR5cGVvZiBpIT1cInVuZGVmaW5lZFwiJiZsIGluc3RhbmNlb2YgaSl7cmV0dXJuIGx9aWYodHlwZW9mIEMhPVwidW5kZWZpbmVkXCImJmwgaW5zdGFuY2VvZiBDKXtyZXR1cm4gbH1pZihsLmN1cnZlIT09dW5kZWZpbmVkJiZsLnh5IT09dW5kZWZpbmVkJiZsLmQ9PT11bmRlZmluZWQpe3JldHVybiBuZXcgaSh7cHViOmwueHksY3VydmU6bC5jdXJ2ZX0pfWlmKGwuY3VydmUhPT11bmRlZmluZWQmJmwuZCE9PXVuZGVmaW5lZCl7cmV0dXJuIG5ldyBpKHtwcnY6bC5kLGN1cnZlOmwuY3VydmV9KX1pZihsLmt0eT09PXVuZGVmaW5lZCYmbC5uIT09dW5kZWZpbmVkJiZsLmUhPT11bmRlZmluZWQmJmwuZD09PXVuZGVmaW5lZCl7dmFyIFA9bmV3IHcoKTtQLnNldFB1YmxpYyhsLm4sbC5lKTtyZXR1cm4gUH1pZihsLmt0eT09PXVuZGVmaW5lZCYmbC5uIT09dW5kZWZpbmVkJiZsLmUhPT11bmRlZmluZWQmJmwuZCE9PXVuZGVmaW5lZCYmbC5wIT09dW5kZWZpbmVkJiZsLnEhPT11bmRlZmluZWQmJmwuZHAhPT11bmRlZmluZWQmJmwuZHEhPT11bmRlZmluZWQmJmwuY28hPT11bmRlZmluZWQmJmwucWk9PT11bmRlZmluZWQpe3ZhciBQPW5ldyB3KCk7UC5zZXRQcml2YXRlRXgobC5uLGwuZSxsLmQsbC5wLGwucSxsLmRwLGwuZHEsbC5jbyk7cmV0dXJuIFB9aWYobC5rdHk9PT11bmRlZmluZWQmJmwubiE9PXVuZGVmaW5lZCYmbC5lIT09dW5kZWZpbmVkJiZsLmQhPT11bmRlZmluZWQmJmwucD09PXVuZGVmaW5lZCl7dmFyIFA9bmV3IHcoKTtQLnNldFByaXZhdGUobC5uLGwuZSxsLmQpO3JldHVybiBQfWlmKGwucCE9PXVuZGVmaW5lZCYmbC5xIT09dW5kZWZpbmVkJiZsLmchPT11bmRlZmluZWQmJmwueSE9PXVuZGVmaW5lZCYmbC54PT09dW5kZWZpbmVkKXt2YXIgUD1uZXcgQygpO1Auc2V0UHVibGljKGwucCxsLnEsbC5nLGwueSk7cmV0dXJuIFB9aWYobC5wIT09dW5kZWZpbmVkJiZsLnEhPT11bmRlZmluZWQmJmwuZyE9PXVuZGVmaW5lZCYmbC55IT09dW5kZWZpbmVkJiZsLnghPT11bmRlZmluZWQpe3ZhciBQPW5ldyBDKCk7UC5zZXRQcml2YXRlKGwucCxsLnEsbC5nLGwueSxsLngpO3JldHVybiBQfWlmKGwua3R5PT09XCJSU0FcIiYmbC5uIT09dW5kZWZpbmVkJiZsLmUhPT11bmRlZmluZWQmJmwuZD09PXVuZGVmaW5lZCl7dmFyIFA9bmV3IHcoKTtQLnNldFB1YmxpYyhiNjR1dG9oZXgobC5uKSxiNjR1dG9oZXgobC5lKSk7cmV0dXJuIFB9aWYobC5rdHk9PT1cIlJTQVwiJiZsLm4hPT11bmRlZmluZWQmJmwuZSE9PXVuZGVmaW5lZCYmbC5kIT09dW5kZWZpbmVkJiZsLnAhPT11bmRlZmluZWQmJmwucSE9PXVuZGVmaW5lZCYmbC5kcCE9PXVuZGVmaW5lZCYmbC5kcSE9PXVuZGVmaW5lZCYmbC5xaSE9PXVuZGVmaW5lZCl7dmFyIFA9bmV3IHcoKTtQLnNldFByaXZhdGVFeChiNjR1dG9oZXgobC5uKSxiNjR1dG9oZXgobC5lKSxiNjR1dG9oZXgobC5kKSxiNjR1dG9oZXgobC5wKSxiNjR1dG9oZXgobC5xKSxiNjR1dG9oZXgobC5kcCksYjY0dXRvaGV4KGwuZHEpLGI2NHV0b2hleChsLnFpKSk7cmV0dXJuIFB9aWYobC5rdHk9PT1cIlJTQVwiJiZsLm4hPT11bmRlZmluZWQmJmwuZSE9PXVuZGVmaW5lZCYmbC5kIT09dW5kZWZpbmVkKXt2YXIgUD1uZXcgdygpO1Auc2V0UHJpdmF0ZShiNjR1dG9oZXgobC5uKSxiNjR1dG9oZXgobC5lKSxiNjR1dG9oZXgobC5kKSk7cmV0dXJuIFB9aWYobC5rdHk9PT1cIkVDXCImJmwuY3J2IT09dW5kZWZpbmVkJiZsLnghPT11bmRlZmluZWQmJmwueSE9PXVuZGVmaW5lZCYmbC5kPT09dW5kZWZpbmVkKXt2YXIgaj1uZXcgaSh7Y3VydmU6bC5jcnZ9KTt2YXIgdD1qLmVjcGFyYW1zLmtleWxlbi80O3ZhciBCPShcIjAwMDAwMDAwMDBcIitiNjR1dG9oZXgobC54KSkuc2xpY2UoLXQpO3ZhciB6PShcIjAwMDAwMDAwMDBcIitiNjR1dG9oZXgobC55KSkuc2xpY2UoLXQpO3ZhciB1PVwiMDRcIitCK3o7ai5zZXRQdWJsaWNLZXlIZXgodSk7cmV0dXJuIGp9aWYobC5rdHk9PT1cIkVDXCImJmwuY3J2IT09dW5kZWZpbmVkJiZsLnghPT11bmRlZmluZWQmJmwueSE9PXVuZGVmaW5lZCYmbC5kIT09dW5kZWZpbmVkKXt2YXIgaj1uZXcgaSh7Y3VydmU6bC5jcnZ9KTt2YXIgdD1qLmVjcGFyYW1zLmtleWxlbi80O3ZhciBCPShcIjAwMDAwMDAwMDBcIitiNjR1dG9oZXgobC54KSkuc2xpY2UoLXQpO3ZhciB6PShcIjAwMDAwMDAwMDBcIitiNjR1dG9oZXgobC55KSkuc2xpY2UoLXQpO3ZhciB1PVwiMDRcIitCK3o7dmFyIGI9KFwiMDAwMDAwMDAwMFwiK2I2NHV0b2hleChsLmQpKS5zbGljZSgtdCk7ai5zZXRQdWJsaWNLZXlIZXgodSk7ai5zZXRQcml2YXRlS2V5SGV4KGIpO3JldHVybiBqfWlmKG49PT1cInBrY3M1cHJ2XCIpe3ZhciBKPWwsRz1BU04xSEVYLE4sUDtOPUwoSiwwKTtpZihOLmxlbmd0aD09PTkpe1A9bmV3IHcoKTtQLnJlYWRQS0NTNVBydktleUhleChKKX1lbHNle2lmKE4ubGVuZ3RoPT09Nil7UD1uZXcgQygpO1AucmVhZFBLQ1M1UHJ2S2V5SGV4KEopfWVsc2V7aWYoTi5sZW5ndGg+MiYmSi5zdWJzdHIoTlsxXSwyKT09PVwiMDRcIil7UD1uZXcgaSgpO1AucmVhZFBLQ1M1UHJ2S2V5SGV4KEopfWVsc2V7dGhyb3dcInVuc3VwcG9ydGVkIFBLQ1MjMS81IGhleGFkZWNpbWFsIGtleVwifX19cmV0dXJuIFB9aWYobj09PVwicGtjczhwcnZcIil7dmFyIFA9Ri5nZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhIZXgobCk7cmV0dXJuIFB9aWYobj09PVwicGtjczhwdWJcIil7cmV0dXJuIEYuX2dldEtleUZyb21QdWJsaWNQS0NTOEhleChsKX1pZihuPT09XCJ4NTA5cHViXCIpe3JldHVybiBYNTA5LmdldFB1YmxpY0tleUZyb21DZXJ0SGV4KGwpfWlmKGwuaW5kZXhPZihcIi1FTkQgQ0VSVElGSUNBVEUtXCIsMCkhPS0xfHxsLmluZGV4T2YoXCItRU5EIFg1MDkgQ0VSVElGSUNBVEUtXCIsMCkhPS0xfHxsLmluZGV4T2YoXCItRU5EIFRSVVNURUQgQ0VSVElGSUNBVEUtXCIsMCkhPS0xKXtyZXR1cm4gWDUwOS5nZXRQdWJsaWNLZXlGcm9tQ2VydFBFTShsKX1pZihsLmluZGV4T2YoXCItRU5EIFBVQkxJQyBLRVktXCIpIT0tMSl7dmFyIE89cGVtdG9oZXgobCxcIlBVQkxJQyBLRVlcIik7cmV0dXJuIEYuX2dldEtleUZyb21QdWJsaWNQS0NTOEhleChPKX1pZihsLmluZGV4T2YoXCItRU5EIFJTQSBQUklWQVRFIEtFWS1cIikhPS0xJiZsLmluZGV4T2YoXCI0LEVOQ1JZUFRFRFwiKT09LTEpe3ZhciBtPU0obCxcIlJTQSBQUklWQVRFIEtFWVwiKTtyZXR1cm4gRi5nZXRLZXkobSxudWxsLFwicGtjczVwcnZcIil9aWYobC5pbmRleE9mKFwiLUVORCBEU0EgUFJJVkFURSBLRVktXCIpIT0tMSYmbC5pbmRleE9mKFwiNCxFTkNSWVBURURcIik9PS0xKXt2YXIgST1NKGwsXCJEU0EgUFJJVkFURSBLRVlcIik7dmFyIEU9ZChJLDAsWzFdLFwiMDJcIik7dmFyIEQ9ZChJLDAsWzJdLFwiMDJcIik7dmFyIEs9ZChJLDAsWzNdLFwiMDJcIik7dmFyIHI9ZChJLDAsWzRdLFwiMDJcIik7dmFyIHM9ZChJLDAsWzVdLFwiMDJcIik7dmFyIFA9bmV3IEMoKTtQLnNldFByaXZhdGUobmV3IEJpZ0ludGVnZXIoRSwxNiksbmV3IEJpZ0ludGVnZXIoRCwxNiksbmV3IEJpZ0ludGVnZXIoSywxNiksbmV3IEJpZ0ludGVnZXIociwxNiksbmV3IEJpZ0ludGVnZXIocywxNikpO3JldHVybiBQfWlmKGwuaW5kZXhPZihcIi1FTkQgRUMgUFJJVkFURSBLRVktXCIpIT0tMSYmbC5pbmRleE9mKFwiNCxFTkNSWVBURURcIik9PS0xKXt2YXIgbT1NKGwsXCJFQyBQUklWQVRFIEtFWVwiKTtyZXR1cm4gRi5nZXRLZXkobSxudWxsLFwicGtjczVwcnZcIil9aWYobC5pbmRleE9mKFwiLUVORCBQUklWQVRFIEtFWS1cIikhPS0xKXtyZXR1cm4gRi5nZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhQRU0obCl9aWYobC5pbmRleE9mKFwiLUVORCBSU0EgUFJJVkFURSBLRVktXCIpIT0tMSYmbC5pbmRleE9mKFwiNCxFTkNSWVBURURcIikhPS0xKXt2YXIgbz1GLmdldERlY3J5cHRlZEtleUhleChsLGspO3ZhciBIPW5ldyBSU0FLZXkoKTtILnJlYWRQS0NTNVBydktleUhleChvKTtyZXR1cm4gSH1pZihsLmluZGV4T2YoXCItRU5EIEVDIFBSSVZBVEUgS0VZLVwiKSE9LTEmJmwuaW5kZXhPZihcIjQsRU5DUllQVEVEXCIpIT0tMSl7dmFyIEk9Ri5nZXREZWNyeXB0ZWRLZXlIZXgobCxrKTt2YXIgUD1kKEksMCxbMV0sXCIwNFwiKTt2YXIgZj1kKEksMCxbMiwwXSxcIjA2XCIpO3ZhciBBPWQoSSwwLFszLDBdLFwiMDNcIikuc3Vic3RyKDIpO3ZhciBlPVwiXCI7aWYoS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW2ZdIT09dW5kZWZpbmVkKXtlPUtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtmXX1lbHNle3Rocm93XCJ1bmRlZmluZWQgT0lEKGhleCkgaW4gS0pVUi5jcnlwdG8uT0lEOiBcIitmfXZhciBqPW5ldyBpKHtjdXJ2ZTplfSk7ai5zZXRQdWJsaWNLZXlIZXgoQSk7ai5zZXRQcml2YXRlS2V5SGV4KFApO2ouaXNQdWJsaWM9ZmFsc2U7cmV0dXJuIGp9aWYobC5pbmRleE9mKFwiLUVORCBEU0EgUFJJVkFURSBLRVktXCIpIT0tMSYmbC5pbmRleE9mKFwiNCxFTkNSWVBURURcIikhPS0xKXt2YXIgST1GLmdldERlY3J5cHRlZEtleUhleChsLGspO3ZhciBFPWQoSSwwLFsxXSxcIjAyXCIpO3ZhciBEPWQoSSwwLFsyXSxcIjAyXCIpO3ZhciBLPWQoSSwwLFszXSxcIjAyXCIpO3ZhciByPWQoSSwwLFs0XSxcIjAyXCIpO3ZhciBzPWQoSSwwLFs1XSxcIjAyXCIpO3ZhciBQPW5ldyBDKCk7UC5zZXRQcml2YXRlKG5ldyBCaWdJbnRlZ2VyKEUsMTYpLG5ldyBCaWdJbnRlZ2VyKEQsMTYpLG5ldyBCaWdJbnRlZ2VyKEssMTYpLG5ldyBCaWdJbnRlZ2VyKHIsMTYpLG5ldyBCaWdJbnRlZ2VyKHMsMTYpKTtyZXR1cm4gUH1pZihsLmluZGV4T2YoXCItRU5EIEVOQ1JZUFRFRCBQUklWQVRFIEtFWS1cIikhPS0xKXtyZXR1cm4gRi5nZXRLZXlGcm9tRW5jcnlwdGVkUEtDUzhQRU0obCxrKX10aHJvdyBuZXcgRXJyb3IoXCJub3Qgc3VwcG9ydGVkIGFyZ3VtZW50XCIpfTtLRVlVVElMLmdlbmVyYXRlS2V5cGFpcj1mdW5jdGlvbihhLGMpe2lmKGE9PVwiUlNBXCIpe3ZhciBiPWM7dmFyIGg9bmV3IFJTQUtleSgpO2guZ2VuZXJhdGUoYixcIjEwMDAxXCIpO2guaXNQcml2YXRlPXRydWU7aC5pc1B1YmxpYz10cnVlO3ZhciBmPW5ldyBSU0FLZXkoKTt2YXIgZT1oLm4udG9TdHJpbmcoMTYpO3ZhciBpPWguZS50b1N0cmluZygxNik7Zi5zZXRQdWJsaWMoZSxpKTtmLmlzUHJpdmF0ZT1mYWxzZTtmLmlzUHVibGljPXRydWU7dmFyIGs9e307ay5wcnZLZXlPYmo9aDtrLnB1YktleU9iaj1mO3JldHVybiBrfWVsc2V7aWYoYT09XCJFQ1wiKXt2YXIgZD1jO3ZhciBnPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6ZH0pO3ZhciBqPWcuZ2VuZXJhdGVLZXlQYWlySGV4KCk7dmFyIGg9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTpkfSk7aC5zZXRQdWJsaWNLZXlIZXgoai5lY3B1YmhleCk7aC5zZXRQcml2YXRlS2V5SGV4KGouZWNwcnZoZXgpO2guaXNQcml2YXRlPXRydWU7aC5pc1B1YmxpYz1mYWxzZTt2YXIgZj1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOmR9KTtmLnNldFB1YmxpY0tleUhleChqLmVjcHViaGV4KTtmLmlzUHJpdmF0ZT1mYWxzZTtmLmlzUHVibGljPXRydWU7dmFyIGs9e307ay5wcnZLZXlPYmo9aDtrLnB1YktleU9iaj1mO3JldHVybiBrfWVsc2V7dGhyb3dcInVua25vd24gYWxnb3JpdGhtOiBcIithfX19O0tFWVVUSUwuZ2V0UEVNPWZ1bmN0aW9uKGIsRCx5LG0scSxqKXt2YXIgRj1LSlVSLGs9Ri5hc24xLHo9ay5ERVJPYmplY3RJZGVudGlmaWVyLGY9ay5ERVJJbnRlZ2VyLGw9ay5BU04xVXRpbC5uZXdPYmplY3QsYT1rLng1MDksQz1hLlN1YmplY3RQdWJsaWNLZXlJbmZvLGU9Ri5jcnlwdG8sdT1lLkRTQSxyPWUuRUNEU0Esbj1SU0FLZXk7ZnVuY3Rpb24gQShzKXt2YXIgRz1sKHtzZXE6W3tcImludFwiOjB9LHtcImludFwiOntiaWdpbnQ6cy5ufX0se1wiaW50XCI6cy5lfSx7XCJpbnRcIjp7YmlnaW50OnMuZH19LHtcImludFwiOntiaWdpbnQ6cy5wfX0se1wiaW50XCI6e2JpZ2ludDpzLnF9fSx7XCJpbnRcIjp7YmlnaW50OnMuZG1wMX19LHtcImludFwiOntiaWdpbnQ6cy5kbXExfX0se1wiaW50XCI6e2JpZ2ludDpzLmNvZWZmfX1dfSk7cmV0dXJuIEd9ZnVuY3Rpb24gQihHKXt2YXIgcz1sKHtzZXE6W3tcImludFwiOjF9LHtvY3RzdHI6e2hleDpHLnBydktleUhleH19LHt0YWc6W1wiYTBcIix0cnVlLHtvaWQ6e25hbWU6Ry5jdXJ2ZU5hbWV9fV19LHt0YWc6W1wiYTFcIix0cnVlLHtiaXRzdHI6e2hleDpcIjAwXCIrRy5wdWJLZXlIZXh9fV19XX0pO3JldHVybiBzfWZ1bmN0aW9uIHgocyl7dmFyIEc9bCh7c2VxOlt7XCJpbnRcIjowfSx7XCJpbnRcIjp7YmlnaW50OnMucH19LHtcImludFwiOntiaWdpbnQ6cy5xfX0se1wiaW50XCI6e2JpZ2ludDpzLmd9fSx7XCJpbnRcIjp7YmlnaW50OnMueX19LHtcImludFwiOntiaWdpbnQ6cy54fX1dfSk7cmV0dXJuIEd9aWYoKChuIT09dW5kZWZpbmVkJiZiIGluc3RhbmNlb2Ygbil8fCh1IT09dW5kZWZpbmVkJiZiIGluc3RhbmNlb2YgdSl8fChyIT09dW5kZWZpbmVkJiZiIGluc3RhbmNlb2YgcikpJiZiLmlzUHVibGljPT10cnVlJiYoRD09PXVuZGVmaW5lZHx8RD09XCJQS0NTOFBVQlwiKSl7dmFyIEU9bmV3IEMoYik7dmFyIHc9RS5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIGhleHRvcGVtKHcsXCJQVUJMSUMgS0VZXCIpfWlmKEQ9PVwiUEtDUzFQUlZcIiYmbiE9PXVuZGVmaW5lZCYmYiBpbnN0YW5jZW9mIG4mJih5PT09dW5kZWZpbmVkfHx5PT1udWxsKSYmYi5pc1ByaXZhdGU9PXRydWUpe3ZhciBFPUEoYik7dmFyIHc9RS5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIGhleHRvcGVtKHcsXCJSU0EgUFJJVkFURSBLRVlcIil9aWYoRD09XCJQS0NTMVBSVlwiJiZyIT09dW5kZWZpbmVkJiZiIGluc3RhbmNlb2YgciYmKHk9PT11bmRlZmluZWR8fHk9PW51bGwpJiZiLmlzUHJpdmF0ZT09dHJ1ZSl7dmFyIGk9bmV3IHooe25hbWU6Yi5jdXJ2ZU5hbWV9KTt2YXIgdj1pLmdldEVuY29kZWRIZXgoKTt2YXIgaD1CKGIpO3ZhciB0PWguZ2V0RW5jb2RlZEhleCgpO3ZhciBwPVwiXCI7cCs9aGV4dG9wZW0odixcIkVDIFBBUkFNRVRFUlNcIik7cCs9aGV4dG9wZW0odCxcIkVDIFBSSVZBVEUgS0VZXCIpO3JldHVybiBwfWlmKEQ9PVwiUEtDUzFQUlZcIiYmdSE9PXVuZGVmaW5lZCYmYiBpbnN0YW5jZW9mIHUmJih5PT09dW5kZWZpbmVkfHx5PT1udWxsKSYmYi5pc1ByaXZhdGU9PXRydWUpe3ZhciBFPXgoYik7dmFyIHc9RS5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIGhleHRvcGVtKHcsXCJEU0EgUFJJVkFURSBLRVlcIil9aWYoRD09XCJQS0NTNVBSVlwiJiZuIT09dW5kZWZpbmVkJiZiIGluc3RhbmNlb2YgbiYmKHkhPT11bmRlZmluZWQmJnkhPW51bGwpJiZiLmlzUHJpdmF0ZT09dHJ1ZSl7dmFyIEU9QShiKTt2YXIgdz1FLmdldEVuY29kZWRIZXgoKTtpZihtPT09dW5kZWZpbmVkKXttPVwiREVTLUVERTMtQ0JDXCJ9cmV0dXJuIHRoaXMuZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUHJ2S2V5SGV4KFwiUlNBXCIsdyx5LG0sail9aWYoRD09XCJQS0NTNVBSVlwiJiZyIT09dW5kZWZpbmVkJiZiIGluc3RhbmNlb2YgciYmKHkhPT11bmRlZmluZWQmJnkhPW51bGwpJiZiLmlzUHJpdmF0ZT09dHJ1ZSl7dmFyIEU9QihiKTt2YXIgdz1FLmdldEVuY29kZWRIZXgoKTtpZihtPT09dW5kZWZpbmVkKXttPVwiREVTLUVERTMtQ0JDXCJ9cmV0dXJuIHRoaXMuZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUHJ2S2V5SGV4KFwiRUNcIix3LHksbSxqKX1pZihEPT1cIlBLQ1M1UFJWXCImJnUhPT11bmRlZmluZWQmJmIgaW5zdGFuY2VvZiB1JiYoeSE9PXVuZGVmaW5lZCYmeSE9bnVsbCkmJmIuaXNQcml2YXRlPT10cnVlKXt2YXIgRT14KGIpO3ZhciB3PUUuZ2V0RW5jb2RlZEhleCgpO2lmKG09PT11bmRlZmluZWQpe209XCJERVMtRURFMy1DQkNcIn1yZXR1cm4gdGhpcy5nZXRFbmNyeXB0ZWRQS0NTNVBFTUZyb21QcnZLZXlIZXgoXCJEU0FcIix3LHksbSxqKX12YXIgbz1mdW5jdGlvbihHLHMpe3ZhciBJPWMoRyxzKTt2YXIgSD1uZXcgbCh7c2VxOlt7c2VxOlt7b2lkOntuYW1lOlwicGtjczVQQkVTMlwifX0se3NlcTpbe3NlcTpbe29pZDp7bmFtZTpcInBrY3M1UEJLREYyXCJ9fSx7c2VxOlt7b2N0c3RyOntoZXg6SS5wYmtkZjJTYWx0fX0se1wiaW50XCI6SS5wYmtkZjJJdGVyfV19XX0se3NlcTpbe29pZDp7bmFtZTpcImRlcy1FREUzLUNCQ1wifX0se29jdHN0cjp7aGV4OkkuZW5jcnlwdGlvblNjaGVtZUlWfX1dfV19XX0se29jdHN0cjp7aGV4OkkuY2lwaGVydGV4dH19XX0pO3JldHVybiBILmdldEVuY29kZWRIZXgoKX07dmFyIGM9ZnVuY3Rpb24oTixPKXt2YXIgSD0xMDA7dmFyIE09Q3J5cHRvSlMubGliLldvcmRBcnJheS5yYW5kb20oOCk7dmFyIEw9XCJERVMtRURFMy1DQkNcIjt2YXIgcz1DcnlwdG9KUy5saWIuV29yZEFycmF5LnJhbmRvbSg4KTt2YXIgST1DcnlwdG9KUy5QQktERjIoTyxNLHtrZXlTaXplOjE5Mi8zMixpdGVyYXRpb25zOkh9KTt2YXIgSj1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKE4pO3ZhciBLPUNyeXB0b0pTLlRyaXBsZURFUy5lbmNyeXB0KEosSSx7aXY6c30pK1wiXCI7dmFyIEc9e307Ry5jaXBoZXJ0ZXh0PUs7Ry5wYmtkZjJTYWx0PUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KE0pO0cucGJrZGYySXRlcj1IO0cuZW5jcnlwdGlvblNjaGVtZUFsZz1MO0cuZW5jcnlwdGlvblNjaGVtZUlWPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHMpO3JldHVybiBHfTtpZihEPT1cIlBLQ1M4UFJWXCImJm4hPXVuZGVmaW5lZCYmYiBpbnN0YW5jZW9mIG4mJmIuaXNQcml2YXRlPT10cnVlKXt2YXIgZz1BKGIpO3ZhciBkPWcuZ2V0RW5jb2RlZEhleCgpO3ZhciBFPWwoe3NlcTpbe1wiaW50XCI6MH0se3NlcTpbe29pZDp7bmFtZTpcInJzYUVuY3J5cHRpb25cIn19LHtcIm51bGxcIjp0cnVlfV19LHtvY3RzdHI6e2hleDpkfX1dfSk7dmFyIHc9RS5nZXRFbmNvZGVkSGV4KCk7aWYoeT09PXVuZGVmaW5lZHx8eT09bnVsbCl7cmV0dXJuIGhleHRvcGVtKHcsXCJQUklWQVRFIEtFWVwiKX1lbHNle3ZhciB0PW8odyx5KTtyZXR1cm4gaGV4dG9wZW0odCxcIkVOQ1JZUFRFRCBQUklWQVRFIEtFWVwiKX19aWYoRD09XCJQS0NTOFBSVlwiJiZyIT09dW5kZWZpbmVkJiZiIGluc3RhbmNlb2YgciYmYi5pc1ByaXZhdGU9PXRydWUpe3ZhciBnPW5ldyBsKHtzZXE6W3tcImludFwiOjF9LHtvY3RzdHI6e2hleDpiLnBydktleUhleH19LHt0YWc6W1wiYTFcIix0cnVlLHtiaXRzdHI6e2hleDpcIjAwXCIrYi5wdWJLZXlIZXh9fV19XX0pO3ZhciBkPWcuZ2V0RW5jb2RlZEhleCgpO3ZhciBFPWwoe3NlcTpbe1wiaW50XCI6MH0se3NlcTpbe29pZDp7bmFtZTpcImVjUHVibGljS2V5XCJ9fSx7b2lkOntuYW1lOmIuY3VydmVOYW1lfX1dfSx7b2N0c3RyOntoZXg6ZH19XX0pO3ZhciB3PUUuZ2V0RW5jb2RlZEhleCgpO2lmKHk9PT11bmRlZmluZWR8fHk9PW51bGwpe3JldHVybiBoZXh0b3BlbSh3LFwiUFJJVkFURSBLRVlcIil9ZWxzZXt2YXIgdD1vKHcseSk7cmV0dXJuIGhleHRvcGVtKHQsXCJFTkNSWVBURUQgUFJJVkFURSBLRVlcIil9fWlmKEQ9PVwiUEtDUzhQUlZcIiYmdSE9PXVuZGVmaW5lZCYmYiBpbnN0YW5jZW9mIHUmJmIuaXNQcml2YXRlPT10cnVlKXt2YXIgZz1uZXcgZih7YmlnaW50OmIueH0pO3ZhciBkPWcuZ2V0RW5jb2RlZEhleCgpO3ZhciBFPWwoe3NlcTpbe1wiaW50XCI6MH0se3NlcTpbe29pZDp7bmFtZTpcImRzYVwifX0se3NlcTpbe1wiaW50XCI6e2JpZ2ludDpiLnB9fSx7XCJpbnRcIjp7YmlnaW50OmIucX19LHtcImludFwiOntiaWdpbnQ6Yi5nfX1dfV19LHtvY3RzdHI6e2hleDpkfX1dfSk7dmFyIHc9RS5nZXRFbmNvZGVkSGV4KCk7aWYoeT09PXVuZGVmaW5lZHx8eT09bnVsbCl7cmV0dXJuIGhleHRvcGVtKHcsXCJQUklWQVRFIEtFWVwiKX1lbHNle3ZhciB0PW8odyx5KTtyZXR1cm4gaGV4dG9wZW0odCxcIkVOQ1JZUFRFRCBQUklWQVRFIEtFWVwiKX19dGhyb3cgbmV3IEVycm9yKFwidW5zdXBwb3J0ZWQgb2JqZWN0IG5vciBmb3JtYXRcIil9O0tFWVVUSUwuZ2V0S2V5RnJvbUNTUlBFTT1mdW5jdGlvbihiKXt2YXIgYT1wZW10b2hleChiLFwiQ0VSVElGSUNBVEUgUkVRVUVTVFwiKTt2YXIgYz1LRVlVVElMLmdldEtleUZyb21DU1JIZXgoYSk7cmV0dXJuIGN9O0tFWVVUSUwuZ2V0S2V5RnJvbUNTUkhleD1mdW5jdGlvbihhKXt2YXIgYz1LRVlVVElMLnBhcnNlQ1NSSGV4KGEpO3ZhciBiPUtFWVVUSUwuZ2V0S2V5KGMucDhwdWJrZXloZXgsbnVsbCxcInBrY3M4cHViXCIpO3JldHVybiBifTtLRVlVVElMLnBhcnNlQ1NSSGV4PWZ1bmN0aW9uKGQpe3ZhciBpPUFTTjFIRVg7dmFyIGY9aS5nZXRDaGlsZElkeDt2YXIgYz1pLmdldFRMVjt2YXIgYj17fTt2YXIgZz1kO2lmKGcuc3Vic3RyKDAsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBDU1IoY29kZTowMDEpXCJ9dmFyIGU9ZihnLDApO2lmKGUubGVuZ3RoPDEpe3Rocm93XCJtYWxmb3JtZWQgQ1NSKGNvZGU6MDAyKVwifWlmKGcuc3Vic3RyKGVbMF0sMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBDU1IoY29kZTowMDMpXCJ9dmFyIGE9ZihnLGVbMF0pO2lmKGEubGVuZ3RoPDMpe3Rocm93XCJtYWxmb3JtZWQgQ1NSKGNvZGU6MDA0KVwifWIucDhwdWJrZXloZXg9YyhnLGFbMl0pO3JldHVybiBifTtLRVlVVElMLmdldEtleUlEPWZ1bmN0aW9uKGYpe3ZhciBjPUtFWVVUSUw7dmFyIGU9QVNOMUhFWDtpZih0eXBlb2YgZj09PVwic3RyaW5nXCImJmYuaW5kZXhPZihcIkJFR0lOIFwiKSE9LTEpe2Y9Yy5nZXRLZXkoZil9dmFyIGQ9cGVtdG9oZXgoYy5nZXRQRU0oZikpO3ZhciBiPWUuZ2V0SWR4YnlMaXN0KGQsMCxbMV0pO3ZhciBhPWUuZ2V0VihkLGIpLnN1YnN0cmluZygyKTtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGEsXCJzaGExXCIpfTtLRVlVVElMLmdldEpXS0Zyb21LZXk9ZnVuY3Rpb24oZCl7dmFyIGI9e307aWYoZCBpbnN0YW5jZW9mIFJTQUtleSYmZC5pc1ByaXZhdGUpe2Iua3R5PVwiUlNBXCI7Yi5uPWhleHRvYjY0dShkLm4udG9TdHJpbmcoMTYpKTtiLmU9aGV4dG9iNjR1KGQuZS50b1N0cmluZygxNikpO2IuZD1oZXh0b2I2NHUoZC5kLnRvU3RyaW5nKDE2KSk7Yi5wPWhleHRvYjY0dShkLnAudG9TdHJpbmcoMTYpKTtiLnE9aGV4dG9iNjR1KGQucS50b1N0cmluZygxNikpO2IuZHA9aGV4dG9iNjR1KGQuZG1wMS50b1N0cmluZygxNikpO2IuZHE9aGV4dG9iNjR1KGQuZG1xMS50b1N0cmluZygxNikpO2IucWk9aGV4dG9iNjR1KGQuY29lZmYudG9TdHJpbmcoMTYpKTtyZXR1cm4gYn1lbHNle2lmKGQgaW5zdGFuY2VvZiBSU0FLZXkmJmQuaXNQdWJsaWMpe2Iua3R5PVwiUlNBXCI7Yi5uPWhleHRvYjY0dShkLm4udG9TdHJpbmcoMTYpKTtiLmU9aGV4dG9iNjR1KGQuZS50b1N0cmluZygxNikpO3JldHVybiBifWVsc2V7aWYoZCBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBJiZkLmlzUHJpdmF0ZSl7dmFyIGE9ZC5nZXRTaG9ydE5JU1RQQ3VydmVOYW1lKCk7aWYoYSE9PVwiUC0yNTZcIiYmYSE9PVwiUC0zODRcIil7dGhyb3dcInVuc3VwcG9ydGVkIGN1cnZlIG5hbWUgZm9yIEpXVDogXCIrYX12YXIgYz1kLmdldFB1YmxpY0tleVhZSGV4KCk7Yi5rdHk9XCJFQ1wiO2IuY3J2PWE7Yi54PWhleHRvYjY0dShjLngpO2IueT1oZXh0b2I2NHUoYy55KTtiLmQ9aGV4dG9iNjR1KGQucHJ2S2V5SGV4KTtyZXR1cm4gYn1lbHNle2lmKGQgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSYmZC5pc1B1YmxpYyl7dmFyIGE9ZC5nZXRTaG9ydE5JU1RQQ3VydmVOYW1lKCk7aWYoYSE9PVwiUC0yNTZcIiYmYSE9PVwiUC0zODRcIil7dGhyb3dcInVuc3VwcG9ydGVkIGN1cnZlIG5hbWUgZm9yIEpXVDogXCIrYX12YXIgYz1kLmdldFB1YmxpY0tleVhZSGV4KCk7Yi5rdHk9XCJFQ1wiO2IuY3J2PWE7Yi54PWhleHRvYjY0dShjLngpO2IueT1oZXh0b2I2NHUoYy55KTtyZXR1cm4gYn19fX10aHJvd1wibm90IHN1cHBvcnRlZCBrZXkgb2JqZWN0XCJ9O1xuUlNBS2V5LmdldFBvc0FycmF5T2ZDaGlsZHJlbkZyb21IZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIEFTTjFIRVguZ2V0Q2hpbGRJZHgoYSwwKX07UlNBS2V5LmdldEhleFZhbHVlQXJyYXlPZkNoaWxkcmVuRnJvbUhleD1mdW5jdGlvbihmKXt2YXIgbj1BU04xSEVYO3ZhciBpPW4uZ2V0Vjt2YXIgaz1SU0FLZXkuZ2V0UG9zQXJyYXlPZkNoaWxkcmVuRnJvbUhleChmKTt2YXIgZT1pKGYsa1swXSk7dmFyIGo9aShmLGtbMV0pO3ZhciBiPWkoZixrWzJdKTt2YXIgYz1pKGYsa1szXSk7dmFyIGg9aShmLGtbNF0pO3ZhciBnPWkoZixrWzVdKTt2YXIgbT1pKGYsa1s2XSk7dmFyIGw9aShmLGtbN10pO3ZhciBkPWkoZixrWzhdKTt2YXIgaz1uZXcgQXJyYXkoKTtrLnB1c2goZSxqLGIsYyxoLGcsbSxsLGQpO3JldHVybiBrfTtSU0FLZXkucHJvdG90eXBlLnJlYWRQcml2YXRlS2V5RnJvbVBFTVN0cmluZz1mdW5jdGlvbihkKXt2YXIgYz1wZW10b2hleChkKTt2YXIgYj1SU0FLZXkuZ2V0SGV4VmFsdWVBcnJheU9mQ2hpbGRyZW5Gcm9tSGV4KGMpO3RoaXMuc2V0UHJpdmF0ZUV4KGJbMV0sYlsyXSxiWzNdLGJbNF0sYls1XSxiWzZdLGJbN10sYls4XSl9O1JTQUtleS5wcm90b3R5cGUucmVhZFBLQ1M1UHJ2S2V5SGV4PWZ1bmN0aW9uKGMpe3ZhciBiPVJTQUtleS5nZXRIZXhWYWx1ZUFycmF5T2ZDaGlsZHJlbkZyb21IZXgoYyk7dGhpcy5zZXRQcml2YXRlRXgoYlsxXSxiWzJdLGJbM10sYls0XSxiWzVdLGJbNl0sYls3XSxiWzhdKX07UlNBS2V5LnByb3RvdHlwZS5yZWFkUEtDUzhQcnZLZXlIZXg9ZnVuY3Rpb24oZSl7dmFyIGMsaSxrLGIsYSxmLGQsajt2YXIgbT1BU04xSEVYO3ZhciBsPW0uZ2V0VmJ5TGlzdEV4O2lmKG0uaXNBU04xSEVYKGUpPT09ZmFsc2Upe3Rocm93IG5ldyBFcnJvcihcIm5vdCBBU04uMSBoZXggc3RyaW5nXCIpfXRyeXtjPWwoZSwwLFsyLDAsMV0sXCIwMlwiKTtpPWwoZSwwLFsyLDAsMl0sXCIwMlwiKTtrPWwoZSwwLFsyLDAsM10sXCIwMlwiKTtiPWwoZSwwLFsyLDAsNF0sXCIwMlwiKTthPWwoZSwwLFsyLDAsNV0sXCIwMlwiKTtmPWwoZSwwLFsyLDAsNl0sXCIwMlwiKTtkPWwoZSwwLFsyLDAsN10sXCIwMlwiKTtqPWwoZSwwLFsyLDAsOF0sXCIwMlwiKX1jYXRjaChnKXt0aHJvdyBuZXcgRXJyb3IoXCJtYWxmb3JtZWQgUEtDUyM4IHBsYWluIFJTQSBwcml2YXRlIGtleVwiKX10aGlzLnNldFByaXZhdGVFeChjLGksayxiLGEsZixkLGopfTtSU0FLZXkucHJvdG90eXBlLnJlYWRQS0NTNVB1YktleUhleD1mdW5jdGlvbihjKXt2YXIgZT1BU04xSEVYO3ZhciBiPWUuZ2V0VjtpZihlLmlzQVNOMUhFWChjKT09PWZhbHNlKXt0aHJvdyBuZXcgRXJyb3IoXCJrZXlIZXggaXMgbm90IEFTTi4xIGhleCBzdHJpbmdcIil9dmFyIGE9ZS5nZXRDaGlsZElkeChjLDApO2lmKGEubGVuZ3RoIT09Mnx8Yy5zdWJzdHIoYVswXSwyKSE9PVwiMDJcInx8Yy5zdWJzdHIoYVsxXSwyKSE9PVwiMDJcIil7dGhyb3cgbmV3IEVycm9yKFwid3JvbmcgaGV4IGZvciBQS0NTIzUgcHVibGljIGtleVwiKX12YXIgZj1iKGMsYVswXSk7dmFyIGQ9YihjLGFbMV0pO3RoaXMuc2V0UHVibGljKGYsZCl9O1JTQUtleS5wcm90b3R5cGUucmVhZFBLQ1M4UHViS2V5SGV4PWZ1bmN0aW9uKGIpe3ZhciBjPUFTTjFIRVg7aWYoYy5pc0FTTjFIRVgoYik9PT1mYWxzZSl7dGhyb3cgbmV3IEVycm9yKFwibm90IEFTTi4xIGhleCBzdHJpbmdcIil9aWYoYy5nZXRUTFZieUxpc3RFeChiLDAsWzAsMF0pIT09XCIwNjA5MmE4NjQ4ODZmNzBkMDEwMTAxXCIpe3Rocm93IG5ldyBFcnJvcihcIm5vdCBQS0NTOCBSU0EgcHVibGljIGtleVwiKX12YXIgYT1jLmdldFRMVmJ5TGlzdEV4KGIsMCxbMSwwXSk7dGhpcy5yZWFkUEtDUzVQdWJLZXlIZXgoYSl9O1JTQUtleS5wcm90b3R5cGUucmVhZENlcnRQdWJLZXlIZXg9ZnVuY3Rpb24oYixkKXt2YXIgYSxjO2E9bmV3IFg1MDkoKTthLnJlYWRDZXJ0SGV4KGIpO2M9YS5nZXRQdWJsaWNLZXlIZXgoKTt0aGlzLnJlYWRQS0NTOFB1YktleUhleChjKX07XG52YXIgX1JFX0hFWERFQ09OTFk9bmV3IFJlZ0V4cChcIlteMC05YS1mXVwiLFwiZ2lcIik7ZnVuY3Rpb24gX3JzYXNpZ25fZ2V0SGV4UGFkZGVkRGlnZXN0SW5mb0ZvclN0cmluZyhkLGUsYSl7dmFyIGI9ZnVuY3Rpb24oZil7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaFN0cmluZyhmLGEpfTt2YXIgYz1iKGQpO3JldHVybiBLSlVSLmNyeXB0by5VdGlsLmdldFBhZGRlZERpZ2VzdEluZm9IZXgoYyxhLGUpfWZ1bmN0aW9uIF96ZXJvUGFkZGluZ09mU2lnbmF0dXJlKGUsZCl7dmFyIGM9XCJcIjt2YXIgYT1kLzQtZS5sZW5ndGg7Zm9yKHZhciBiPTA7YjxhO2IrKyl7Yz1jK1wiMFwifXJldHVybiBjK2V9UlNBS2V5LnByb3RvdHlwZS5zaWduPWZ1bmN0aW9uKGQsYSl7dmFyIGI9ZnVuY3Rpb24oZSl7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaFN0cmluZyhlLGEpfTt2YXIgYz1iKGQpO3JldHVybiB0aGlzLnNpZ25XaXRoTWVzc2FnZUhhc2goYyxhKX07UlNBS2V5LnByb3RvdHlwZS5zaWduV2l0aE1lc3NhZ2VIYXNoPWZ1bmN0aW9uKGUsYyl7dmFyIGY9S0pVUi5jcnlwdG8uVXRpbC5nZXRQYWRkZWREaWdlc3RJbmZvSGV4KGUsYyx0aGlzLm4uYml0TGVuZ3RoKCkpO3ZhciBiPXBhcnNlQmlnSW50KGYsMTYpO3ZhciBkPXRoaXMuZG9Qcml2YXRlKGIpO3ZhciBhPWQudG9TdHJpbmcoMTYpO3JldHVybiBfemVyb1BhZGRpbmdPZlNpZ25hdHVyZShhLHRoaXMubi5iaXRMZW5ndGgoKSl9O2Z1bmN0aW9uIHBzc19tZ2YxX3N0cihjLGEsZSl7dmFyIGI9XCJcIixkPTA7d2hpbGUoYi5sZW5ndGg8YSl7Yis9aGV4dG9yc3RyKGUocnN0cnRvaGV4KGMrU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsWyhkJjQyNzgxOTAwODApPj4yNCwoZCYxNjcxMTY4MCk+PjE2LChkJjY1MjgwKT4+OCxkJjI1NV0pKSkpO2QrPTF9cmV0dXJuIGJ9UlNBS2V5LnByb3RvdHlwZS5zaWduUFNTPWZ1bmN0aW9uKGUsYSxkKXt2YXIgYz1mdW5jdGlvbihmKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGYsYSl9O3ZhciBiPWMocnN0cnRvaGV4KGUpKTtpZihkPT09dW5kZWZpbmVkKXtkPS0xfXJldHVybiB0aGlzLnNpZ25XaXRoTWVzc2FnZUhhc2hQU1MoYixhLGQpfTtSU0FLZXkucHJvdG90eXBlLnNpZ25XaXRoTWVzc2FnZUhhc2hQU1M9ZnVuY3Rpb24obCxhLGspe3ZhciBiPWhleHRvcnN0cihsKTt2YXIgZz1iLmxlbmd0aDt2YXIgbT10aGlzLm4uYml0TGVuZ3RoKCktMTt2YXIgYz1NYXRoLmNlaWwobS84KTt2YXIgZDt2YXIgbz1mdW5jdGlvbihpKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGksYSl9O2lmKGs9PT0tMXx8az09PXVuZGVmaW5lZCl7az1nfWVsc2V7aWYoaz09PS0yKXtrPWMtZy0yfWVsc2V7aWYoazwtMil7dGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBzYWx0IGxlbmd0aFwiKX19fWlmKGM8KGcraysyKSl7dGhyb3cgbmV3IEVycm9yKFwiZGF0YSB0b28gbG9uZ1wiKX12YXIgZj1cIlwiO2lmKGs+MCl7Zj1uZXcgQXJyYXkoayk7bmV3IFNlY3VyZVJhbmRvbSgpLm5leHRCeXRlcyhmKTtmPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGYpfXZhciBuPWhleHRvcnN0cihvKHJzdHJ0b2hleChcIlxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcIitiK2YpKSk7dmFyIGo9W107Zm9yKGQ9MDtkPGMtay1nLTI7ZCs9MSl7altkXT0wfXZhciBlPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGopK1wiXFx4MDFcIitmO3ZhciBoPXBzc19tZ2YxX3N0cihuLGUubGVuZ3RoLG8pO3ZhciBxPVtdO2ZvcihkPTA7ZDxlLmxlbmd0aDtkKz0xKXtxW2RdPWUuY2hhckNvZGVBdChkKV5oLmNoYXJDb2RlQXQoZCl9dmFyIHA9KDY1MjgwPj4oOCpjLW0pKSYyNTU7cVswXSY9fnA7Zm9yKGQ9MDtkPGc7ZCsrKXtxLnB1c2gobi5jaGFyQ29kZUF0KGQpKX1xLnB1c2goMTg4KTtyZXR1cm4gX3plcm9QYWRkaW5nT2ZTaWduYXR1cmUodGhpcy5kb1ByaXZhdGUobmV3IEJpZ0ludGVnZXIocSkpLnRvU3RyaW5nKDE2KSx0aGlzLm4uYml0TGVuZ3RoKCkpfTtmdW5jdGlvbiBfcnNhc2lnbl9nZXREZWNyeXB0U2lnbmF0dXJlQkkoYSxkLGMpe3ZhciBiPW5ldyBSU0FLZXkoKTtiLnNldFB1YmxpYyhkLGMpO3ZhciBlPWIuZG9QdWJsaWMoYSk7cmV0dXJuIGV9ZnVuY3Rpb24gX3JzYXNpZ25fZ2V0SGV4RGlnZXN0SW5mb0Zyb21TaWcoYSxjLGIpe3ZhciBlPV9yc2FzaWduX2dldERlY3J5cHRTaWduYXR1cmVCSShhLGMsYik7dmFyIGQ9ZS50b1N0cmluZygxNikucmVwbGFjZSgvXjFmKzAwLyxcIlwiKTtyZXR1cm4gZH1mdW5jdGlvbiBfcnNhc2lnbl9nZXRBbGdOYW1lQW5kSGFzaEZyb21IZXhEaXNnZXN0SW5mbyhmKXtmb3IodmFyIGUgaW4gS0pVUi5jcnlwdG8uVXRpbC5ESUdFU1RJTkZPSEVBRCl7dmFyIGQ9S0pVUi5jcnlwdG8uVXRpbC5ESUdFU1RJTkZPSEVBRFtlXTt2YXIgYj1kLmxlbmd0aDtpZihmLnN1YnN0cmluZygwLGIpPT1kKXt2YXIgYz1bZSxmLnN1YnN0cmluZyhiKV07cmV0dXJuIGN9fXJldHVybltdfVJTQUtleS5wcm90b3R5cGUudmVyaWZ5PWZ1bmN0aW9uKGYsail7aj1qLnJlcGxhY2UoX1JFX0hFWERFQ09OTFksXCJcIik7aj1qLnJlcGxhY2UoL1sgXFxuXSsvZyxcIlwiKTt2YXIgYj1wYXJzZUJpZ0ludChqLDE2KTtpZihiLmJpdExlbmd0aCgpPnRoaXMubi5iaXRMZW5ndGgoKSl7cmV0dXJuIDB9dmFyIGk9dGhpcy5kb1B1YmxpYyhiKTt2YXIgZT1pLnRvU3RyaW5nKDE2KS5yZXBsYWNlKC9eMWYrMDAvLFwiXCIpO3ZhciBnPV9yc2FzaWduX2dldEFsZ05hbWVBbmRIYXNoRnJvbUhleERpc2dlc3RJbmZvKGUpO2lmKGcubGVuZ3RoPT0wKXtyZXR1cm4gZmFsc2V9dmFyIGQ9Z1swXTt2YXIgaD1nWzFdO3ZhciBhPWZ1bmN0aW9uKGspe3JldHVybiBLSlVSLmNyeXB0by5VdGlsLmhhc2hTdHJpbmcoayxkKX07dmFyIGM9YShmKTtyZXR1cm4oaD09Yyl9O1JTQUtleS5wcm90b3R5cGUudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoPWZ1bmN0aW9uKGUsYSl7aWYoYS5sZW5ndGghPU1hdGguY2VpbCh0aGlzLm4uYml0TGVuZ3RoKCkvNCkpe3JldHVybiBmYWxzZX12YXIgYj1wYXJzZUJpZ0ludChhLDE2KTtpZihiLmJpdExlbmd0aCgpPnRoaXMubi5iaXRMZW5ndGgoKSl7cmV0dXJuIDB9dmFyIGg9dGhpcy5kb1B1YmxpYyhiKTt2YXIgZz1oLnRvU3RyaW5nKDE2KS5yZXBsYWNlKC9eMWYrMDAvLFwiXCIpO3ZhciBjPV9yc2FzaWduX2dldEFsZ05hbWVBbmRIYXNoRnJvbUhleERpc2dlc3RJbmZvKGcpO2lmKGMubGVuZ3RoPT0wKXtyZXR1cm4gZmFsc2V9dmFyIGQ9Y1swXTt2YXIgZj1jWzFdO3JldHVybihmPT1lKX07UlNBS2V5LnByb3RvdHlwZS52ZXJpZnlQU1M9ZnVuY3Rpb24oYyxiLGEsZil7dmFyIGU9ZnVuY3Rpb24oZyl7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChnLGEpfTt2YXIgZD1lKHJzdHJ0b2hleChjKSk7aWYoZj09PXVuZGVmaW5lZCl7Zj0tMX1yZXR1cm4gdGhpcy52ZXJpZnlXaXRoTWVzc2FnZUhhc2hQU1MoZCxiLGEsZil9O1JTQUtleS5wcm90b3R5cGUudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoUFNTPWZ1bmN0aW9uKGYscyxsLGMpe2lmKHMubGVuZ3RoIT1NYXRoLmNlaWwodGhpcy5uLmJpdExlbmd0aCgpLzQpKXtyZXR1cm4gZmFsc2V9dmFyIGs9bmV3IEJpZ0ludGVnZXIocywxNik7dmFyIHI9ZnVuY3Rpb24oaSl7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChpLGwpfTt2YXIgaj1oZXh0b3JzdHIoZik7dmFyIGg9ai5sZW5ndGg7dmFyIGc9dGhpcy5uLmJpdExlbmd0aCgpLTE7dmFyIG09TWF0aC5jZWlsKGcvOCk7dmFyIHE7aWYoYz09PS0xfHxjPT09dW5kZWZpbmVkKXtjPWh9ZWxzZXtpZihjPT09LTIpe2M9bS1oLTJ9ZWxzZXtpZihjPC0yKXt0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHNhbHQgbGVuZ3RoXCIpfX19aWYobTwoaCtjKzIpKXt0aHJvdyBuZXcgRXJyb3IoXCJkYXRhIHRvbyBsb25nXCIpfXZhciBhPXRoaXMuZG9QdWJsaWMoaykudG9CeXRlQXJyYXkoKTtmb3IocT0wO3E8YS5sZW5ndGg7cSs9MSl7YVtxXSY9MjU1fXdoaWxlKGEubGVuZ3RoPG0pe2EudW5zaGlmdCgwKX1pZihhW20tMV0hPT0xODgpe3Rocm93IG5ldyBFcnJvcihcImVuY29kZWQgbWVzc2FnZSBkb2VzIG5vdCBlbmQgaW4gMHhiY1wiKX1hPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGEpO3ZhciBkPWEuc3Vic3RyKDAsbS1oLTEpO3ZhciBlPWEuc3Vic3RyKGQubGVuZ3RoLGgpO3ZhciBwPSg2NTI4MD4+KDgqbS1nKSkmMjU1O2lmKChkLmNoYXJDb2RlQXQoMCkmcCkhPT0wKXt0aHJvdyBuZXcgRXJyb3IoXCJiaXRzIGJleW9uZCBrZXlzaXplIG5vdCB6ZXJvXCIpfXZhciBuPXBzc19tZ2YxX3N0cihlLGQubGVuZ3RoLHIpO3ZhciBvPVtdO2ZvcihxPTA7cTxkLmxlbmd0aDtxKz0xKXtvW3FdPWQuY2hhckNvZGVBdChxKV5uLmNoYXJDb2RlQXQocSl9b1swXSY9fnA7dmFyIGI9bS1oLWMtMjtmb3IocT0wO3E8YjtxKz0xKXtpZihvW3FdIT09MCl7dGhyb3cgbmV3IEVycm9yKFwibGVmdG1vc3Qgb2N0ZXRzIG5vdCB6ZXJvXCIpfX1pZihvW2JdIT09MSl7dGhyb3cgbmV3IEVycm9yKFwiMHgwMSBtYXJrZXIgbm90IGZvdW5kXCIpfXJldHVybiBlPT09aGV4dG9yc3RyKHIocnN0cnRvaGV4KFwiXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFwiK2orU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsby5zbGljZSgtYykpKSkpfTtSU0FLZXkuU0FMVF9MRU5fSExFTj0tMTtSU0FLZXkuU0FMVF9MRU5fTUFYPS0yO1JTQUtleS5TQUxUX0xFTl9SRUNPVkVSPS0yO1xuZnVuY3Rpb24gWDUwOShxKXt2YXIgaj1BU04xSEVYLG49ai5nZXRDaGlsZElkeCxnPWouZ2V0VixiPWouZ2V0VExWLGM9ai5nZXRWYnlMaXN0LGs9ai5nZXRWYnlMaXN0RXgsYT1qLmdldFRMVmJ5TGlzdCxsPWouZ2V0VExWYnlMaXN0RXgsaD1qLmdldElkeGJ5TGlzdCxlPWouZ2V0SWR4YnlMaXN0RXgsaT1qLmdldFZpZHgscD1qLm9pZG5hbWUsbT1qLmhleHRvb2lkc3RyLGQ9WDUwOSxyPXBlbXRvaGV4LGY7dHJ5e2Y9S0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllci5QU1NOQU1FMkFTTjFUTFZ9Y2F0Y2gobyl7fXRoaXMuSEVYMlNUQUc9e1wiMGNcIjpcInV0ZjhcIixcIjEzXCI6XCJwcm5cIixcIjE2XCI6XCJpYTVcIixcIjFhXCI6XCJ2aXNcIixcIjFlXCI6XCJibXBcIn07dGhpcy5oZXg9bnVsbDt0aGlzLnZlcnNpb249MDt0aGlzLmZvZmZzZXQ9MDt0aGlzLmFFeHRJbmZvPW51bGw7dGhpcy5nZXRWZXJzaW9uPWZ1bmN0aW9uKCl7aWYodGhpcy5oZXg9PT1udWxsfHx0aGlzLnZlcnNpb24hPT0wKXtyZXR1cm4gdGhpcy52ZXJzaW9ufWlmKGEodGhpcy5oZXgsMCxbMCwwXSkhPT1cImEwMDMwMjAxMDJcIil7dGhpcy52ZXJzaW9uPTE7dGhpcy5mb2Zmc2V0PS0xO3JldHVybiAxfXRoaXMudmVyc2lvbj0zO3JldHVybiAzfTt0aGlzLmdldFNlcmlhbE51bWJlckhleD1mdW5jdGlvbigpe3JldHVybiBrKHRoaXMuaGV4LDAsWzAsMF0sXCIwMlwiKX07dGhpcy5nZXRTaWduYXR1cmVBbGdvcml0aG1GaWVsZD1mdW5jdGlvbigpe3ZhciBzPWwodGhpcy5oZXgsMCxbMCwxXSk7cmV0dXJuIHRoaXMuZ2V0QWxnb3JpdGhtSWRlbnRpZmllck5hbWUocyl9O3RoaXMuZ2V0QWxnb3JpdGhtSWRlbnRpZmllck5hbWU9ZnVuY3Rpb24ocyl7Zm9yKHZhciB0IGluIGYpe2lmKHM9PT1mW3RdKXtyZXR1cm4gdH19cmV0dXJuIHAoayhzLDAsWzBdLFwiMDZcIikpfTt0aGlzLmdldElzc3Vlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFg1MDBOYW1lKHRoaXMuZ2V0SXNzdWVySGV4KCkpfTt0aGlzLmdldElzc3VlckhleD1mdW5jdGlvbigpe3JldHVybiBhKHRoaXMuaGV4LDAsWzAsMyt0aGlzLmZvZmZzZXRdLFwiMzBcIil9O3RoaXMuZ2V0SXNzdWVyU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIGQuaGV4MmRuKHRoaXMuZ2V0SXNzdWVySGV4KCkpfTt0aGlzLmdldFN1YmplY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRYNTAwTmFtZSh0aGlzLmdldFN1YmplY3RIZXgoKSl9O3RoaXMuZ2V0U3ViamVjdEhleD1mdW5jdGlvbigpe3JldHVybiBhKHRoaXMuaGV4LDAsWzAsNSt0aGlzLmZvZmZzZXRdLFwiMzBcIil9O3RoaXMuZ2V0U3ViamVjdFN0cmluZz1mdW5jdGlvbigpe3JldHVybiBkLmhleDJkbih0aGlzLmdldFN1YmplY3RIZXgoKSl9O3RoaXMuZ2V0Tm90QmVmb3JlPWZ1bmN0aW9uKCl7dmFyIHQ9Yyh0aGlzLmhleCwwLFswLDQrdGhpcy5mb2Zmc2V0LDBdKTt0PXQucmVwbGFjZSgvKC4uKS9nLFwiJSQxXCIpO3Q9ZGVjb2RlVVJJQ29tcG9uZW50KHQpO3JldHVybiB0fTt0aGlzLmdldE5vdEFmdGVyPWZ1bmN0aW9uKCl7dmFyIHQ9Yyh0aGlzLmhleCwwLFswLDQrdGhpcy5mb2Zmc2V0LDFdKTt0PXQucmVwbGFjZSgvKC4uKS9nLFwiJSQxXCIpO3Q9ZGVjb2RlVVJJQ29tcG9uZW50KHQpO3JldHVybiB0fTt0aGlzLmdldFB1YmxpY0tleUhleD1mdW5jdGlvbigpe3JldHVybiBqLmdldFRMVmJ5TGlzdCh0aGlzLmhleCwwLFswLDYrdGhpcy5mb2Zmc2V0XSxcIjMwXCIpfTt0aGlzLmdldFB1YmxpY0tleUlkeD1mdW5jdGlvbigpe3JldHVybiBoKHRoaXMuaGV4LDAsWzAsNit0aGlzLmZvZmZzZXRdLFwiMzBcIil9O3RoaXMuZ2V0UHVibGljS2V5Q29udGVudElkeD1mdW5jdGlvbigpe3ZhciBzPXRoaXMuZ2V0UHVibGljS2V5SWR4KCk7cmV0dXJuIGgodGhpcy5oZXgscyxbMSwwXSxcIjMwXCIpfTt0aGlzLmdldFB1YmxpY0tleT1mdW5jdGlvbigpe3JldHVybiBLRVlVVElMLmdldEtleSh0aGlzLmdldFB1YmxpY0tleUhleCgpLG51bGwsXCJwa2NzOHB1YlwiKX07dGhpcy5nZXRTaWduYXR1cmVBbGdvcml0aG1OYW1lPWZ1bmN0aW9uKCl7dmFyIHM9YSh0aGlzLmhleCwwLFsxXSxcIjMwXCIpO3JldHVybiB0aGlzLmdldEFsZ29yaXRobUlkZW50aWZpZXJOYW1lKHMpfTt0aGlzLmdldFNpZ25hdHVyZVZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIGModGhpcy5oZXgsMCxbMl0sXCIwM1wiLHRydWUpfTt0aGlzLnZlcmlmeVNpZ25hdHVyZT1mdW5jdGlvbih1KXt2YXIgdj10aGlzLmdldFNpZ25hdHVyZUFsZ29yaXRobUZpZWxkKCk7dmFyIHM9dGhpcy5nZXRTaWduYXR1cmVWYWx1ZUhleCgpO3ZhciB0PWEodGhpcy5oZXgsMCxbMF0sXCIzMFwiKTt2YXIgdz1uZXcgS0pVUi5jcnlwdG8uU2lnbmF0dXJlKHthbGc6dn0pO3cuaW5pdCh1KTt3LnVwZGF0ZUhleCh0KTtyZXR1cm4gdy52ZXJpZnkocyl9O3RoaXMucGFyc2VFeHQ9ZnVuY3Rpb24oQil7dmFyIHUscyx3O2lmKEI9PT11bmRlZmluZWQpe3c9dGhpcy5oZXg7aWYodGhpcy52ZXJzaW9uIT09Myl7cmV0dXJuIC0xfXU9aCh3LDAsWzAsNywwXSxcIjMwXCIpO3M9bih3LHUpfWVsc2V7dz1wZW10b2hleChCKTt2YXIgeD1oKHcsMCxbMCwzLDAsMF0sXCIwNlwiKTtpZihnKHcseCkhPVwiMmE4NjQ4ODZmNzBkMDEwOTBlXCIpe3RoaXMuYUV4dEluZm89bmV3IEFycmF5KCk7cmV0dXJufXU9aCh3LDAsWzAsMywwLDEsMF0sXCIzMFwiKTtzPW4odyx1KTt0aGlzLmhleD13fXRoaXMuYUV4dEluZm89bmV3IEFycmF5KCk7Zm9yKHZhciB2PTA7djxzLmxlbmd0aDt2Kyspe3ZhciB6PXt9O3ouY3JpdGljYWw9ZmFsc2U7dmFyIHk9bih3LHNbdl0pO3ZhciB0PTA7aWYoeS5sZW5ndGg9PT0zKXt6LmNyaXRpY2FsPXRydWU7dD0xfXoub2lkPWouaGV4dG9vaWRzdHIoYyh3LHNbdl0sWzBdLFwiMDZcIikpO3ZhciBBPWgodyxzW3ZdLFsxK3RdKTt6LnZpZHg9aSh3LEEpO3RoaXMuYUV4dEluZm8ucHVzaCh6KX19O3RoaXMuZ2V0RXh0SW5mbz1mdW5jdGlvbih1KXt2YXIgcz10aGlzLmFFeHRJbmZvO3ZhciB2PXU7aWYoIXUubWF0Y2goL15bMC05Ll0rJC8pKXt2PUtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZCh1KX1pZih2PT09XCJcIil7cmV0dXJuIHVuZGVmaW5lZH1mb3IodmFyIHQ9MDt0PHMubGVuZ3RoO3QrKyl7aWYoc1t0XS5vaWQ9PT12KXtyZXR1cm4gc1t0XX19cmV0dXJuIHVuZGVmaW5lZH07dGhpcy5nZXRFeHRCYXNpY0NvbnN0cmFpbnRzPWZ1bmN0aW9uKHQseCl7aWYodD09PXVuZGVmaW5lZCYmeD09PXVuZGVmaW5lZCl7dmFyIHY9dGhpcy5nZXRFeHRJbmZvKFwiYmFzaWNDb25zdHJhaW50c1wiKTtpZih2PT09dW5kZWZpbmVkKXtyZXR1cm4gdW5kZWZpbmVkfXQ9Yih0aGlzLmhleCx2LnZpZHgpO3g9di5jcml0aWNhbH12YXIgcz17ZXh0bmFtZTpcImJhc2ljQ29uc3RyYWludHNcIn07aWYoeCl7cy5jcml0aWNhbD10cnVlfWlmKHQ9PT1cIjMwMDBcIil7cmV0dXJuIHN9aWYodD09PVwiMzAwMzAxMDFmZlwiKXtzLmNBPXRydWU7cmV0dXJuIHN9aWYodC5zdWJzdHIoMCwxMik9PT1cIjMwMDYwMTAxZmYwMlwiKXt2YXIgdz1nKHQsMTApO3ZhciB1PXBhcnNlSW50KHcsMTYpO3MuY0E9dHJ1ZTtzLnBhdGhMZW49dTtyZXR1cm4gc310aHJvdyBuZXcgRXJyb3IoXCJoRXh0ViBwYXJzZSBlcnJvcjogXCIrdCl9O3RoaXMuZ2V0RXh0S2V5VXNhZ2U9ZnVuY3Rpb24odCx2KXtpZih0PT09dW5kZWZpbmVkJiZ2PT09dW5kZWZpbmVkKXt2YXIgdT10aGlzLmdldEV4dEluZm8oXCJrZXlVc2FnZVwiKTtpZih1PT09dW5kZWZpbmVkKXtyZXR1cm4gdW5kZWZpbmVkfXQ9Yih0aGlzLmhleCx1LnZpZHgpO3Y9dS5jcml0aWNhbH12YXIgcz17ZXh0bmFtZTpcImtleVVzYWdlXCJ9O2lmKHYpe3MuY3JpdGljYWw9dHJ1ZX1zLm5hbWVzPXRoaXMuZ2V0RXh0S2V5VXNhZ2VTdHJpbmcodCkuc3BsaXQoXCIsXCIpO3JldHVybiBzfTt0aGlzLmdldEV4dEtleVVzYWdlQmluPWZ1bmN0aW9uKHUpe2lmKHU9PT11bmRlZmluZWQpe3ZhciB2PXRoaXMuZ2V0RXh0SW5mbyhcImtleVVzYWdlXCIpO2lmKHY9PT11bmRlZmluZWQpe3JldHVyblwiXCJ9dT1iKHRoaXMuaGV4LHYudmlkeCl9aWYodS5sZW5ndGghPTgmJnUubGVuZ3RoIT0xMCl7dGhyb3cgbmV3IEVycm9yKFwibWFsZm9ybWVkIGtleSB1c2FnZSB2YWx1ZTogXCIrdSl9dmFyIHQ9XCIwMDAwMDAwMDAwMDAwMDBcIitwYXJzZUludCh1LnN1YnN0cig2KSwxNikudG9TdHJpbmcoMik7aWYodS5sZW5ndGg9PTgpe3Q9dC5zbGljZSgtOCl9aWYodS5sZW5ndGg9PTEwKXt0PXQuc2xpY2UoLTE2KX10PXQucmVwbGFjZSgvMCskLyxcIlwiKTtpZih0PT1cIlwiKXt0PVwiMFwifXJldHVybiB0fTt0aGlzLmdldEV4dEtleVVzYWdlU3RyaW5nPWZ1bmN0aW9uKHUpe3ZhciB2PXRoaXMuZ2V0RXh0S2V5VXNhZ2VCaW4odSk7dmFyIHM9bmV3IEFycmF5KCk7Zm9yKHZhciB0PTA7dDx2Lmxlbmd0aDt0Kyspe2lmKHYuc3Vic3RyKHQsMSk9PVwiMVwiKXtzLnB1c2goWDUwOS5LRVlVU0FHRV9OQU1FW3RdKX19cmV0dXJuIHMuam9pbihcIixcIil9O3RoaXMuZ2V0RXh0U3ViamVjdEtleUlkZW50aWZpZXI9ZnVuY3Rpb24odSx3KXtpZih1PT09dW5kZWZpbmVkJiZ3PT09dW5kZWZpbmVkKXt2YXIgdj10aGlzLmdldEV4dEluZm8oXCJzdWJqZWN0S2V5SWRlbnRpZmllclwiKTtpZih2PT09dW5kZWZpbmVkKXtyZXR1cm4gdW5kZWZpbmVkfXU9Yih0aGlzLmhleCx2LnZpZHgpO3c9di5jcml0aWNhbH12YXIgcz17ZXh0bmFtZTpcInN1YmplY3RLZXlJZGVudGlmaWVyXCJ9O2lmKHcpe3MuY3JpdGljYWw9dHJ1ZX12YXIgdD1nKHUsMCk7cy5raWQ9e2hleDp0fTtyZXR1cm4gc307dGhpcy5nZXRFeHRBdXRob3JpdHlLZXlJZGVudGlmaWVyPWZ1bmN0aW9uKHksdyl7aWYoeT09PXVuZGVmaW5lZCYmdz09PXVuZGVmaW5lZCl7dmFyIHM9dGhpcy5nZXRFeHRJbmZvKFwiYXV0aG9yaXR5S2V5SWRlbnRpZmllclwiKTtpZihzPT09dW5kZWZpbmVkKXtyZXR1cm4gdW5kZWZpbmVkfXk9Yih0aGlzLmhleCxzLnZpZHgpO3c9cy5jcml0aWNhbH12YXIgej17ZXh0bmFtZTpcImF1dGhvcml0eUtleUlkZW50aWZpZXJcIn07aWYodyl7ei5jcml0aWNhbD10cnVlfXZhciB4PW4oeSwwKTtmb3IodmFyIHQ9MDt0PHgubGVuZ3RoO3QrKyl7dmFyIEE9eS5zdWJzdHIoeFt0XSwyKTtpZihBPT09XCI4MFwiKXt6LmtpZD17aGV4OmcoeSx4W3RdKX19aWYoQT09PVwiYTFcIil7dmFyIHY9Yih5LHhbdF0pO3ZhciB1PXRoaXMuZ2V0R2VuZXJhbE5hbWVzKHYpO3ouaXNzdWVyPXVbMF1bXCJkblwiXX1pZihBPT09XCI4MlwiKXt6LnNuPXtoZXg6Zyh5LHhbdF0pfX19cmV0dXJuIHp9O3RoaXMuZ2V0RXh0RXh0S2V5VXNhZ2U9ZnVuY3Rpb24odix4KXtpZih2PT09dW5kZWZpbmVkJiZ4PT09dW5kZWZpbmVkKXt2YXIgdz10aGlzLmdldEV4dEluZm8oXCJleHRLZXlVc2FnZVwiKTtpZih3PT09dW5kZWZpbmVkKXtyZXR1cm4gdW5kZWZpbmVkfXY9Yih0aGlzLmhleCx3LnZpZHgpO3g9dy5jcml0aWNhbH12YXIgcz17ZXh0bmFtZTpcImV4dEtleVVzYWdlXCIsYXJyYXk6W119O2lmKHgpe3MuY3JpdGljYWw9dHJ1ZX12YXIgdD1uKHYsMCk7Zm9yKHZhciB1PTA7dTx0Lmxlbmd0aDt1Kyspe3MuYXJyYXkucHVzaChwKGcodix0W3VdKSkpfXJldHVybiBzfTt0aGlzLmdldEV4dEV4dEtleVVzYWdlTmFtZT1mdW5jdGlvbigpe3ZhciB3PXRoaXMuZ2V0RXh0SW5mbyhcImV4dEtleVVzYWdlXCIpO2lmKHc9PT11bmRlZmluZWQpe3JldHVybiB3fXZhciBzPW5ldyBBcnJheSgpO3ZhciB2PWIodGhpcy5oZXgsdy52aWR4KTtpZih2PT09XCJcIil7cmV0dXJuIHN9dmFyIHQ9bih2LDApO2Zvcih2YXIgdT0wO3U8dC5sZW5ndGg7dSsrKXtzLnB1c2gocChnKHYsdFt1XSkpKX1yZXR1cm4gc307dGhpcy5nZXRFeHRTdWJqZWN0QWx0TmFtZT1mdW5jdGlvbih0LHYpe2lmKHQ9PT11bmRlZmluZWQmJnY9PT11bmRlZmluZWQpe3ZhciB1PXRoaXMuZ2V0RXh0SW5mbyhcInN1YmplY3RBbHROYW1lXCIpO2lmKHU9PT11bmRlZmluZWQpe3JldHVybiB1bmRlZmluZWR9dD1iKHRoaXMuaGV4LHUudmlkeCk7dj11LmNyaXRpY2FsfXZhciBzPXtleHRuYW1lOlwic3ViamVjdEFsdE5hbWVcIixhcnJheTpbXX07aWYodil7cy5jcml0aWNhbD10cnVlfXMuYXJyYXk9dGhpcy5nZXRHZW5lcmFsTmFtZXModCk7cmV0dXJuIHN9O3RoaXMuZ2V0RXh0SXNzdWVyQWx0TmFtZT1mdW5jdGlvbih0LHYpe2lmKHQ9PT11bmRlZmluZWQmJnY9PT11bmRlZmluZWQpe3ZhciB1PXRoaXMuZ2V0RXh0SW5mbyhcImlzc3VlckFsdE5hbWVcIik7aWYodT09PXVuZGVmaW5lZCl7cmV0dXJuIHVuZGVmaW5lZH10PWIodGhpcy5oZXgsdS52aWR4KTt2PXUuY3JpdGljYWx9dmFyIHM9e2V4dG5hbWU6XCJpc3N1ZXJBbHROYW1lXCIsYXJyYXk6W119O2lmKHYpe3MuY3JpdGljYWw9dHJ1ZX1zLmFycmF5PXRoaXMuZ2V0R2VuZXJhbE5hbWVzKHQpO3JldHVybiBzfTt0aGlzLmdldEdlbmVyYWxOYW1lcz1mdW5jdGlvbih3KXt2YXIgdT1uKHcsMCk7dmFyIHM9W107Zm9yKHZhciB2PTA7djx1Lmxlbmd0aDt2Kyspe3ZhciB0PXRoaXMuZ2V0R2VuZXJhbE5hbWUoYih3LHVbdl0pKTtpZih0IT09dW5kZWZpbmVkKXtzLnB1c2godCl9fXJldHVybiBzfTt0aGlzLmdldEdlbmVyYWxOYW1lPWZ1bmN0aW9uKHQpe3ZhciBzPXQuc3Vic3RyKDAsMik7dmFyIHY9Zyh0LDApO3ZhciB1PWhleHRvcnN0cih2KTtpZihzPT1cIjgxXCIpe3JldHVybntyZmM4MjI6dX19aWYocz09XCI4MlwiKXtyZXR1cm57ZG5zOnV9fWlmKHM9PVwiODZcIil7cmV0dXJue3VyaTp1fX1pZihzPT1cIjg3XCIpe3JldHVybntpcDpoZXh0b2lwKHYpfX1pZihzPT1cImE0XCIpe3JldHVybntkbjp0aGlzLmdldFg1MDBOYW1lKHYpfX1yZXR1cm4gdW5kZWZpbmVkfTt0aGlzLmdldEV4dFN1YmplY3RBbHROYW1lMj1mdW5jdGlvbigpe3ZhciB3LHoseTt2YXIgeD10aGlzLmdldEV4dEluZm8oXCJzdWJqZWN0QWx0TmFtZVwiKTtpZih4PT09dW5kZWZpbmVkKXtyZXR1cm4geH12YXIgcz1uZXcgQXJyYXkoKTt2YXIgdj1iKHRoaXMuaGV4LHgudmlkeCk7dmFyIHQ9bih2LDApO2Zvcih2YXIgdT0wO3U8dC5sZW5ndGg7dSsrKXt5PXYuc3Vic3RyKHRbdV0sMik7dz1nKHYsdFt1XSk7aWYoeT09PVwiODFcIil7ej1oZXh0b3V0Zjgodyk7cy5wdXNoKFtcIk1BSUxcIix6XSl9aWYoeT09PVwiODJcIil7ej1oZXh0b3V0Zjgodyk7cy5wdXNoKFtcIkROU1wiLHpdKX1pZih5PT09XCI4NFwiKXt6PVg1MDkuaGV4MmRuKHcsMCk7cy5wdXNoKFtcIkROXCIsel0pfWlmKHk9PT1cIjg2XCIpe3o9aGV4dG91dGY4KHcpO3MucHVzaChbXCJVUklcIix6XSl9aWYoeT09PVwiODdcIil7ej1oZXh0b2lwKHcpO3MucHVzaChbXCJJUFwiLHpdKX19cmV0dXJuIHN9O3RoaXMuZ2V0RXh0Q1JMRGlzdHJpYnV0aW9uUG9pbnRzPWZ1bmN0aW9uKHcseSl7aWYodz09PXVuZGVmaW5lZCYmeT09PXVuZGVmaW5lZCl7dmFyIHg9dGhpcy5nZXRFeHRJbmZvKFwiY1JMRGlzdHJpYnV0aW9uUG9pbnRzXCIpO2lmKHg9PT11bmRlZmluZWQpe3JldHVybiB1bmRlZmluZWR9dz1iKHRoaXMuaGV4LHgudmlkeCk7eT14LmNyaXRpY2FsfXZhciB0PXtleHRuYW1lOlwiY1JMRGlzdHJpYnV0aW9uUG9pbnRzXCIsYXJyYXk6W119O2lmKHkpe3QuY3JpdGljYWw9dHJ1ZX12YXIgdT1uKHcsMCk7Zm9yKHZhciB2PTA7djx1Lmxlbmd0aDt2Kyspe3ZhciBzPWIodyx1W3ZdKTt0LmFycmF5LnB1c2godGhpcy5nZXREaXN0cmlidXRpb25Qb2ludChzKSl9cmV0dXJuIHR9O3RoaXMuZ2V0RGlzdHJpYnV0aW9uUG9pbnQ9ZnVuY3Rpb24oeCl7dmFyIHU9e307dmFyIHY9bih4LDApO2Zvcih2YXIgdz0wO3c8di5sZW5ndGg7dysrKXt2YXIgdD14LnN1YnN0cih2W3ddLDIpO3ZhciBzPWIoeCx2W3ddKTtpZih0PT1cImEwXCIpe3UuZHBuYW1lPXRoaXMuZ2V0RGlzdHJpYnV0aW9uUG9pbnROYW1lKHMpfX1yZXR1cm4gdX07dGhpcy5nZXREaXN0cmlidXRpb25Qb2ludE5hbWU9ZnVuY3Rpb24oeCl7dmFyIHU9e307dmFyIHY9bih4LDApO2Zvcih2YXIgdz0wO3c8di5sZW5ndGg7dysrKXt2YXIgdD14LnN1YnN0cih2W3ddLDIpO3ZhciBzPWIoeCx2W3ddKTtpZih0PT1cImEwXCIpe3UuZnVsbD10aGlzLmdldEdlbmVyYWxOYW1lcyhzKX19cmV0dXJuIHV9O3RoaXMuZ2V0RXh0Q1JMRGlzdHJpYnV0aW9uUG9pbnRzVVJJPWZ1bmN0aW9uKCl7dmFyIHg9dGhpcy5nZXRFeHRJbmZvKFwiY1JMRGlzdHJpYnV0aW9uUG9pbnRzXCIpO2lmKHg9PT11bmRlZmluZWQpe3JldHVybiB4fXZhciBzPW5ldyBBcnJheSgpO3ZhciB0PW4odGhpcy5oZXgseC52aWR4KTtmb3IodmFyIHY9MDt2PHQubGVuZ3RoO3YrKyl7dHJ5e3ZhciB5PWModGhpcy5oZXgsdFt2XSxbMCwwLDBdLFwiODZcIik7dmFyIHc9aGV4dG91dGY4KHkpO3MucHVzaCh3KX1jYXRjaCh1KXt9fXJldHVybiBzfTt0aGlzLmdldEV4dEFJQUluZm89ZnVuY3Rpb24oKXt2YXIgdz10aGlzLmdldEV4dEluZm8oXCJhdXRob3JpdHlJbmZvQWNjZXNzXCIpO2lmKHc9PT11bmRlZmluZWQpe3JldHVybiB3fXZhciBzPXtvY3NwOltdLGNhaXNzdWVyOltdfTt2YXIgdD1uKHRoaXMuaGV4LHcudmlkeCk7Zm9yKHZhciB1PTA7dTx0Lmxlbmd0aDt1Kyspe3ZhciB4PWModGhpcy5oZXgsdFt1XSxbMF0sXCIwNlwiKTt2YXIgdj1jKHRoaXMuaGV4LHRbdV0sWzFdLFwiODZcIik7aWYoeD09PVwiMmIwNjAxMDUwNTA3MzAwMVwiKXtzLm9jc3AucHVzaChoZXh0b3V0ZjgodikpfWlmKHg9PT1cIjJiMDYwMTA1MDUwNzMwMDJcIil7cy5jYWlzc3Vlci5wdXNoKGhleHRvdXRmOCh2KSl9fXJldHVybiBzfTt0aGlzLmdldEV4dEF1dGhvcml0eUluZm9BY2Nlc3M9ZnVuY3Rpb24oeix4KXtpZih6PT09dW5kZWZpbmVkJiZ4PT09dW5kZWZpbmVkKXt2YXIgcz10aGlzLmdldEV4dEluZm8oXCJhdXRob3JpdHlJbmZvQWNjZXNzXCIpO2lmKHM9PT11bmRlZmluZWQpe3JldHVybiB1bmRlZmluZWR9ej1iKHRoaXMuaGV4LHMudmlkeCk7eD1zLmNyaXRpY2FsfXZhciBBPXtleHRuYW1lOlwiYXV0aG9yaXR5SW5mb0FjY2Vzc1wiLGFycmF5OltdfTtpZih4KXtBLmNyaXRpY2FsPXRydWV9dmFyIHk9bih6LDApO2Zvcih2YXIgdD0wO3Q8eS5sZW5ndGg7dCsrKXt2YXIgdz1rKHoseVt0XSxbMF0sXCIwNlwiKTt2YXIgdT1jKHoseVt0XSxbMV0sXCI4NlwiKTt2YXIgdj1oZXh0b3V0ZjgodSk7aWYodz09XCIyYjA2MDEwNTA1MDczMDAxXCIpe0EuYXJyYXkucHVzaCh7b2NzcDp2fSl9ZWxzZXtpZih3PT1cIjJiMDYwMTA1MDUwNzMwMDJcIil7QS5hcnJheS5wdXNoKHtjYWlzc3Vlcjp2fSl9ZWxzZXt0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIG1ldGhvZDogXCIrdyl9fX1yZXR1cm4gQX07dGhpcy5nZXRFeHRDZXJ0aWZpY2F0ZVBvbGljaWVzPWZ1bmN0aW9uKHcseil7aWYodz09PXVuZGVmaW5lZCYmej09PXVuZGVmaW5lZCl7dmFyIHk9dGhpcy5nZXRFeHRJbmZvKFwiY2VydGlmaWNhdGVQb2xpY2llc1wiKTtpZih5PT09dW5kZWZpbmVkKXtyZXR1cm4gdW5kZWZpbmVkfXc9Yih0aGlzLmhleCx5LnZpZHgpO3o9eS5jcml0aWNhbH12YXIgcz17ZXh0bmFtZTpcImNlcnRpZmljYXRlUG9saWNpZXNcIixhcnJheTpbXX07aWYoeil7cy5jcml0aWNhbD10cnVlfXZhciB0PW4odywwKTtmb3IodmFyIHU9MDt1PHQubGVuZ3RoO3UrKyl7dmFyIHg9Yih3LHRbdV0pO3ZhciB2PXRoaXMuZ2V0UG9saWN5SW5mb3JtYXRpb24oeCk7cy5hcnJheS5wdXNoKHYpfXJldHVybiBzfTt0aGlzLmdldFBvbGljeUluZm9ybWF0aW9uPWZ1bmN0aW9uKHcpe3ZhciBzPXt9O3ZhciB5PWModywwLFswXSxcIjA2XCIpO3MucG9saWN5b2lkPXAoeSk7dmFyIHo9ZSh3LDAsWzFdLFwiMzBcIik7aWYoeiE9LTEpe3MuYXJyYXk9W107dmFyIHQ9bih3LHopO2Zvcih2YXIgdT0wO3U8dC5sZW5ndGg7dSsrKXt2YXIgeD1iKHcsdFt1XSk7dmFyIHY9dGhpcy5nZXRQb2xpY3lRdWFsaWZpZXJJbmZvKHgpO3MuYXJyYXkucHVzaCh2KX19cmV0dXJuIHN9O3RoaXMuZ2V0UG9saWN5UXVhbGlmaWVySW5mbz1mdW5jdGlvbih0KXt2YXIgcz17fTt2YXIgdT1jKHQsMCxbMF0sXCIwNlwiKTtpZih1PT09XCIyYjA2MDEwNTA1MDcwMjAxXCIpe3ZhciB3PWsodCwwLFsxXSxcIjE2XCIpO3MuY3BzPWhleHRvcnN0cih3KX1lbHNle2lmKHU9PT1cIjJiMDYwMTA1MDUwNzAyMDJcIil7dmFyIHY9YSh0LDAsWzFdLFwiMzBcIik7cy51bm90aWNlPXRoaXMuZ2V0VXNlck5vdGljZSh2KX19cmV0dXJuIHN9O3RoaXMuZ2V0VXNlck5vdGljZT1mdW5jdGlvbih3KXt2YXIgdD17fTt2YXIgdT1uKHcsMCk7Zm9yKHZhciB2PTA7djx1Lmxlbmd0aDt2Kyspe3ZhciBzPWIodyx1W3ZdKTtpZihzLnN1YnN0cigwLDIpIT1cIjMwXCIpe3QuZXhwdGV4dD10aGlzLmdldERpc3BsYXlUZXh0KHMpfX1yZXR1cm4gdH07dGhpcy5nZXREaXNwbGF5VGV4dD1mdW5jdGlvbih0KXt2YXIgdT17XCIwY1wiOlwidXRmOFwiLFwiMTZcIjpcImlhNVwiLFwiMWFcIjpcInZpc1wiLFwiMWVcIjpcImJtcFwifTt2YXIgcz17fTtzLnR5cGU9dVt0LnN1YnN0cigwLDIpXTtzLnN0cj1oZXh0b3JzdHIoZyh0LDApKTtyZXR1cm4gc307dGhpcy5nZXRFeHRDUkxOdW1iZXI9ZnVuY3Rpb24odCx1KXt2YXIgcz17ZXh0bmFtZTpcImNSTE51bWJlclwifTtpZih1KXtzLmNyaXRpY2FsPXRydWV9aWYodC5zdWJzdHIoMCwyKT09XCIwMlwiKXtzLm51bT17aGV4OmcodCwwKX07cmV0dXJuIHN9dGhyb3cgbmV3IEVycm9yKFwiaEV4dFYgcGFyc2UgZXJyb3I6IFwiK3QpfTt0aGlzLmdldEV4dENSTFJlYXNvbj1mdW5jdGlvbih0LHUpe3ZhciBzPXtleHRuYW1lOlwiY1JMUmVhc29uXCJ9O2lmKHUpe3MuY3JpdGljYWw9dHJ1ZX1pZih0LnN1YnN0cigwLDIpPT1cIjBhXCIpe3MuY29kZT1wYXJzZUludChnKHQsMCksMTYpO3JldHVybiBzfXRocm93IG5ldyBFcnJvcihcImhFeHRWIHBhcnNlIGVycm9yOiBcIit0KX07dGhpcy5nZXRFeHRPY3NwTm9uY2U9ZnVuY3Rpb24odCx2KXt2YXIgcz17ZXh0bmFtZTpcIm9jc3BOb25jZVwifTtpZih2KXtzLmNyaXRpY2FsPXRydWV9dmFyIHU9Zyh0LDApO3MuaGV4PXU7cmV0dXJuIHN9O3RoaXMuZ2V0RXh0T2NzcE5vQ2hlY2s9ZnVuY3Rpb24odCx1KXt2YXIgcz17ZXh0bmFtZTpcIm9jc3BOb0NoZWNrXCJ9O2lmKHUpe3MuY3JpdGljYWw9dHJ1ZX1yZXR1cm4gc307dGhpcy5nZXRFeHRBZG9iZVRpbWVTdGFtcD1mdW5jdGlvbih2LHkpe2lmKHY9PT11bmRlZmluZWQmJnk9PT11bmRlZmluZWQpe3ZhciB4PXRoaXMuZ2V0RXh0SW5mbyhcImFkb2JlVGltZVN0YW1wXCIpO2lmKHg9PT11bmRlZmluZWQpe3JldHVybiB1bmRlZmluZWR9dj1iKHRoaXMuaGV4LHgudmlkeCk7eT14LmNyaXRpY2FsfXZhciBzPXtleHRuYW1lOlwiYWRvYmVUaW1lU3RhbXBcIn07aWYoeSl7cy5jcml0aWNhbD10cnVlfXZhciB1PW4odiwwKTtpZih1Lmxlbmd0aD4xKXt2YXIgej1iKHYsdVsxXSk7dmFyIHQ9dGhpcy5nZXRHZW5lcmFsTmFtZSh6KTtpZih0LnVyaSE9dW5kZWZpbmVkKXtzLnVyaT10LnVyaX19aWYodS5sZW5ndGg+Mil7dmFyIHc9Yih2LHVbMl0pO2lmKHc9PVwiMDEwMWZmXCIpe3MucmVxYXV0aD10cnVlfWlmKHc9PVwiMDEwMTAwXCIpe3MucmVxYXV0aD1mYWxzZX19cmV0dXJuIHN9O3RoaXMuZ2V0WDUwME5hbWVSdWxlPWZ1bmN0aW9uKHMpe3ZhciB6PXRydWU7dmFyIEQ9dHJ1ZTt2YXIgQz1mYWxzZTt2YXIgdD1cIlwiO3ZhciB3PVwiXCI7dmFyIEY9bnVsbDt2YXIgQT1bXTtmb3IodmFyIHY9MDt2PHMubGVuZ3RoO3YrKyl7dmFyIHg9c1t2XTtmb3IodmFyIHU9MDt1PHgubGVuZ3RoO3UrKyl7QS5wdXNoKHhbdV0pfX1mb3IodmFyIHY9MDt2PEEubGVuZ3RoO3YrKyl7dmFyIEU9QVt2XTt2YXIgRz1FLmRzO3ZhciBCPUUudmFsdWU7dmFyIHk9RS50eXBlO3QrPVwiOlwiK0c7aWYoRyE9XCJwcm5cIiYmRyE9XCJ1dGY4XCImJkchPVwiaWE1XCIpe3JldHVyblwibWl4ZWRcIn1pZihHPT1cImlhNVwiKXtpZih5IT1cIkNOXCIpe3JldHVyblwibWl4ZWRcIn1lbHNle2lmKCFLSlVSLmxhbmcuU3RyaW5nLmlzTWFpbChCKSl7cmV0dXJuXCJtaXhlZFwifWVsc2V7Y29udGludWV9fX1pZih5PT1cIkNcIil7aWYoRz09XCJwcm5cIil7Y29udGludWV9ZWxzZXtyZXR1cm5cIm1peGVkXCJ9fXcrPVwiOlwiK0c7aWYoRj09bnVsbCl7Rj1HfWVsc2V7aWYoRiE9PUcpe3JldHVyblwibWl4ZWRcIn19fWlmKEY9PW51bGwpe3JldHVyblwicHJuXCJ9ZWxzZXtyZXR1cm4gRn19O3RoaXMuZ2V0WDUwME5hbWU9ZnVuY3Rpb24odil7dmFyIHQ9dGhpcy5nZXRYNTAwTmFtZUFycmF5KHYpO3ZhciB1PXRoaXMuZG5hcnJheXRvc3RyKHQpO3JldHVybnthcnJheTp0LHN0cjp1fX07dGhpcy5nZXRYNTAwTmFtZUFycmF5PWZ1bmN0aW9uKHYpe3ZhciBzPVtdO3ZhciB0PW4odiwwKTtmb3IodmFyIHU9MDt1PHQubGVuZ3RoO3UrKyl7cy5wdXNoKHRoaXMuZ2V0UkROKGIodix0W3VdKSkpfXJldHVybiBzfTt0aGlzLmdldFJETj1mdW5jdGlvbih2KXt2YXIgcz1bXTt2YXIgdD1uKHYsMCk7Zm9yKHZhciB1PTA7dTx0Lmxlbmd0aDt1Kyspe3MucHVzaCh0aGlzLmdldEF0dHJUeXBlQW5kVmFsdWUoYih2LHRbdV0pKSl9cmV0dXJuIHN9O3RoaXMuZ2V0QXR0clR5cGVBbmRWYWx1ZT1mdW5jdGlvbih1KXt2YXIgcz17dHlwZTpudWxsLHZhbHVlOm51bGwsZHM6bnVsbH07dmFyIHQ9bih1LDApO3ZhciB4PWModSx0WzBdLFtdLFwiMDZcIik7dmFyIHc9Yyh1LHRbMV0sW10pO3ZhciB2PUtKVVIuYXNuMS5BU04xVXRpbC5vaWRIZXhUb0ludCh4KTtzLnR5cGU9S0pVUi5hc24xLng1MDkuT0lELm9pZDJhdHlwZSh2KTtzLnZhbHVlPWhleHRvcnN0cih3KTtzLmRzPXRoaXMuSEVYMlNUQUdbdS5zdWJzdHIodFsxXSwyKV07cmV0dXJuIHN9O3RoaXMucmVhZENlcnRQRU09ZnVuY3Rpb24ocyl7dGhpcy5yZWFkQ2VydEhleChyKHMpKX07dGhpcy5yZWFkQ2VydEhleD1mdW5jdGlvbihzKXt0aGlzLmhleD1zO3RoaXMuZ2V0VmVyc2lvbigpO3RyeXtoKHRoaXMuaGV4LDAsWzAsN10sXCJhM1wiKTt0aGlzLnBhcnNlRXh0KCl9Y2F0Y2godCl7fX07dGhpcy5nZXRQYXJhbT1mdW5jdGlvbigpe3ZhciBzPXt9O3MudmVyc2lvbj10aGlzLmdldFZlcnNpb24oKTtzLnNlcmlhbD17aGV4OnRoaXMuZ2V0U2VyaWFsTnVtYmVySGV4KCl9O3Muc2lnYWxnPXRoaXMuZ2V0U2lnbmF0dXJlQWxnb3JpdGhtRmllbGQoKTtzLmlzc3Vlcj10aGlzLmdldElzc3VlcigpO3Mubm90YmVmb3JlPXRoaXMuZ2V0Tm90QmVmb3JlKCk7cy5ub3RhZnRlcj10aGlzLmdldE5vdEFmdGVyKCk7cy5zdWJqZWN0PXRoaXMuZ2V0U3ViamVjdCgpO3Muc2JqcHVia2V5PWhleHRvcGVtKHRoaXMuZ2V0UHVibGljS2V5SGV4KCksXCJQVUJMSUMgS0VZXCIpO2lmKHRoaXMuYUV4dEluZm8ubGVuZ3RoPjApe3MuZXh0PXRoaXMuZ2V0RXh0UGFyYW1BcnJheSgpfXMuc2lnaGV4PXRoaXMuZ2V0U2lnbmF0dXJlVmFsdWVIZXgoKTtyZXR1cm4gc307dGhpcy5nZXRFeHRQYXJhbUFycmF5PWZ1bmN0aW9uKHQpe2lmKHQ9PXVuZGVmaW5lZCl7dmFyIHY9ZSh0aGlzLmhleCwwLFswLFwiWzNdXCJdKTtpZih2IT0tMSl7dD1sKHRoaXMuaGV4LDAsWzAsXCJbM11cIiwwXSxcIjMwXCIpfX12YXIgcz1bXTt2YXIgdT1uKHQsMCk7Zm9yKHZhciB3PTA7dzx1Lmxlbmd0aDt3Kyspe3ZhciB5PWIodCx1W3ddKTt2YXIgeD10aGlzLmdldEV4dFBhcmFtKHkpO2lmKHghPW51bGwpe3MucHVzaCh4KX19cmV0dXJuIHN9O3RoaXMuZ2V0RXh0UGFyYW09ZnVuY3Rpb24odCl7dmFyIEE9e307dmFyIHY9bih0LDApO3ZhciB3PXYubGVuZ3RoO2lmKHchPTImJnchPTMpe3Rocm93IG5ldyBFcnJvcihcIndyb25nIG51bWJlciBlbGVtZW50cyBpbiBFeHRlbnNpb246IFwiK3crXCIgXCIrdCl9dmFyIHU9bShjKHQsMCxbMF0sXCIwNlwiKSk7dmFyIHk9ZmFsc2U7aWYodz09MyYmYSh0LDAsWzFdKT09XCIwMTAxZmZcIil7eT10cnVlfXZhciB6PWEodCwwLFt3LTEsMF0pO3ZhciB4PXVuZGVmaW5lZDtpZih1PT1cIjIuNS4yOS4xNFwiKXt4PXRoaXMuZ2V0RXh0U3ViamVjdEtleUlkZW50aWZpZXIoeix5KX1lbHNle2lmKHU9PVwiMi41LjI5LjE1XCIpe3g9dGhpcy5nZXRFeHRLZXlVc2FnZSh6LHkpfWVsc2V7aWYodT09XCIyLjUuMjkuMTdcIil7eD10aGlzLmdldEV4dFN1YmplY3RBbHROYW1lKHoseSl9ZWxzZXtpZih1PT1cIjIuNS4yOS4xOFwiKXt4PXRoaXMuZ2V0RXh0SXNzdWVyQWx0TmFtZSh6LHkpfWVsc2V7aWYodT09XCIyLjUuMjkuMTlcIil7eD10aGlzLmdldEV4dEJhc2ljQ29uc3RyYWludHMoeix5KX1lbHNle2lmKHU9PVwiMi41LjI5LjMxXCIpe3g9dGhpcy5nZXRFeHRDUkxEaXN0cmlidXRpb25Qb2ludHMoeix5KX1lbHNle2lmKHU9PVwiMi41LjI5LjMyXCIpe3g9dGhpcy5nZXRFeHRDZXJ0aWZpY2F0ZVBvbGljaWVzKHoseSl9ZWxzZXtpZih1PT1cIjIuNS4yOS4zNVwiKXt4PXRoaXMuZ2V0RXh0QXV0aG9yaXR5S2V5SWRlbnRpZmllcih6LHkpfWVsc2V7aWYodT09XCIyLjUuMjkuMzdcIil7eD10aGlzLmdldEV4dEV4dEtleVVzYWdlKHoseSl9ZWxzZXtpZih1PT1cIjEuMy42LjEuNS41LjcuMS4xXCIpe3g9dGhpcy5nZXRFeHRBdXRob3JpdHlJbmZvQWNjZXNzKHoseSl9ZWxzZXtpZih1PT1cIjIuNS4yOS4yMFwiKXt4PXRoaXMuZ2V0RXh0Q1JMTnVtYmVyKHoseSl9ZWxzZXtpZih1PT1cIjIuNS4yOS4yMVwiKXt4PXRoaXMuZ2V0RXh0Q1JMUmVhc29uKHoseSl9ZWxzZXtpZih1PT1cIjEuMy42LjEuNS41LjcuNDguMS4yXCIpe3g9dGhpcy5nZXRFeHRPY3NwTm9uY2Uoeix5KX1lbHNle2lmKHU9PVwiMS4zLjYuMS41LjUuNy40OC4xLjVcIil7eD10aGlzLmdldEV4dE9jc3BOb0NoZWNrKHoseSl9ZWxzZXtpZih1PT1cIjEuMi44NDAuMTEzNTgzLjEuMS45LjFcIil7eD10aGlzLmdldEV4dEFkb2JlVGltZVN0YW1wKHoseSl9fX19fX19fX19fX19fX1pZih4IT11bmRlZmluZWQpe3JldHVybiB4fXZhciBzPXtleHRuYW1lOnUsZXh0bjp6fTtpZih5KXtzLmNyaXRpY2FsPXRydWV9cmV0dXJuIHN9O3RoaXMuZmluZEV4dD1mdW5jdGlvbih0LHUpe2Zvcih2YXIgcz0wO3M8dC5sZW5ndGg7cysrKXtpZih0W3NdLmV4dG5hbWU9PXUpe3JldHVybiB0W3NdfX1yZXR1cm4gbnVsbH07dGhpcy51cGRhdGVFeHRDRFBGdWxsVVJJPWZ1bmN0aW9uKHcscyl7dmFyIHY9dGhpcy5maW5kRXh0KHcsXCJjUkxEaXN0cmlidXRpb25Qb2ludHNcIik7aWYodj09bnVsbCl7cmV0dXJufWlmKHYuYXJyYXk9PXVuZGVmaW5lZCl7cmV0dXJufXZhciB5PXYuYXJyYXk7Zm9yKHZhciB1PTA7dTx5Lmxlbmd0aDt1Kyspe2lmKHlbdV0uZHBuYW1lPT11bmRlZmluZWQpe2NvbnRpbnVlfWlmKHlbdV0uZHBuYW1lLmZ1bGw9PXVuZGVmaW5lZCl7Y29udGludWV9dmFyIHo9eVt1XS5kcG5hbWUuZnVsbDtmb3IodmFyIHQ9MDt0PHoubGVuZ3RoO3QrKyl7dmFyIHg9elt1XTtpZih4LnVyaT09dW5kZWZpbmVkKXtjb250aW51ZX14LnVyaT1zfX19O3RoaXMudXBkYXRlRXh0QUlBT0NTUD1mdW5jdGlvbih3LHQpe3ZhciB2PXRoaXMuZmluZEV4dCh3LFwiYXV0aG9yaXR5SW5mb0FjY2Vzc1wiKTtpZih2PT1udWxsKXtyZXR1cm59aWYodi5hcnJheT09dW5kZWZpbmVkKXtyZXR1cm59dmFyIHM9di5hcnJheTtmb3IodmFyIHU9MDt1PHMubGVuZ3RoO3UrKyl7aWYoc1t1XS5vY3NwIT11bmRlZmluZWQpe3NbdV0ub2NzcD10fX19O3RoaXMudXBkYXRlRXh0QUlBQ0FJc3N1ZXI9ZnVuY3Rpb24odyx0KXt2YXIgdj10aGlzLmZpbmRFeHQodyxcImF1dGhvcml0eUluZm9BY2Nlc3NcIik7aWYodj09bnVsbCl7cmV0dXJufWlmKHYuYXJyYXk9PXVuZGVmaW5lZCl7cmV0dXJufXZhciBzPXYuYXJyYXk7Zm9yKHZhciB1PTA7dTxzLmxlbmd0aDt1Kyspe2lmKHNbdV0uY2Fpc3N1ZXIhPXVuZGVmaW5lZCl7c1t1XS5jYWlzc3Vlcj10fX19O3RoaXMuZG5hcnJheXRvc3RyPWZ1bmN0aW9uKHUpe2Z1bmN0aW9uIHModil7cmV0dXJuIHYubWFwKGZ1bmN0aW9uKHcpe3JldHVybiB0KHcpfSkuam9pbihcIitcIil9ZnVuY3Rpb24gdCh2KXtyZXR1cm4gdi50eXBlK1wiPVwiK3YudmFsdWV9cmV0dXJuXCIvXCIrdS5tYXAoZnVuY3Rpb24odil7cmV0dXJuIHModil9KS5qb2luKFwiL1wiKX07dGhpcy5nZXRJbmZvPWZ1bmN0aW9uKCl7dmFyIHU9ZnVuY3Rpb24oTSl7dmFyIEw9SlNPTi5zdHJpbmdpZnkoTS5hcnJheSkucmVwbGFjZSgvW1xcW1xcXVxce1xcfVxcXCJdL2csXCJcIik7cmV0dXJuIEx9O3ZhciBBPWZ1bmN0aW9uKFIpe3ZhciBQPVwiXCI7dmFyIEw9Ui5hcnJheTtmb3IodmFyIE89MDtPPEwubGVuZ3RoO08rKyl7dmFyIFE9TFtPXTtQKz1cIiAgICBwb2xpY3kgb2lkOiBcIitRLnBvbGljeW9pZCtcIlxcblwiO2lmKFEuYXJyYXk9PT11bmRlZmluZWQpe2NvbnRpbnVlfWZvcih2YXIgTj0wO048US5hcnJheS5sZW5ndGg7TisrKXt2YXIgTT1RLmFycmF5W05dO2lmKE0uY3BzIT09dW5kZWZpbmVkKXtQKz1cIiAgICBjcHM6IFwiK00uY3BzK1wiXFxuXCJ9fX1yZXR1cm4gUH07dmFyIEQ9ZnVuY3Rpb24oUCl7dmFyIE89XCJcIjt2YXIgTD1QLmFycmF5O2Zvcih2YXIgTj0wO048TC5sZW5ndGg7TisrKXt2YXIgUT1MW05dO3RyeXtpZihRLmRwbmFtZS5mdWxsWzBdLnVyaSE9PXVuZGVmaW5lZCl7Tys9XCIgICAgXCIrUS5kcG5hbWUuZnVsbFswXS51cmkrXCJcXG5cIn19Y2F0Y2goTSl7fXRyeXtpZihRLmRuYW1lLmZ1bGxbMF0uZG4uaGV4IT09dW5kZWZpbmVkKXtPKz1cIiAgICBcIitYNTA5LmhleDJkbihRLmRwbmFtZS5mdWxsWzBdLmRuLmhleCkrXCJcXG5cIn19Y2F0Y2goTSl7fX1yZXR1cm4gT307dmFyIEI9ZnVuY3Rpb24oUCl7dmFyIE89XCJcIjt2YXIgTD1QLmFycmF5O2Zvcih2YXIgTT0wO008TC5sZW5ndGg7TSsrKXt2YXIgTj1MW01dO2lmKE4uY2Fpc3N1ZXIhPT11bmRlZmluZWQpe08rPVwiICAgIGNhaXNzdWVyOiBcIitOLmNhaXNzdWVyK1wiXFxuXCJ9aWYoTi5vY3NwIT09dW5kZWZpbmVkKXtPKz1cIiAgICBvY3NwOiBcIitOLm9jc3ArXCJcXG5cIn19cmV0dXJuIE99O3ZhciB2PVg1MDk7dmFyIEYsRSxLO0Y9XCJCYXNpYyBGaWVsZHNcXG5cIjtGKz1cIiAgc2VyaWFsIG51bWJlcjogXCIrdGhpcy5nZXRTZXJpYWxOdW1iZXJIZXgoKStcIlxcblwiO0YrPVwiICBzaWduYXR1cmUgYWxnb3JpdGhtOiBcIit0aGlzLmdldFNpZ25hdHVyZUFsZ29yaXRobUZpZWxkKCkrXCJcXG5cIjtGKz1cIiAgaXNzdWVyOiBcIit0aGlzLmdldElzc3VlclN0cmluZygpK1wiXFxuXCI7Ris9XCIgIG5vdEJlZm9yZTogXCIrdGhpcy5nZXROb3RCZWZvcmUoKStcIlxcblwiO0YrPVwiICBub3RBZnRlcjogXCIrdGhpcy5nZXROb3RBZnRlcigpK1wiXFxuXCI7Ris9XCIgIHN1YmplY3Q6IFwiK3RoaXMuZ2V0U3ViamVjdFN0cmluZygpK1wiXFxuXCI7Ris9XCIgIHN1YmplY3QgcHVibGljIGtleSBpbmZvOiBcXG5cIjtFPXRoaXMuZ2V0UHVibGljS2V5KCk7Ris9XCIgICAga2V5IGFsZ29yaXRobTogXCIrRS50eXBlK1wiXFxuXCI7aWYoRS50eXBlPT09XCJSU0FcIil7Ris9XCIgICAgbj1cIitoZXh0b3Bvc2hleChFLm4udG9TdHJpbmcoMTYpKS5zdWJzdHIoMCwxNikrXCIuLi5cXG5cIjtGKz1cIiAgICBlPVwiK2hleHRvcG9zaGV4KEUuZS50b1N0cmluZygxNikpK1wiXFxuXCJ9Sz10aGlzLmFFeHRJbmZvO2lmKEshPT11bmRlZmluZWQmJkshPT1udWxsKXtGKz1cIlg1MDl2MyBFeHRlbnNpb25zOlxcblwiO2Zvcih2YXIgSD0wO0g8Sy5sZW5ndGg7SCsrKXt2YXIgSj1LW0hdO3ZhciB0PUtKVVIuYXNuMS54NTA5Lk9JRC5vaWQybmFtZShKLm9pZCk7aWYodD09PVwiXCIpe3Q9Si5vaWR9dmFyIEc9XCJcIjtpZihKLmNyaXRpY2FsPT09dHJ1ZSl7Rz1cIkNSSVRJQ0FMXCJ9Ris9XCIgIFwiK3QrXCIgXCIrRytcIjpcXG5cIjtpZih0PT09XCJiYXNpY0NvbnN0cmFpbnRzXCIpe3ZhciB3PXRoaXMuZ2V0RXh0QmFzaWNDb25zdHJhaW50cygpO2lmKHcuY0E9PT11bmRlZmluZWQpe0YrPVwiICAgIHt9XFxuXCJ9ZWxzZXtGKz1cIiAgICBjQT10cnVlXCI7aWYody5wYXRoTGVuIT09dW5kZWZpbmVkKXtGKz1cIiwgcGF0aExlbj1cIit3LnBhdGhMZW59Ris9XCJcXG5cIn19ZWxzZXtpZih0PT09XCJrZXlVc2FnZVwiKXtGKz1cIiAgICBcIit0aGlzLmdldEV4dEtleVVzYWdlU3RyaW5nKCkrXCJcXG5cIn1lbHNle2lmKHQ9PT1cInN1YmplY3RLZXlJZGVudGlmaWVyXCIpe0YrPVwiICAgIFwiK3RoaXMuZ2V0RXh0U3ViamVjdEtleUlkZW50aWZpZXIoKS5raWQuaGV4K1wiXFxuXCJ9ZWxzZXtpZih0PT09XCJhdXRob3JpdHlLZXlJZGVudGlmaWVyXCIpe3ZhciB4PXRoaXMuZ2V0RXh0QXV0aG9yaXR5S2V5SWRlbnRpZmllcigpO2lmKHgua2lkIT09dW5kZWZpbmVkKXtGKz1cIiAgICBraWQ9XCIreC5raWQuaGV4K1wiXFxuXCJ9fWVsc2V7aWYodD09PVwiZXh0S2V5VXNhZ2VcIil7dmFyIEk9dGhpcy5nZXRFeHRFeHRLZXlVc2FnZSgpLmFycmF5O0YrPVwiICAgIFwiK0kuam9pbihcIiwgXCIpK1wiXFxuXCJ9ZWxzZXtpZih0PT09XCJzdWJqZWN0QWx0TmFtZVwiKXt2YXIgeT11KHRoaXMuZ2V0RXh0U3ViamVjdEFsdE5hbWUoKSk7Ris9XCIgICAgXCIreStcIlxcblwifWVsc2V7aWYodD09PVwiY1JMRGlzdHJpYnV0aW9uUG9pbnRzXCIpe3ZhciBDPXRoaXMuZ2V0RXh0Q1JMRGlzdHJpYnV0aW9uUG9pbnRzKCk7Ris9RChDKX1lbHNle2lmKHQ9PT1cImF1dGhvcml0eUluZm9BY2Nlc3NcIil7dmFyIHo9dGhpcy5nZXRFeHRBdXRob3JpdHlJbmZvQWNjZXNzKCk7Ris9Qih6KX1lbHNle2lmKHQ9PT1cImNlcnRpZmljYXRlUG9saWNpZXNcIil7Ris9QSh0aGlzLmdldEV4dENlcnRpZmljYXRlUG9saWNpZXMoKSl9fX19fX19fX19fUYrPVwic2lnbmF0dXJlIGFsZ29yaXRobTogXCIrdGhpcy5nZXRTaWduYXR1cmVBbGdvcml0aG1OYW1lKCkrXCJcXG5cIjtGKz1cInNpZ25hdHVyZTogXCIrdGhpcy5nZXRTaWduYXR1cmVWYWx1ZUhleCgpLnN1YnN0cigwLDE2KStcIi4uLlxcblwiO3JldHVybiBGfTtpZih0eXBlb2YgcT09XCJzdHJpbmdcIil7aWYocS5pbmRleE9mKFwiLS0tLS1CRUdJTlwiKSE9LTEpe3RoaXMucmVhZENlcnRQRU0ocSl9ZWxzZXtpZihLSlVSLmxhbmcuU3RyaW5nLmlzSGV4KHEpKXt0aGlzLnJlYWRDZXJ0SGV4KHEpfX19fVg1MDkuaGV4MmRuPWZ1bmN0aW9uKGYsYil7aWYoYj09PXVuZGVmaW5lZCl7Yj0wfWlmKGYuc3Vic3RyKGIsMikhPT1cIjMwXCIpe3Rocm93IG5ldyBFcnJvcihcIm1hbGZvcm1lZCBETlwiKX12YXIgYz1uZXcgQXJyYXkoKTt2YXIgZD1BU04xSEVYLmdldENoaWxkSWR4KGYsYik7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspe2MucHVzaChYNTA5LmhleDJyZG4oZixkW2VdKSl9Yz1jLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKFwiL1wiLFwiXFxcXC9cIil9KTtyZXR1cm5cIi9cIitjLmpvaW4oXCIvXCIpfTtYNTA5LmhleDJyZG49ZnVuY3Rpb24oZixiKXtpZihiPT09dW5kZWZpbmVkKXtiPTB9aWYoZi5zdWJzdHIoYiwyKSE9PVwiMzFcIil7dGhyb3cgbmV3IEVycm9yKFwibWFsZm9ybWVkIFJETlwiKX12YXIgYz1uZXcgQXJyYXkoKTt2YXIgZD1BU04xSEVYLmdldENoaWxkSWR4KGYsYik7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspe2MucHVzaChYNTA5LmhleDJhdHRyVHlwZVZhbHVlKGYsZFtlXSkpfWM9Yy5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZShcIitcIixcIlxcXFwrXCIpfSk7cmV0dXJuIGMuam9pbihcIitcIil9O1g1MDkuaGV4MmF0dHJUeXBlVmFsdWU9ZnVuY3Rpb24oZCxpKXt2YXIgaj1BU04xSEVYO3ZhciBoPWouZ2V0VjtpZihpPT09dW5kZWZpbmVkKXtpPTB9aWYoZC5zdWJzdHIoaSwyKSE9PVwiMzBcIil7dGhyb3cgbmV3IEVycm9yKFwibWFsZm9ybWVkIGF0dHJpYnV0ZSB0eXBlIGFuZCB2YWx1ZVwiKX12YXIgZz1qLmdldENoaWxkSWR4KGQsaSk7aWYoZy5sZW5ndGghPT0yfHxkLnN1YnN0cihnWzBdLDIpIT09XCIwNlwiKXtcIm1hbGZvcm1lZCBhdHRyaWJ1dGUgdHlwZSBhbmQgdmFsdWVcIn12YXIgYj1oKGQsZ1swXSk7dmFyIGY9S0pVUi5hc24xLkFTTjFVdGlsLm9pZEhleFRvSW50KGIpO3ZhciBlPUtKVVIuYXNuMS54NTA5Lk9JRC5vaWQyYXR5cGUoZik7dmFyIGE9aChkLGdbMV0pO3ZhciBjPWhleHRvcnN0cihhKTtyZXR1cm4gZStcIj1cIitjfTtYNTA5LmdldFB1YmxpY0tleUZyb21DZXJ0SGV4PWZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBYNTA5KCk7YS5yZWFkQ2VydEhleChiKTtyZXR1cm4gYS5nZXRQdWJsaWNLZXkoKX07WDUwOS5nZXRQdWJsaWNLZXlGcm9tQ2VydFBFTT1mdW5jdGlvbihiKXt2YXIgYT1uZXcgWDUwOSgpO2EucmVhZENlcnRQRU0oYik7cmV0dXJuIGEuZ2V0UHVibGljS2V5KCl9O1g1MDkuZ2V0UHVibGljS2V5SW5mb1Byb3BPZkNlcnRQRU09ZnVuY3Rpb24oYyl7dmFyIGU9QVNOMUhFWDt2YXIgZz1lLmdldFZieUxpc3Q7dmFyIGI9e307dmFyIGEsZixkO2IuYWxncGFyYW09bnVsbDthPW5ldyBYNTA5KCk7YS5yZWFkQ2VydFBFTShjKTtmPWEuZ2V0UHVibGljS2V5SGV4KCk7Yi5rZXloZXg9ZyhmLDAsWzFdLFwiMDNcIikuc3Vic3RyKDIpO2IuYWxnb2lkPWcoZiwwLFswLDBdLFwiMDZcIik7aWYoYi5hbGdvaWQ9PT1cIjJhODY0OGNlM2QwMjAxXCIpe2IuYWxncGFyYW09ZyhmLDAsWzAsMV0sXCIwNlwiKX1yZXR1cm4gYn07WDUwOS5LRVlVU0FHRV9OQU1FPVtcImRpZ2l0YWxTaWduYXR1cmVcIixcIm5vblJlcHVkaWF0aW9uXCIsXCJrZXlFbmNpcGhlcm1lbnRcIixcImRhdGFFbmNpcGhlcm1lbnRcIixcImtleUFncmVlbWVudFwiLFwia2V5Q2VydFNpZ25cIixcImNSTFNpZ25cIixcImVuY2lwaGVyT25seVwiLFwiZGVjaXBoZXJPbmx5XCJdO1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmp3cz09XCJ1bmRlZmluZWRcInx8IUtKVVIuandzKXtLSlVSLmp3cz17fX1LSlVSLmp3cy5KV1M9ZnVuY3Rpb24oKXt2YXIgYj1LSlVSLGE9Yi5qd3MuSldTLGM9YS5pc1NhZmVKU09OU3RyaW5nO3RoaXMucGFyc2VKV1M9ZnVuY3Rpb24oZyxqKXtpZigodGhpcy5wYXJzZWRKV1MhPT11bmRlZmluZWQpJiYoanx8KHRoaXMucGFyc2VkSldTLnNpZ3ZhbEghPT11bmRlZmluZWQpKSl7cmV0dXJufXZhciBpPWcubWF0Y2goL14oW14uXSspXFwuKFteLl0rKVxcLihbXi5dKykkLyk7aWYoaT09bnVsbCl7dGhyb3dcIkpXUyBzaWduYXR1cmUgaXMgbm90IGEgZm9ybSBvZiAnSGVhZC5QYXlsb2FkLlNpZ1ZhbHVlJy5cIn12YXIgaz1pWzFdO3ZhciBlPWlbMl07dmFyIGw9aVszXTt2YXIgbj1rK1wiLlwiK2U7dGhpcy5wYXJzZWRKV1M9e307dGhpcy5wYXJzZWRKV1MuaGVhZEI2NFU9azt0aGlzLnBhcnNlZEpXUy5wYXlsb2FkQjY0VT1lO3RoaXMucGFyc2VkSldTLnNpZ3ZhbEI2NFU9bDt0aGlzLnBhcnNlZEpXUy5zaT1uO2lmKCFqKXt2YXIgaD1iNjR1dG9oZXgobCk7dmFyIGY9cGFyc2VCaWdJbnQoaCwxNik7dGhpcy5wYXJzZWRKV1Muc2lndmFsSD1oO3RoaXMucGFyc2VkSldTLnNpZ3ZhbEJJPWZ9dmFyIGQ9YjY0dXRvdXRmOChrKTt2YXIgbT1iNjR1dG91dGY4KGUpO3RoaXMucGFyc2VkSldTLmhlYWRTPWQ7dGhpcy5wYXJzZWRKV1MucGF5bG9hZFM9bTtpZighYyhkLHRoaXMucGFyc2VkSldTLFwiaGVhZFBcIikpe3Rocm93XCJtYWxmb3JtZWQgSlNPTiBzdHJpbmcgZm9yIEpXUyBIZWFkOiBcIitkfX19O0tKVVIuandzLkpXUy5zaWduPWZ1bmN0aW9uKGosdyx6LEEsYSl7dmFyIHg9S0pVUixuPXguandzLHI9bi5KV1MsaD1yLnJlYWRTYWZlSlNPTlN0cmluZyxxPXIuaXNTYWZlSlNPTlN0cmluZyxkPXguY3J5cHRvLGw9ZC5FQ0RTQSxwPWQuTWFjLGM9ZC5TaWduYXR1cmUsdT1KU09OO3ZhciB0LGssbztpZih0eXBlb2YgdyE9XCJzdHJpbmdcIiYmdHlwZW9mIHchPVwib2JqZWN0XCIpe3Rocm93XCJzcEhlYWRlciBtdXN0IGJlIEpTT04gc3RyaW5nIG9yIG9iamVjdDogXCIrd31pZih0eXBlb2Ygdz09XCJvYmplY3RcIil7az13O3Q9dS5zdHJpbmdpZnkoayl9aWYodHlwZW9mIHc9PVwic3RyaW5nXCIpe3Q9dztpZighcSh0KSl7dGhyb3dcIkpXUyBIZWFkIGlzIG5vdCBzYWZlIEpTT04gc3RyaW5nOiBcIit0fWs9aCh0KX1vPXo7aWYodHlwZW9mIHo9PVwib2JqZWN0XCIpe289dS5zdHJpbmdpZnkoeil9aWYoKGo9PVwiXCJ8fGo9PW51bGwpJiZrLmFsZyE9PXVuZGVmaW5lZCl7aj1rLmFsZ31pZigoaiE9XCJcIiYmaiE9bnVsbCkmJmsuYWxnPT09dW5kZWZpbmVkKXtrLmFsZz1qO3Q9dS5zdHJpbmdpZnkoayl9aWYoaiE9PWsuYWxnKXt0aHJvd1wiYWxnIGFuZCBzSGVhZGVyLmFsZyBkb2Vzbid0IG1hdGNoOiBcIitqK1wiIT1cIitrLmFsZ312YXIgcz1udWxsO2lmKHIuandzYWxnMnNpZ2FsZ1tqXT09PXVuZGVmaW5lZCl7dGhyb3dcInVuc3VwcG9ydGVkIGFsZyBuYW1lOiBcIitqfWVsc2V7cz1yLmp3c2FsZzJzaWdhbGdbal19dmFyIGU9dXRmOHRvYjY0dSh0KTt2YXIgbT11dGY4dG9iNjR1KG8pO3ZhciBiPWUrXCIuXCIrbTt2YXIgeT1cIlwiO2lmKHMuc3Vic3RyKDAsNCk9PVwiSG1hY1wiKXtpZihBPT09dW5kZWZpbmVkKXt0aHJvd1wibWFjIGtleSBzaGFsbCBiZSBzcGVjaWZpZWQgZm9yIEhTKiBhbGdcIn12YXIgaT1uZXcgcCh7YWxnOnMscHJvdjpcImNyeXB0b2pzXCIscGFzczpBfSk7aS51cGRhdGVTdHJpbmcoYik7eT1pLmRvRmluYWwoKX1lbHNle2lmKHMuaW5kZXhPZihcIndpdGhFQ0RTQVwiKSE9LTEpe3ZhciBmPW5ldyBjKHthbGc6c30pO2YuaW5pdChBLGEpO2YudXBkYXRlU3RyaW5nKGIpO3ZhciBnPWYuc2lnbigpO3k9S0pVUi5jcnlwdG8uRUNEU0EuYXNuMVNpZ1RvQ29uY2F0U2lnKGcpfWVsc2V7aWYocyE9XCJub25lXCIpe3ZhciBmPW5ldyBjKHthbGc6c30pO2YuaW5pdChBLGEpO2YudXBkYXRlU3RyaW5nKGIpO3k9Zi5zaWduKCl9fX12YXIgdj1oZXh0b2I2NHUoeSk7cmV0dXJuIGIrXCIuXCIrdn07S0pVUi5qd3MuSldTLnZlcmlmeT1mdW5jdGlvbih3LEIsbil7dmFyIHg9S0pVUixxPXguandzLHQ9cS5KV1MsaT10LnJlYWRTYWZlSlNPTlN0cmluZyxlPXguY3J5cHRvLHA9ZS5FQ0RTQSxzPWUuTWFjLGQ9ZS5TaWduYXR1cmUsbTtpZih0eXBlb2YgUlNBS2V5IT09dW5kZWZpbmVkKXttPVJTQUtleX12YXIgeT13LnNwbGl0KFwiLlwiKTtpZih5Lmxlbmd0aCE9PTMpe3JldHVybiBmYWxzZX12YXIgZj15WzBdO3ZhciByPXlbMV07dmFyIGM9ZitcIi5cIityO3ZhciBBPWI2NHV0b2hleCh5WzJdKTt2YXIgbD1pKGI2NHV0b3V0ZjgoeVswXSkpO3ZhciBrPW51bGw7dmFyIHo9bnVsbDtpZihsLmFsZz09PXVuZGVmaW5lZCl7dGhyb3dcImFsZ29yaXRobSBub3Qgc3BlY2lmaWVkIGluIGhlYWRlclwifWVsc2V7az1sLmFsZzt6PWsuc3Vic3RyKDAsMil9aWYobiE9bnVsbCYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG4pPT09XCJbb2JqZWN0IEFycmF5XVwiJiZuLmxlbmd0aD4wKXt2YXIgYj1cIjpcIituLmpvaW4oXCI6XCIpK1wiOlwiO2lmKGIuaW5kZXhPZihcIjpcIitrK1wiOlwiKT09LTEpe3Rocm93XCJhbGdvcml0aG0gJ1wiK2srXCInIG5vdCBhY2NlcHRlZCBpbiB0aGUgbGlzdFwifX1pZihrIT1cIm5vbmVcIiYmQj09PW51bGwpe3Rocm93XCJrZXkgc2hhbGwgYmUgc3BlY2lmaWVkIHRvIHZlcmlmeS5cIn1pZih0eXBlb2YgQj09XCJzdHJpbmdcIiYmQi5pbmRleE9mKFwiLS0tLS1CRUdJTiBcIikhPS0xKXtCPUtFWVVUSUwuZ2V0S2V5KEIpfWlmKHo9PVwiUlNcInx8ej09XCJQU1wiKXtpZighKEIgaW5zdGFuY2VvZiBtKSl7dGhyb3dcImtleSBzaGFsbCBiZSBhIFJTQUtleSBvYmogZm9yIFJTKiBhbmQgUFMqIGFsZ3NcIn19aWYoej09XCJFU1wiKXtpZighKEIgaW5zdGFuY2VvZiBwKSl7dGhyb3dcImtleSBzaGFsbCBiZSBhIEVDRFNBIG9iaiBmb3IgRVMqIGFsZ3NcIn19aWYoaz09XCJub25lXCIpe312YXIgdT1udWxsO2lmKHQuandzYWxnMnNpZ2FsZ1tsLmFsZ109PT11bmRlZmluZWQpe3Rocm93XCJ1bnN1cHBvcnRlZCBhbGcgbmFtZTogXCIra31lbHNle3U9dC5qd3NhbGcyc2lnYWxnW2tdfWlmKHU9PVwibm9uZVwiKXt0aHJvd1wibm90IHN1cHBvcnRlZFwifWVsc2V7aWYodS5zdWJzdHIoMCw0KT09XCJIbWFjXCIpe3ZhciBvPW51bGw7aWYoQj09PXVuZGVmaW5lZCl7dGhyb3dcImhleGFkZWNpbWFsIGtleSBzaGFsbCBiZSBzcGVjaWZpZWQgZm9yIEhNQUNcIn12YXIgaj1uZXcgcyh7YWxnOnUscGFzczpCfSk7ai51cGRhdGVTdHJpbmcoYyk7bz1qLmRvRmluYWwoKTtyZXR1cm4gQT09b31lbHNle2lmKHUuaW5kZXhPZihcIndpdGhFQ0RTQVwiKSE9LTEpe3ZhciBoPW51bGw7dHJ5e2g9cC5jb25jYXRTaWdUb0FTTjFTaWcoQSl9Y2F0Y2godil7cmV0dXJuIGZhbHNlfXZhciBnPW5ldyBkKHthbGc6dX0pO2cuaW5pdChCKTtnLnVwZGF0ZVN0cmluZyhjKTtyZXR1cm4gZy52ZXJpZnkoaCl9ZWxzZXt2YXIgZz1uZXcgZCh7YWxnOnV9KTtnLmluaXQoQik7Zy51cGRhdGVTdHJpbmcoYyk7cmV0dXJuIGcudmVyaWZ5KEEpfX19fTtLSlVSLmp3cy5KV1MucGFyc2U9ZnVuY3Rpb24oZyl7dmFyIGM9Zy5zcGxpdChcIi5cIik7dmFyIGI9e307dmFyIGYsZSxkO2lmKGMubGVuZ3RoIT0yJiZjLmxlbmd0aCE9Myl7dGhyb3dcIm1hbGZvcm1lZCBzSldTOiB3cm9uZyBudW1iZXIgb2YgJy4nIHNwbGl0dGVkIGVsZW1lbnRzXCJ9Zj1jWzBdO2U9Y1sxXTtpZihjLmxlbmd0aD09Myl7ZD1jWzJdfWIuaGVhZGVyT2JqPUtKVVIuandzLkpXUy5yZWFkU2FmZUpTT05TdHJpbmcoYjY0dXRvdXRmOChmKSk7Yi5wYXlsb2FkT2JqPUtKVVIuandzLkpXUy5yZWFkU2FmZUpTT05TdHJpbmcoYjY0dXRvdXRmOChlKSk7Yi5oZWFkZXJQUD1KU09OLnN0cmluZ2lmeShiLmhlYWRlck9iaixudWxsLFwiICBcIik7aWYoYi5wYXlsb2FkT2JqPT1udWxsKXtiLnBheWxvYWRQUD1iNjR1dG91dGY4KGUpfWVsc2V7Yi5wYXlsb2FkUFA9SlNPTi5zdHJpbmdpZnkoYi5wYXlsb2FkT2JqLG51bGwsXCIgIFwiKX1pZihkIT09dW5kZWZpbmVkKXtiLnNpZ0hleD1iNjR1dG9oZXgoZCl9cmV0dXJuIGJ9O0tKVVIuandzLkpXUy52ZXJpZnlKV1Q9ZnVuY3Rpb24oZSxsLHIpe3ZhciBkPUtKVVIsaj1kLmp3cyxvPWouSldTLG49by5yZWFkU2FmZUpTT05TdHJpbmcscD1vLmluQXJyYXksZj1vLmluY2x1ZGVkQXJyYXk7dmFyIGs9ZS5zcGxpdChcIi5cIik7dmFyIGM9a1swXTt2YXIgaT1rWzFdO3ZhciBxPWMrXCIuXCIraTt2YXIgbT1iNjR1dG9oZXgoa1syXSk7dmFyIGg9bihiNjR1dG91dGY4KGMpKTt2YXIgZz1uKGI2NHV0b3V0ZjgoaSkpO2lmKGguYWxnPT09dW5kZWZpbmVkKXtyZXR1cm4gZmFsc2V9aWYoci5hbGc9PT11bmRlZmluZWQpe3Rocm93XCJhY2NlcHRGaWVsZC5hbGcgc2hhbGwgYmUgc3BlY2lmaWVkXCJ9aWYoIXAoaC5hbGcsci5hbGcpKXtyZXR1cm4gZmFsc2V9aWYoZy5pc3MhPT11bmRlZmluZWQmJnR5cGVvZiByLmlzcz09PVwib2JqZWN0XCIpe2lmKCFwKGcuaXNzLHIuaXNzKSl7cmV0dXJuIGZhbHNlfX1pZihnLnN1YiE9PXVuZGVmaW5lZCYmdHlwZW9mIHIuc3ViPT09XCJvYmplY3RcIil7aWYoIXAoZy5zdWIsci5zdWIpKXtyZXR1cm4gZmFsc2V9fWlmKGcuYXVkIT09dW5kZWZpbmVkJiZ0eXBlb2Ygci5hdWQ9PT1cIm9iamVjdFwiKXtpZih0eXBlb2YgZy5hdWQ9PVwic3RyaW5nXCIpe2lmKCFwKGcuYXVkLHIuYXVkKSl7cmV0dXJuIGZhbHNlfX1lbHNle2lmKHR5cGVvZiBnLmF1ZD09XCJvYmplY3RcIil7aWYoIWYoZy5hdWQsci5hdWQpKXtyZXR1cm4gZmFsc2V9fX19dmFyIGI9ai5JbnREYXRlLmdldE5vdygpO2lmKHIudmVyaWZ5QXQhPT11bmRlZmluZWQmJnR5cGVvZiByLnZlcmlmeUF0PT09XCJudW1iZXJcIil7Yj1yLnZlcmlmeUF0fWlmKHIuZ3JhY2VQZXJpb2Q9PT11bmRlZmluZWR8fHR5cGVvZiByLmdyYWNlUGVyaW9kIT09XCJudW1iZXJcIil7ci5ncmFjZVBlcmlvZD0wfWlmKGcuZXhwIT09dW5kZWZpbmVkJiZ0eXBlb2YgZy5leHA9PVwibnVtYmVyXCIpe2lmKGcuZXhwK3IuZ3JhY2VQZXJpb2Q8Yil7cmV0dXJuIGZhbHNlfX1pZihnLm5iZiE9PXVuZGVmaW5lZCYmdHlwZW9mIGcubmJmPT1cIm51bWJlclwiKXtpZihiPGcubmJmLXIuZ3JhY2VQZXJpb2Qpe3JldHVybiBmYWxzZX19aWYoZy5pYXQhPT11bmRlZmluZWQmJnR5cGVvZiBnLmlhdD09XCJudW1iZXJcIil7aWYoYjxnLmlhdC1yLmdyYWNlUGVyaW9kKXtyZXR1cm4gZmFsc2V9fWlmKGcuanRpIT09dW5kZWZpbmVkJiZyLmp0aSE9PXVuZGVmaW5lZCl7aWYoZy5qdGkhPT1yLmp0aSl7cmV0dXJuIGZhbHNlfX1pZighby52ZXJpZnkoZSxsLHIuYWxnKSl7cmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfTtLSlVSLmp3cy5KV1MuaW5jbHVkZWRBcnJheT1mdW5jdGlvbihiLGEpe3ZhciBjPUtKVVIuandzLkpXUy5pbkFycmF5O2lmKGI9PT1udWxsKXtyZXR1cm4gZmFsc2V9aWYodHlwZW9mIGIhPT1cIm9iamVjdFwiKXtyZXR1cm4gZmFsc2V9aWYodHlwZW9mIGIubGVuZ3RoIT09XCJudW1iZXJcIil7cmV0dXJuIGZhbHNlfWZvcih2YXIgZD0wO2Q8Yi5sZW5ndGg7ZCsrKXtpZighYyhiW2RdLGEpKXtyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfTtLSlVSLmp3cy5KV1MuaW5BcnJheT1mdW5jdGlvbihkLGIpe2lmKGI9PT1udWxsKXtyZXR1cm4gZmFsc2V9aWYodHlwZW9mIGIhPT1cIm9iamVjdFwiKXtyZXR1cm4gZmFsc2V9aWYodHlwZW9mIGIubGVuZ3RoIT09XCJudW1iZXJcIil7cmV0dXJuIGZhbHNlfWZvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXtpZihiW2NdPT1kKXtyZXR1cm4gdHJ1ZX19cmV0dXJuIGZhbHNlfTtLSlVSLmp3cy5KV1MuandzYWxnMnNpZ2FsZz17SFMyNTY6XCJIbWFjU0hBMjU2XCIsSFMzODQ6XCJIbWFjU0hBMzg0XCIsSFM1MTI6XCJIbWFjU0hBNTEyXCIsUlMyNTY6XCJTSEEyNTZ3aXRoUlNBXCIsUlMzODQ6XCJTSEEzODR3aXRoUlNBXCIsUlM1MTI6XCJTSEE1MTJ3aXRoUlNBXCIsRVMyNTY6XCJTSEEyNTZ3aXRoRUNEU0FcIixFUzM4NDpcIlNIQTM4NHdpdGhFQ0RTQVwiLFBTMjU2OlwiU0hBMjU2d2l0aFJTQWFuZE1HRjFcIixQUzM4NDpcIlNIQTM4NHdpdGhSU0FhbmRNR0YxXCIsUFM1MTI6XCJTSEE1MTJ3aXRoUlNBYW5kTUdGMVwiLG5vbmU6XCJub25lXCIsfTtLSlVSLmp3cy5KV1MuaXNTYWZlSlNPTlN0cmluZz1mdW5jdGlvbihjLGIsZCl7dmFyIGU9bnVsbDt0cnl7ZT1qc29uUGFyc2UoYyk7aWYodHlwZW9mIGUhPVwib2JqZWN0XCIpe3JldHVybiAwfWlmKGUuY29uc3RydWN0b3I9PT1BcnJheSl7cmV0dXJuIDB9aWYoYil7YltkXT1lfXJldHVybiAxfWNhdGNoKGEpe3JldHVybiAwfX07S0pVUi5qd3MuSldTLnJlYWRTYWZlSlNPTlN0cmluZz1mdW5jdGlvbihiKXt2YXIgYz1udWxsO3RyeXtjPWpzb25QYXJzZShiKTtpZih0eXBlb2YgYyE9XCJvYmplY3RcIil7cmV0dXJuIG51bGx9aWYoYy5jb25zdHJ1Y3Rvcj09PUFycmF5KXtyZXR1cm4gbnVsbH1yZXR1cm4gY31jYXRjaChhKXtyZXR1cm4gbnVsbH19O0tKVVIuandzLkpXUy5nZXRFbmNvZGVkU2lnbmF0dXJlVmFsdWVGcm9tSldTPWZ1bmN0aW9uKGIpe3ZhciBhPWIubWF0Y2goL15bXi5dK1xcLlteLl0rXFwuKFteLl0rKSQvKTtpZihhPT1udWxsKXt0aHJvd1wiSldTIHNpZ25hdHVyZSBpcyBub3QgYSBmb3JtIG9mICdIZWFkLlBheWxvYWQuU2lnVmFsdWUnLlwifXJldHVybiBhWzFdfTtLSlVSLmp3cy5KV1MuZ2V0SldLdGh1bWJwcmludD1mdW5jdGlvbihkKXtpZihkLmt0eSE9PVwiUlNBXCImJmQua3R5IT09XCJFQ1wiJiZkLmt0eSE9PVwib2N0XCIpe3Rocm93XCJ1bnN1cHBvcnRlZCBhbGdvcml0aG0gZm9yIEpXSyBUaHVtcHJpbnRcIn12YXIgYT1cIntcIjtpZihkLmt0eT09PVwiUlNBXCIpe2lmKHR5cGVvZiBkLm4hPVwic3RyaW5nXCJ8fHR5cGVvZiBkLmUhPVwic3RyaW5nXCIpe3Rocm93XCJ3cm9uZyBuIGFuZCBlIHZhbHVlIGZvciBSU0Ega2V5XCJ9YSs9J1wiZVwiOlwiJytkLmUrJ1wiLCc7YSs9J1wia3R5XCI6XCInK2Qua3R5KydcIiwnO2ErPSdcIm5cIjpcIicrZC5uKydcIn0nfWVsc2V7aWYoZC5rdHk9PT1cIkVDXCIpe2lmKHR5cGVvZiBkLmNydiE9XCJzdHJpbmdcInx8dHlwZW9mIGQueCE9XCJzdHJpbmdcInx8dHlwZW9mIGQueSE9XCJzdHJpbmdcIil7dGhyb3dcIndyb25nIGNydiwgeCBhbmQgeSB2YWx1ZSBmb3IgRUMga2V5XCJ9YSs9J1wiY3J2XCI6XCInK2QuY3J2KydcIiwnO2ErPSdcImt0eVwiOlwiJytkLmt0eSsnXCIsJzthKz0nXCJ4XCI6XCInK2QueCsnXCIsJzthKz0nXCJ5XCI6XCInK2QueSsnXCJ9J31lbHNle2lmKGQua3R5PT09XCJvY3RcIil7aWYodHlwZW9mIGQuayE9XCJzdHJpbmdcIil7dGhyb3dcIndyb25nIGsgdmFsdWUgZm9yIG9jdChzeW1tZXRyaWMpIGtleVwifWErPSdcImt0eVwiOlwiJytkLmt0eSsnXCIsJzthKz0nXCJrXCI6XCInK2QuaysnXCJ9J319fXZhciBiPXJzdHJ0b2hleChhKTt2YXIgYz1LSlVSLmNyeXB0by5VdGlsLmhhc2hIZXgoYixcInNoYTI1NlwiKTt2YXIgZT1oZXh0b2I2NHUoYyk7cmV0dXJuIGV9O0tKVVIuandzLkludERhdGU9e307S0pVUi5qd3MuSW50RGF0ZS5nZXQ9ZnVuY3Rpb24oYyl7dmFyIGI9S0pVUi5qd3MuSW50RGF0ZSxkPWIuZ2V0Tm93LGE9Yi5nZXRadWx1O2lmKGM9PVwibm93XCIpe3JldHVybiBkKCl9ZWxzZXtpZihjPT1cIm5vdyArIDFob3VyXCIpe3JldHVybiBkKCkrNjAqNjB9ZWxzZXtpZihjPT1cIm5vdyArIDFkYXlcIil7cmV0dXJuIGQoKSs2MCo2MCoyNH1lbHNle2lmKGM9PVwibm93ICsgMW1vbnRoXCIpe3JldHVybiBkKCkrNjAqNjAqMjQqMzB9ZWxzZXtpZihjPT1cIm5vdyArIDF5ZWFyXCIpe3JldHVybiBkKCkrNjAqNjAqMjQqMzY1fWVsc2V7aWYoYy5tYXRjaCgvWiQvKSl7cmV0dXJuIGEoYyl9ZWxzZXtpZihjLm1hdGNoKC9eWzAtOV0rJC8pKXtyZXR1cm4gcGFyc2VJbnQoYyl9fX19fX19dGhyb3dcInVuc3VwcG9ydGVkIGZvcm1hdDogXCIrY307S0pVUi5qd3MuSW50RGF0ZS5nZXRadWx1PWZ1bmN0aW9uKGEpe3JldHVybiB6dWx1dG9zZWMoYSl9O0tKVVIuandzLkludERhdGUuZ2V0Tm93PWZ1bmN0aW9uKCl7dmFyIGE9fn4obmV3IERhdGUoKS8xMDAwKTtyZXR1cm4gYX07S0pVUi5qd3MuSW50RGF0ZS5pbnREYXRlMlVUQ1N0cmluZz1mdW5jdGlvbihhKXt2YXIgYj1uZXcgRGF0ZShhKjEwMDApO3JldHVybiBiLnRvVVRDU3RyaW5nKCl9O0tKVVIuandzLkludERhdGUuaW50RGF0ZTJadWx1PWZ1bmN0aW9uKGUpe3ZhciBpPW5ldyBEYXRlKGUqMTAwMCksaD0oXCIwMDAwXCIraS5nZXRVVENGdWxsWWVhcigpKS5zbGljZSgtNCksZz0oXCIwMFwiKyhpLmdldFVUQ01vbnRoKCkrMSkpLnNsaWNlKC0yKSxiPShcIjAwXCIraS5nZXRVVENEYXRlKCkpLnNsaWNlKC0yKSxhPShcIjAwXCIraS5nZXRVVENIb3VycygpKS5zbGljZSgtMiksYz0oXCIwMFwiK2kuZ2V0VVRDTWludXRlcygpKS5zbGljZSgtMiksZj0oXCIwMFwiK2kuZ2V0VVRDU2Vjb25kcygpKS5zbGljZSgtMik7cmV0dXJuIGgrZytiK2ErYytmK1wiWlwifTtcbmV4cG9ydCB7IFNlY3VyZVJhbmRvbSB9O1xyXG5leHBvcnQgeyBybmdfc2VlZF90aW1lIH07XHJcblxyXG5leHBvcnQgeyBCaWdJbnRlZ2VyIH07XHJcbmV4cG9ydCB7IFJTQUtleSB9O1xyXG5leHBvcnQgY29uc3QgeyBFRFNBIH0gPSBLSlVSLmNyeXB0bztcclxuZXhwb3J0IGNvbnN0IHsgRFNBIH0gPSBLSlVSLmNyeXB0bztcclxuZXhwb3J0IGNvbnN0IHsgU2lnbmF0dXJlIH0gPSBLSlVSLmNyeXB0bztcclxuZXhwb3J0IGNvbnN0IHsgTWVzc2FnZURpZ2VzdCB9ID0gIEtKVVIuY3J5cHRvO1xyXG5leHBvcnQgY29uc3QgeyBNYWMgfSA9IEtKVVIuY3J5cHRvO1xyXG5leHBvcnQgY29uc3QgeyBDaXBoZXIgfSA9ICBLSlVSLmNyeXB0bztcclxuZXhwb3J0IHsgS0VZVVRJTCB9O1xyXG5leHBvcnQgeyBBU04xSEVYIH07XHJcbmV4cG9ydCB7IFg1MDkgfTtcclxuZXhwb3J0IHsgQ3J5cHRvSlMgfTtcclxuXHJcbi8vIGV4dC9iYXNlNjQuanNcclxuZXhwb3J0IHsgYjY0dG9oZXggfTtcclxuZXhwb3J0IHsgYjY0dG9CQSB9O1xyXG5cclxuLy8gYmFzZTY0eC5qc1xyXG5leHBvcnQgeyBzdG9CQSB9O1xyXG5leHBvcnQgeyBCQXRvcyB9O1xyXG5leHBvcnQgeyBCQXRvaGV4IH07XHJcbmV4cG9ydCB7IHN0b2hleCB9O1xyXG5leHBvcnQgeyBzdG9iNjQgfTtcclxuZXhwb3J0IHsgc3RvYjY0dSB9O1xyXG5leHBvcnQgeyBiNjR1dG9zIH07XHJcbmV4cG9ydCB7IGI2NHRvYjY0dSB9O1xyXG5leHBvcnQgeyBiNjR1dG9iNjQgfTtcclxuZXhwb3J0IHsgaGV4MmI2NCB9O1xyXG5leHBvcnQgeyBoZXh0b2I2NHUgfTtcclxuZXhwb3J0IHsgYjY0dXRvaGV4IH07XHJcbmV4cG9ydCB7IHV0Zjh0b2I2NHUgfTtcclxuZXhwb3J0IHsgYjY0dXRvdXRmOCB9O1xyXG5leHBvcnQgeyB1dGY4dG9iNjQgfTtcclxuZXhwb3J0IHsgYjY0dG91dGY4IH07XHJcbmV4cG9ydCB7IHV0Zjh0b2hleCB9O1xyXG5leHBvcnQgeyBoZXh0b3V0ZjggfTtcclxuZXhwb3J0IHsgaGV4dG9yc3RyIH07XHJcbmV4cG9ydCB7IHJzdHJ0b2hleCB9O1xyXG5leHBvcnQgeyBoZXh0b2I2NCB9O1xyXG5leHBvcnQgeyBoZXh0b2I2NG5sIH07XHJcbmV4cG9ydCB7IGI2NG5sdG9oZXggfTtcclxuZXhwb3J0IHsgaGV4dG9wZW0gfTtcclxuZXhwb3J0IHsgcGVtdG9oZXggfTtcclxuZXhwb3J0IHsgaGV4dG9BcnJheUJ1ZmZlciB9O1xyXG5leHBvcnQgeyBBcnJheUJ1ZmZlcnRvaGV4IH07XHJcbmV4cG9ydCB7IHp1bHV0b21zZWMgfTtcclxuZXhwb3J0IHsgenVsdXRvc2VjIH07XHJcbmV4cG9ydCB7IHp1bHV0b2RhdGUgfTtcclxuZXhwb3J0IHsgZGF0ZXRvenVsdSB9O1xyXG5leHBvcnQgeyB1cmljbXB0b2hleCB9O1xyXG5leHBvcnQgeyBoZXh0b3VyaWNtcCB9O1xyXG5leHBvcnQgeyBpcHY2dG9oZXggfTtcclxuZXhwb3J0IHsgaGV4dG9pcHY2IH07XHJcbmV4cG9ydCB7IGhleHRvaXAgfTtcclxuZXhwb3J0IHsgaXB0b2hleCB9O1xyXG5leHBvcnQgeyBlbmNvZGVVUklDb21wb25lbnRBbGwgfTtcclxuZXhwb3J0IHsgbmV3bGluZV90b1VuaXggfTtcclxuZXhwb3J0IHsgbmV3bGluZV90b0RvcyB9O1xyXG5leHBvcnQgeyBoZXh0b3Bvc2hleCB9O1xyXG5leHBvcnQgeyBpbnRhcnlzdHJ0b2hleCB9O1xyXG5leHBvcnQgeyBzdHJkaWZmaWR4IH07XHJcblxyXG4vLyBuYW1lIHNwYWNlc1xyXG5leHBvcnQgeyBLSlVSIH07XHJcbmNvbnN0IF9jcnlwdG8gPSAgS0pVUi5jcnlwdG87XHJcbmV4cG9ydCB7IF9jcnlwdG8gYXMgY3J5cHRvIH07XHJcbmV4cG9ydCBjb25zdCB7IGFzbjEgfSA9IEtKVVI7XHJcbmV4cG9ydCBjb25zdCB7IGp3cyB9ID0gS0pVUjtcclxuZXhwb3J0IGNvbnN0IHsgbGFuZyB9ID0gS0pVUjtcclxuXHJcblxyXG4iLCIndXNlIHN0cmljdCdcblxuZXhwb3J0cy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuZXhwb3J0cy50b0J5dGVBcnJheSA9IHRvQnl0ZUFycmF5XG5leHBvcnRzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5XG5cbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG5cbnZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG5mb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxufVxuXG4vLyBTdXBwb3J0IGRlY29kaW5nIFVSTC1zYWZlIGJhc2U2NCBzdHJpbmdzLCBhcyBOb2RlLmpzIGRvZXMuXG4vLyBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jhc2U2NCNVUkxfYXBwbGljYXRpb25zXG5yZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjJcbnJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xuXG5mdW5jdGlvbiBnZXRMZW5zIChiNjQpIHtcbiAgdmFyIGxlbiA9IGI2NC5sZW5ndGhcblxuICBpZiAobGVuICUgNCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKVxuICB9XG5cbiAgLy8gVHJpbSBvZmYgZXh0cmEgYnl0ZXMgYWZ0ZXIgcGxhY2Vob2xkZXIgYnl0ZXMgYXJlIGZvdW5kXG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JlYXRnYW1taXQvYmFzZTY0LWpzL2lzc3Vlcy80MlxuICB2YXIgdmFsaWRMZW4gPSBiNjQuaW5kZXhPZignPScpXG4gIGlmICh2YWxpZExlbiA9PT0gLTEpIHZhbGlkTGVuID0gbGVuXG5cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IHZhbGlkTGVuID09PSBsZW5cbiAgICA/IDBcbiAgICA6IDQgLSAodmFsaWRMZW4gJSA0KVxuXG4gIHJldHVybiBbdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbl1cbn1cblxuLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChiNjQpIHtcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuICByZXR1cm4gKCh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCkgLSBwbGFjZUhvbGRlcnNMZW5cbn1cblxuZnVuY3Rpb24gX2J5dGVMZW5ndGggKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikge1xuICByZXR1cm4gKCh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCkgLSBwbGFjZUhvbGRlcnNMZW5cbn1cblxuZnVuY3Rpb24gdG9CeXRlQXJyYXkgKGI2NCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cblxuICB2YXIgYXJyID0gbmV3IEFycihfYnl0ZUxlbmd0aChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pKVxuXG4gIHZhciBjdXJCeXRlID0gMFxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgdmFyIGxlbiA9IHBsYWNlSG9sZGVyc0xlbiA+IDBcbiAgICA/IHZhbGlkTGVuIC0gNFxuICAgIDogdmFsaWRMZW5cblxuICB2YXIgaVxuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYpIHxcbiAgICAgIHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDE2KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAyKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0KVxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMSkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0IChudW0pIHtcbiAgcmV0dXJuIGxvb2t1cFtudW0gPj4gMTggJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArXG4gICAgbG9va3VwW251bSAmIDB4M0ZdXG59XG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rICh1aW50OCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdG1wXG4gIHZhciBvdXRwdXQgPSBbXVxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgIHRtcCA9XG4gICAgICAoKHVpbnQ4W2ldIDw8IDE2KSAmIDB4RkYwMDAwKSArXG4gICAgICAoKHVpbnQ4W2kgKyAxXSA8PCA4KSAmIDB4RkYwMCkgK1xuICAgICAgKHVpbnQ4W2kgKyAyXSAmIDB4RkYpXG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpXG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGhcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gIHZhciBwYXJ0cyA9IFtdXG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzIC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsIGksIChpICsgbWF4Q2h1bmtMZW5ndGgpID4gbGVuMiA/IGxlbjIgOiAoaSArIG1heENodW5rTGVuZ3RoKSkpXG4gIH1cblxuICAvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG4gIGlmIChleHRyYUJ5dGVzID09PSAxKSB7XG4gICAgdG1wID0gdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAyXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCA0KSAmIDB4M0ZdICtcbiAgICAgICc9PSdcbiAgICApXG4gIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA9PT0gMikge1xuICAgIHRtcCA9ICh1aW50OFtsZW4gLSAyXSA8PCA4KSArIHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMTBdICtcbiAgICAgIGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXSArXG4gICAgICAnPSdcbiAgICApXG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbignJylcbn1cbiIsIi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5JylcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBVc2UgT2JqZWN0IGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBEdWUgdG8gdmFyaW91cyBicm93c2VyIGJ1Z3MsIHNvbWV0aW1lcyB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZCBldmVuXG4gKiB3aGVuIHRoZSBicm93c2VyIHN1cHBvcnRzIHR5cGVkIGFycmF5cy5cbiAqXG4gKiBOb3RlOlxuICpcbiAqICAgLSBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YCBpbnN0YW5jZXMsXG4gKiAgICAgU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzguXG4gKlxuICogICAtIENocm9tZSA5LTEwIGlzIG1pc3NpbmcgdGhlIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24uXG4gKlxuICogICAtIElFMTAgaGFzIGEgYnJva2VuIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhcnJheXMgb2ZcbiAqICAgICBpbmNvcnJlY3QgbGVuZ3RoIGluIHNvbWUgc2l0dWF0aW9ucy5cblxuICogV2UgZGV0ZWN0IHRoZXNlIGJ1Z2d5IGJyb3dzZXJzIGFuZCBzZXQgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYCB0byBgZmFsc2VgIHNvIHRoZXlcbiAqIGdldCB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBzbG93ZXIgYnV0IGJlaGF2ZXMgY29ycmVjdGx5LlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUICE9PSB1bmRlZmluZWRcbiAgPyBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVFxuICA6IHR5cGVkQXJyYXlTdXBwb3J0KClcblxuLypcbiAqIEV4cG9ydCBrTWF4TGVuZ3RoIGFmdGVyIHR5cGVkIGFycmF5IHN1cHBvcnQgaXMgZGV0ZXJtaW5lZC5cbiAqL1xuZXhwb3J0cy5rTWF4TGVuZ3RoID0ga01heExlbmd0aCgpXG5cbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuX19wcm90b19fID0ge19fcHJvdG9fXzogVWludDhBcnJheS5wcm90b3R5cGUsIGZvbzogZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfX1cbiAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MiAmJiAvLyB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZFxuICAgICAgICB0eXBlb2YgYXJyLnN1YmFycmF5ID09PSAnZnVuY3Rpb24nICYmIC8vIGNocm9tZSA5LTEwIGxhY2sgYHN1YmFycmF5YFxuICAgICAgICBhcnIuc3ViYXJyYXkoMSwgMSkuYnl0ZUxlbmd0aCA9PT0gMCAvLyBpZTEwIGhhcyBicm9rZW4gYHN1YmFycmF5YFxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZnVuY3Rpb24ga01heExlbmd0aCAoKSB7XG4gIHJldHVybiBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVFxuICAgID8gMHg3ZmZmZmZmZlxuICAgIDogMHgzZmZmZmZmZlxufVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKHRoYXQsIGxlbmd0aCkge1xuICBpZiAoa01heExlbmd0aCgpIDwgbGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoJylcbiAgfVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICBpZiAodGhhdCA9PT0gbnVsbCkge1xuICAgICAgdGhhdCA9IG5ldyBCdWZmZXIobGVuZ3RoKVxuICAgIH1cbiAgICB0aGF0Lmxlbmd0aCA9IGxlbmd0aFxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAqIHByb3RvdHlwZSBjaGFuZ2VkIHRvIGBCdWZmZXIucHJvdG90eXBlYC4gRnVydGhlcm1vcmUsIGBCdWZmZXJgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIGBVaW50OEFycmF5YCwgc28gdGhlIHJldHVybmVkIGluc3RhbmNlcyB3aWxsIGhhdmUgYWxsIHRoZSBub2RlIGBCdWZmZXJgIG1ldGhvZHNcbiAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gKiByZXR1cm5zIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgISh0aGlzIGluc3RhbmNlb2YgQnVmZmVyKSkge1xuICAgIHJldHVybiBuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0lmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gYWxsb2NVbnNhZmUodGhpcywgYXJnKVxuICB9XG4gIHJldHVybiBmcm9tKHRoaXMsIGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucG9vbFNpemUgPSA4MTkyIC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxuLy8gVE9ETzogTGVnYWN5LCBub3QgbmVlZGVkIGFueW1vcmUuIFJlbW92ZSBpbiBuZXh0IG1ham9yIHZlcnNpb24uXG5CdWZmZXIuX2F1Z21lbnQgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIGFyci5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gZnJvbSAodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpXG4gIH1cblxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldClcbiAgfVxuXG4gIHJldHVybiBmcm9tT2JqZWN0KHRoYXQsIHZhbHVlKVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEJ1ZmZlcihhcmcsIGVuY29kaW5nKSBidXQgdGhyb3dzIGEgVHlwZUVycm9yXG4gKiBpZiB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEJ1ZmZlci5mcm9tKHN0clssIGVuY29kaW5nXSlcbiAqIEJ1ZmZlci5mcm9tKGFycmF5KVxuICogQnVmZmVyLmZyb20oYnVmZmVyKVxuICogQnVmZmVyLmZyb20oYXJyYXlCdWZmZXJbLCBieXRlT2Zmc2V0WywgbGVuZ3RoXV0pXG4gKiovXG5CdWZmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBmcm9tKG51bGwsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbmlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICBCdWZmZXIucHJvdG90eXBlLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXkucHJvdG90eXBlXG4gIEJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wuc3BlY2llcyAmJlxuICAgICAgQnVmZmVyW1N5bWJvbC5zcGVjaWVzXSA9PT0gQnVmZmVyKSB7XG4gICAgLy8gRml4IHN1YmFycmF5KCkgaW4gRVMyMDE2LiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvOTdcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLCBTeW1ib2wuc3BlY2llcywge1xuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydFNpemUgKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJylcbiAgfVxufVxuXG5mdW5jdGlvbiBhbGxvYyAodGhhdCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICBpZiAoc2l6ZSA8PSAwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxuICB9XG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPbmx5IHBheSBhdHRlbnRpb24gdG8gZW5jb2RpbmcgaWYgaXQncyBhIHN0cmluZy4gVGhpc1xuICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAvLyBiZSBpbnRlcnByZXR0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgcmV0dXJuIHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZydcbiAgICAgID8gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgICA6IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwpXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqIGFsbG9jKHNpemVbLCBmaWxsWywgZW5jb2RpbmddXSlcbiAqKi9cbkJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICByZXR1cm4gYWxsb2MobnVsbCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlICh0aGF0LCBzaXplKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplIDwgMCA/IDAgOiBjaGVja2VkKHNpemUpIHwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7XG4gICAgICB0aGF0W2ldID0gMFxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gU2xvd0J1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICovXG5CdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHRoYXQsIHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJlbmNvZGluZ1wiIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKVxuICB9XG5cbiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKVxuXG4gIHZhciBhY3R1YWwgPSB0aGF0LndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICB0aGF0ID0gdGhhdC5zbGljZSgwLCBhY3R1YWwpXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlICh0aGF0LCBhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyICh0aGF0LCBhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gIGFycmF5LmJ5dGVMZW5ndGggLy8gdGhpcyB0aHJvd3MgaWYgYGFycmF5YCBpcyBub3QgYSB2YWxpZCBBcnJheUJ1ZmZlclxuXG4gIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdvZmZzZXRcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQgKyAobGVuZ3RoIHx8IDApKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ2xlbmd0aFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5KVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldClcbiAgfSBlbHNlIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gYXJyYXlcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgdGhhdCA9IGZyb21BcnJheUxpa2UodGhhdCwgYXJyYXkpXG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbU9iamVjdCAodGhhdCwgb2JqKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqKSkge1xuICAgIHZhciBsZW4gPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMFxuICAgIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuKVxuXG4gICAgaWYgKHRoYXQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhhdFxuICAgIH1cblxuICAgIG9iai5jb3B5KHRoYXQsIDAsIDAsIGxlbilcbiAgICByZXR1cm4gdGhhdFxuICB9XG5cbiAgaWYgKG9iaikge1xuICAgIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBvYmouYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHx8ICdsZW5ndGgnIGluIG9iaikge1xuICAgICAgaWYgKHR5cGVvZiBvYmoubGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBpc25hbihvYmoubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIDApXG4gICAgICB9XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmopXG4gICAgfVxuXG4gICAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBpc0FycmF5KG9iai5kYXRhKSkge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqLmRhdGEpXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LicpXG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBrTWF4TGVuZ3RoKClgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0ga01heExlbmd0aCgpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIGtNYXhMZW5ndGgoKS50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgbGVuZ3RoID0gMFxuICB9XG4gIHJldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aClcbn1cblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuICEhKGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlcilcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGEpIHx8ICFCdWZmZXIuaXNCdWZmZXIoYikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIHZhciB4ID0gYS5sZW5ndGhcbiAgdmFyIHkgPSBiLmxlbmd0aFxuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgIHggPSBhW2ldXG4gICAgICB5ID0gYltpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIWlzQXJyYXkobGlzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYnVmID0gbGlzdFtpXVxuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfVxuICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgIHBvcyArPSBidWYubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlclxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoc3RyaW5nKSkge1xuICAgIHJldHVybiBzdHJpbmcubGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgKEFycmF5QnVmZmVyLmlzVmlldyhzdHJpbmcpIHx8IHN0cmluZyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHN0cmluZyA9ICcnICsgc3RyaW5nXG4gIH1cblxuICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAobGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIGxlbiAqIDJcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aCAvLyBhc3N1bWUgdXRmOFxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICAvLyBObyBuZWVkIHRvIHZlcmlmeSB0aGF0IFwidGhpcy5sZW5ndGggPD0gTUFYX1VJTlQzMlwiIHNpbmNlIGl0J3MgYSByZWFkLW9ubHlcbiAgLy8gcHJvcGVydHkgb2YgYSB0eXBlZCBhcnJheS5cblxuICAvLyBUaGlzIGJlaGF2ZXMgbmVpdGhlciBsaWtlIFN0cmluZyBub3IgVWludDhBcnJheSBpbiB0aGF0IHdlIHNldCBzdGFydC9lbmRcbiAgLy8gdG8gdGhlaXIgdXBwZXIvbG93ZXIgYm91bmRzIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgb3V0IG9mIHJhbmdlLlxuICAvLyB1bmRlZmluZWQgaXMgaGFuZGxlZCBzcGVjaWFsbHkgYXMgcGVyIEVDTUEtMjYyIDZ0aCBFZGl0aW9uLFxuICAvLyBTZWN0aW9uIDEzLjMuMy43IFJ1bnRpbWUgU2VtYW50aWNzOiBLZXllZEJpbmRpbmdJbml0aWFsaXphdGlvbi5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgaWYgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoZW5kIDw9IDApIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIEZvcmNlIGNvZXJzaW9uIHRvIHVpbnQzMi4gVGhpcyB3aWxsIGFsc28gY29lcmNlIGZhbHNleS9OYU4gdmFsdWVzIHRvIDAuXG4gIGVuZCA+Pj49IDBcbiAgc3RhcnQgPj4+PSAwXG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbi8vIFRoZSBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIGFuZCBgaXMtYnVmZmVyYCAoaW4gU2FmYXJpIDUtNykgdG8gZGV0ZWN0XG4vLyBCdWZmZXIgaW5zdGFuY2VzLlxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlXG5cbmZ1bmN0aW9uIHN3YXAgKGIsIG4sIG0pIHtcbiAgdmFyIGkgPSBiW25dXG4gIGJbbl0gPSBiW21dXG4gIGJbbV0gPSBpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMSlcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uIHN3YXAzMiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgNCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDMpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQgPSBmdW5jdGlvbiBzd2FwNjQgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyA3KVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyA2KVxuICAgIHN3YXAodGhpcywgaSArIDIsIGkgKyA1KVxuICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCB8IDBcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnXG4gIHZhciBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLm1hdGNoKC8uezJ9L2cpLmpvaW4oJyAnKVxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICdcbiAgfVxuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMFxuICB9XG4gIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGFyZ2V0Lmxlbmd0aCB8fCB0aGlzU3RhcnQgPCAwIHx8IHRoaXNFbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAxXG4gIH1cblxuICBzdGFydCA+Pj49IDBcbiAgZW5kID4+Pj0gMFxuICB0aGlzU3RhcnQgPj4+PSAwXG4gIHRoaXNFbmQgPj4+PSAwXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICB2YXIgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnRcbiAgdmFyIHkgPSBlbmQgLSBzdGFydFxuICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSlcblxuICB2YXIgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZClcbiAgdmFyIHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZiAoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldFxuICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0XG4gICAgYnl0ZU9mZnNldCA9IDBcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0ICAvLyBDb2VyY2UgdG8gTnVtYmVyLlxuICBpZiAoaXNOYU4oYnl0ZU9mZnNldCkpIHtcbiAgICAvLyBieXRlT2Zmc2V0OiBpdCBpdCdzIHVuZGVmaW5lZCwgbnVsbCwgTmFOLCBcImZvb1wiLCBldGMsIHNlYXJjaCB3aG9sZSBidWZmZXJcbiAgICBieXRlT2Zmc2V0ID0gZGlyID8gMCA6IChidWZmZXIubGVuZ3RoIC0gMSlcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0OiBuZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggKyBieXRlT2Zmc2V0XG4gIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICBpZiAoZGlyKSByZXR1cm4gLTFcbiAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMVxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAwKSB7XG4gICAgaWYgKGRpcikgYnl0ZU9mZnNldCA9IDBcbiAgICBlbHNlIHJldHVybiAtMVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIHZhbFxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWwgPSBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICB9XG5cbiAgLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcvYnVmZmVyIGFsd2F5cyBmYWlsc1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDB4RkYgLy8gU2VhcmNoIGZvciBhIGJ5dGUgdmFsdWUgWzAtMjU1XVxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJlxuICAgICAgICB0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGRpcikge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCBbIHZhbCBdLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuZnVuY3Rpb24gYXJyYXlJbmRleE9mIChhcnIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICB2YXIgaW5kZXhTaXplID0gMVxuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aFxuICB2YXIgdmFsTGVuZ3RoID0gdmFsLmxlbmd0aFxuXG4gIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9XG4gICAgICBpbmRleFNpemUgPSAyXG4gICAgICBhcnJMZW5ndGggLz0gMlxuICAgICAgdmFsTGVuZ3RoIC89IDJcbiAgICAgIGJ5dGVPZmZzZXQgLz0gMlxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQgKGJ1ZiwgaSkge1xuICAgIGlmIChpbmRleFNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiBidWZbaV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSAqIGluZGV4U2l6ZSlcbiAgICB9XG4gIH1cblxuICB2YXIgaVxuICBpZiAoZGlyKSB7XG4gICAgdmFyIGZvdW5kSW5kZXggPSAtMVxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPCBhcnJMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlYWQoYXJyLCBpKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4KSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkgcmV0dXJuIGZvdW5kSW5kZXggKiBpbmRleFNpemVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkgaSAtPSBpIC0gZm91bmRJbmRleFxuICAgICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGhcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGZvdW5kID0gdHJ1ZVxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWxMZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocmVhZChhcnIsIGkgKyBqKSAhPT0gcmVhZCh2YWwsIGopKSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIHRydWUpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZmFsc2UpXG59XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICB2YXIgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldFxuICBpZiAoIWxlbmd0aCkge1xuICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpXG4gICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gICAgfVxuICB9XG5cbiAgLy8gbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZiBkaWdpdHNcbiAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKHN0ckxlbiAlIDIgIT09IDApIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKGlzTmFOKHBhcnNlZCkpIHJldHVybiBpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBsYXRpbjFXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCB8IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICAvLyBsZWdhY3kgd3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpIC0gcmVtb3ZlIGluIHYwLjEzXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0J1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkJ1xuICAgIClcbiAgfVxuXG4gIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgdmFyIHJlcyA9IFtdXG5cbiAgdmFyIGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbFxuICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gKGZpcnN0Qnl0ZSA+IDB4RUYpID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERikgPyAzXG4gICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKSA/IDJcbiAgICAgIDogMVxuXG4gICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgdmFyIHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludFxuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHgxRikgPDwgMHg2IHwgKHNlY29uZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwICYmIChmb3VydGhCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweDEyIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweEMgfCAodGhpcmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKGZvdXJ0aEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgY29kZVBvaW50ID0gMHhGRkZEXG4gICAgICBieXRlc1BlclNlcXVlbmNlID0gMVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDBcbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMClcbiAgICAgIGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGXG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KVxuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZVxuICB9XG5cbiAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxudmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICB2YXIgcmVzID0gJydcbiAgdmFyIGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gIHZhciBvdXQgPSAnJ1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIG91dCArPSB0b0hleChidWZbaV0pXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgdmFyIHJlcyA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIGJ5dGVzW2kgKyAxXSAqIDI1NilcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSB+fnN0YXJ0XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuXG4gICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICBzdGFydCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuXG4gICAgaWYgKGVuZCA8IDApIGVuZCA9IDBcbiAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICBlbmQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICB2YXIgbmV3QnVmXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIG5ld0J1ZiA9IHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZClcbiAgICBuZXdCdWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIHZhciBzbGljZUxlbiA9IGVuZCAtIHN0YXJ0XG4gICAgbmV3QnVmID0gbmV3IEJ1ZmZlcihzbGljZUxlbiwgdW5kZWZpbmVkKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpY2VMZW47ICsraSkge1xuICAgICAgbmV3QnVmW2ldID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgfVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF1cbiAgdmFyIG11bCA9IDFcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICtcbiAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgdGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiByZWFkSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24gcmVhZERvdWJsZUxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDE2IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDIpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlICYgKDB4ZmYgPDwgKDggKiAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSkpKSA+Pj5cbiAgICAgIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpICogOFxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCA0KTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSA+Pj4gKGxpdHRsZUVuZGlhbiA/IGkgOiAzIC0gaSkgKiA4KSAmIDB4ZmZcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4LCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KVxuICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbi8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDBcbiAgaWYgKGVuZCA+IDAgJiYgZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICB2YXIgbGVuID0gZW5kIC0gc3RhcnRcbiAgdmFyIGlcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSBpZiAobGVuIDwgMTAwMCB8fCAhQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBhc2NlbmRpbmcgY29weSBmcm9tIHN0YXJ0XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgbGVuKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmIChjb2RlIDwgMjU2KSB7XG4gICAgICAgIHZhbCA9IGNvZGVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTVcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IEJ1ZmZlci5pc0J1ZmZlcih2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiB1dGY4VG9CeXRlcyhuZXcgQnVmZmVyKHZhbCwgZW5jb2RpbmcpLnRvU3RyaW5nKCkpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teK1xcLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0cmluZ3RyaW0oc3RyKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiBzdHJpbmd0cmltIChzdHIpIHtcbiAgaWYgKHN0ci50cmltKSByZXR1cm4gc3RyLnRyaW0oKVxuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKVxufVxuXG5mdW5jdGlvbiB0b0hleCAobikge1xuICBpZiAobiA8IDE2KSByZXR1cm4gJzAnICsgbi50b1N0cmluZygxNilcbiAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgdmFyIGNvZGVQb2ludFxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgdmFyIGJ5dGVzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIGlzbmFuICh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gdmFsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZpbmQnKTtcbnZhciBlbnRyeVVuYmluZCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9lbnRyeS11bmJpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnQXJyYXknLCAnZmluZCcpO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5pcy1hcnJheScpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguQXJyYXkuaXNBcnJheTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuc29tZScpO1xudmFyIGVudHJ5VW5iaW5kID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2VudHJ5LXVuYmluZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVudHJ5VW5iaW5kKCdBcnJheScsICdzb21lJyk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LnNwbGljZScpO1xudmFyIGVudHJ5VW5iaW5kID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2VudHJ5LXVuYmluZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVudHJ5VW5iaW5kKCdBcnJheScsICdzcGxpY2UnKTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuZnVuY3Rpb24uYmluZCcpO1xudmFyIGVudHJ5VW5iaW5kID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2VudHJ5LXVuYmluZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVudHJ5VW5iaW5kKCdGdW5jdGlvbicsICdiaW5kJyk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24nKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5hc3NpZ247XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFnZ3JlZ2F0ZS1lcnJvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZS5hbGwtc2V0dGxlZCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5wcm9taXNlLmFueScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5wcm9taXNlLmZpbmFsbHknKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3InKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLlByb21pc2U7XG4iLCJ2YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvYXJyYXkvZmluZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsInZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9hcnJheS9pcy1hcnJheScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsInZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9hcnJheS9zb21lJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwidmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2FycmF5L3NwbGljZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsInZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9mdW5jdGlvbi9iaW5kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwidmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL29iamVjdC9hc3NpZ24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCJ2YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvcHJvbWlzZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuYWdncmVnYXRlLWVycm9yJyk7XG4vLyBUT0RPOiBSZW1vdmUgZnJvbSBgY29yZS1qc0A0YFxucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQucHJvbWlzZS5hbGwtc2V0dGxlZCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQucHJvbWlzZS50cnknKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LnByb21pc2UuYW55Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkgJiYgaXQgIT09IG51bGwpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBzZXQgXCIgKyBTdHJpbmcoaXQpICsgJyBhcyBhIHByb3RvdHlwZScpO1xuICB9IHJldHVybiBpdDtcbn07XG4iLCJ2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbnZhciBVTlNDT1BBQkxFUyA9IHdlbGxLbm93blN5bWJvbCgndW5zY29wYWJsZXMnKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5pZiAoQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkge1xuICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKEFycmF5UHJvdG90eXBlLCBVTlNDT1BBQkxFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogY3JlYXRlKG51bGwpXG4gIH0pO1xufVxuXG4vLyBhZGQgYSBrZXkgdG8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdW2tleV0gPSB0cnVlO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSkge1xuICBpZiAoIShpdCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0ICcgKyAobmFtZSA/IG5hbWUgKyAnICcgOiAnJykgKyAnaW52b2NhdGlvbicpO1xuICB9IHJldHVybiBpdDtcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwidmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgaW5kZXhPZiwgaW5jbHVkZXMgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChJU19JTkNMVURFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBlbCwgZnJvbUluZGV4KSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoJHRoaXMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBpZiAoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpIHdoaWxlIChsZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgaWYgKHZhbHVlICE9IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICBpZiAoKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pICYmIE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xuICBpbmNsdWRlczogY3JlYXRlTWV0aG9kKHRydWUpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmluZGV4T2ZgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmRleG9mXG4gIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZChmYWxzZSlcbn07XG4iLCJ2YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5cbnZhciBwdXNoID0gW10ucHVzaDtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGZvckVhY2gsIG1hcCwgZmlsdGVyLCBzb21lLCBldmVyeSwgZmluZCwgZmluZEluZGV4LCBmaWx0ZXJPdXQgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHZhciBJU19NQVAgPSBUWVBFID09IDE7XG4gIHZhciBJU19GSUxURVIgPSBUWVBFID09IDI7XG4gIHZhciBJU19TT01FID0gVFlQRSA9PSAzO1xuICB2YXIgSVNfRVZFUlkgPSBUWVBFID09IDQ7XG4gIHZhciBJU19GSU5EX0lOREVYID0gVFlQRSA9PSA2O1xuICB2YXIgSVNfRklMVEVSX09VVCA9IFRZUEUgPT0gNztcbiAgdmFyIE5PX0hPTEVTID0gVFlQRSA9PSA1IHx8IElTX0ZJTkRfSU5ERVg7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQsIHNwZWNpZmljQ3JlYXRlKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCgkdGhpcyk7XG4gICAgdmFyIHNlbGYgPSBJbmRleGVkT2JqZWN0KE8pO1xuICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCB0aGF0LCAzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoc2VsZi5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGNyZWF0ZSA9IHNwZWNpZmljQ3JlYXRlIHx8IGFycmF5U3BlY2llc0NyZWF0ZTtcbiAgICB2YXIgdGFyZ2V0ID0gSVNfTUFQID8gY3JlYXRlKCR0aGlzLCBsZW5ndGgpIDogSVNfRklMVEVSIHx8IElTX0ZJTFRFUl9PVVQgPyBjcmVhdGUoJHRoaXMsIDApIDogdW5kZWZpbmVkO1xuICAgIHZhciB2YWx1ZSwgcmVzdWx0O1xuICAgIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSBpZiAoTk9fSE9MRVMgfHwgaW5kZXggaW4gc2VsZikge1xuICAgICAgdmFsdWUgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlc3VsdCA9IGJvdW5kRnVuY3Rpb24odmFsdWUsIGluZGV4LCBPKTtcbiAgICAgIGlmIChUWVBFKSB7XG4gICAgICAgIGlmIChJU19NQVApIHRhcmdldFtpbmRleF0gPSByZXN1bHQ7IC8vIG1hcFxuICAgICAgICBlbHNlIGlmIChyZXN1bHQpIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAvLyBzb21lXG4gICAgICAgICAgY2FzZSA1OiByZXR1cm4gdmFsdWU7ICAgICAgICAgICAgIC8vIGZpbmRcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBpbmRleDsgICAgICAgICAgICAgLy8gZmluZEluZGV4XG4gICAgICAgICAgY2FzZSAyOiBwdXNoLmNhbGwodGFyZ2V0LCB2YWx1ZSk7IC8vIGZpbHRlclxuICAgICAgICB9IGVsc2Ugc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSA0OiByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgIC8vIGV2ZXJ5XG4gICAgICAgICAgY2FzZSA3OiBwdXNoLmNhbGwodGFyZ2V0LCB2YWx1ZSk7IC8vIGZpbHRlck91dFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBJU19GSU5EX0lOREVYID8gLTEgOiBJU19TT01FIHx8IElTX0VWRVJZID8gSVNfRVZFUlkgOiB0YXJnZXQ7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZm9yZWFjaFxuICBmb3JFYWNoOiBjcmVhdGVNZXRob2QoMCksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUubWFwYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUubWFwXG4gIG1hcDogY3JlYXRlTWV0aG9kKDEpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbHRlcmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbHRlclxuICBmaWx0ZXI6IGNyZWF0ZU1ldGhvZCgyKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5zb21lYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc29tZVxuICBzb21lOiBjcmVhdGVNZXRob2QoMyksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZXZlcnlgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5ldmVyeVxuICBldmVyeTogY3JlYXRlTWV0aG9kKDQpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbmRgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kXG4gIGZpbmQ6IGNyZWF0ZU1ldGhvZCg1KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhcbiAgZmluZEluZGV4OiBjcmVhdGVNZXRob2QoNiksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyT3V0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtYXJyYXktZmlsdGVyaW5nXG4gIGZpbHRlck91dDogY3JlYXRlTWV0aG9kKDcpXG59O1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgVjhfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbicpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkge1xuICAvLyBXZSBjYW4ndCB1c2UgdGhpcyBmZWF0dXJlIGRldGVjdGlvbiBpbiBWOCBzaW5jZSBpdCBjYXVzZXNcbiAgLy8gZGVvcHRpbWl6YXRpb24gYW5kIHNlcmlvdXMgcGVyZm9ybWFuY2UgZGVncmFkYXRpb25cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY3N1xuICByZXR1cm4gVjhfVkVSU0lPTiA+PSA1MSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIHZhciBjb25zdHJ1Y3RvciA9IGFycmF5LmNvbnN0cnVjdG9yID0ge307XG4gICAgY29uc3RydWN0b3JbU1BFQ0lFU10gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4geyBmb286IDEgfTtcbiAgICB9O1xuICAgIHJldHVybiBhcnJheVtNRVRIT0RfTkFNRV0oQm9vbGVhbikuZm9vICE9PSAxO1xuICB9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTUVUSE9EX05BTUUsIGFyZ3VtZW50KSB7XG4gIHZhciBtZXRob2QgPSBbXVtNRVRIT0RfTkFNRV07XG4gIHJldHVybiAhIW1ldGhvZCAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtY2FsbCxuby10aHJvdy1saXRlcmFsXG4gICAgbWV0aG9kLmNhbGwobnVsbCwgYXJndW1lbnQgfHwgZnVuY3Rpb24gKCkgeyB0aHJvdyAxOyB9LCAxKTtcbiAgfSk7XG59O1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBjYWNoZSA9IHt9O1xuXG52YXIgdGhyb3dlciA9IGZ1bmN0aW9uIChpdCkgeyB0aHJvdyBpdDsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTUVUSE9EX05BTUUsIG9wdGlvbnMpIHtcbiAgaWYgKGhhcyhjYWNoZSwgTUVUSE9EX05BTUUpKSByZXR1cm4gY2FjaGVbTUVUSE9EX05BTUVdO1xuICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fTtcbiAgdmFyIG1ldGhvZCA9IFtdW01FVEhPRF9OQU1FXTtcbiAgdmFyIEFDQ0VTU09SUyA9IGhhcyhvcHRpb25zLCAnQUNDRVNTT1JTJykgPyBvcHRpb25zLkFDQ0VTU09SUyA6IGZhbHNlO1xuICB2YXIgYXJndW1lbnQwID0gaGFzKG9wdGlvbnMsIDApID8gb3B0aW9uc1swXSA6IHRocm93ZXI7XG4gIHZhciBhcmd1bWVudDEgPSBoYXMob3B0aW9ucywgMSkgPyBvcHRpb25zWzFdIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiBjYWNoZVtNRVRIT0RfTkFNRV0gPSAhIW1ldGhvZCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIGlmIChBQ0NFU1NPUlMgJiYgIURFU0NSSVBUT1JTKSByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgTyA9IHsgbGVuZ3RoOiAtMSB9O1xuXG4gICAgaWYgKEFDQ0VTU09SUykgZGVmaW5lUHJvcGVydHkoTywgMSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IHRocm93ZXIgfSk7XG4gICAgZWxzZSBPWzFdID0gMTtcblxuICAgIG1ldGhvZC5jYWxsKE8sIGFyZ3VtZW50MCwgYXJndW1lbnQxKTtcbiAgfSk7XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxuLy8gYEFycmF5U3BlY2llc0NyZWF0ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5c3BlY2llc2NyZWF0ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWxBcnJheSwgbGVuZ3RoKSB7XG4gIHZhciBDO1xuICBpZiAoaXNBcnJheShvcmlnaW5hbEFycmF5KSkge1xuICAgIEMgPSBvcmlnaW5hbEFycmF5LmNvbnN0cnVjdG9yO1xuICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrXG4gICAgaWYgKHR5cGVvZiBDID09ICdmdW5jdGlvbicgJiYgKEMgPT09IEFycmF5IHx8IGlzQXJyYXkoQy5wcm90b3R5cGUpKSkgQyA9IHVuZGVmaW5lZDtcbiAgICBlbHNlIGlmIChpc09iamVjdChDKSkge1xuICAgICAgQyA9IENbU1BFQ0lFU107XG4gICAgICBpZiAoQyA9PT0gbnVsbCkgQyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gcmV0dXJuIG5ldyAoQyA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDKShsZW5ndGggPT09IDAgPyAwIDogbGVuZ3RoKTtcbn07XG4iLCJ2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIGNhbGxlZCA9IDA7XG4gIHZhciBpdGVyYXRvcldpdGhSZXR1cm4gPSB7XG4gICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHsgZG9uZTogISFjYWxsZWQrKyB9O1xuICAgIH0sXG4gICAgJ3JldHVybic6IGZ1bmN0aW9uICgpIHtcbiAgICAgIFNBRkVfQ0xPU0lORyA9IHRydWU7XG4gICAgfVxuICB9O1xuICBpdGVyYXRvcldpdGhSZXR1cm5bSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuICBBcnJheS5mcm9tKGl0ZXJhdG9yV2l0aFJldHVybiwgZnVuY3Rpb24gKCkgeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYywgU0tJUF9DTE9TSU5HKSB7XG4gIGlmICghU0tJUF9DTE9TSU5HICYmICFTQUZFX0NMT1NJTkcpIHJldHVybiBmYWxzZTtcbiAgdmFyIElURVJBVElPTl9TVVBQT1JUID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIG9iamVjdCA9IHt9O1xuICAgIG9iamVjdFtJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogSVRFUkFUSU9OX1NVUFBPUlQgPSB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgICBleGVjKG9iamVjdCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIElURVJBVElPTl9TVVBQT1JUO1xufTtcbiIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTtcbiIsInZhciBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0Jyk7XG52YXIgY2xhc3NvZlJhdyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQ09SUkVDVF9BUkdVTUVOVFMgPSBjbGFzc29mUmF3KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG59O1xuXG4vLyBnZXR0aW5nIHRhZyBmcm9tIEVTNisgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgXG5tb2R1bGUuZXhwb3J0cyA9IFRPX1NUUklOR19UQUdfU1VQUE9SVCA/IGNsYXNzb2ZSYXcgOiBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIHRhZywgcmVzdWx0O1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAodGFnID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUT19TVFJJTkdfVEFHKSkgPT0gJ3N0cmluZycgPyB0YWdcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IENPUlJFQ1RfQVJHVU1FTlRTID8gY2xhc3NvZlJhdyhPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChyZXN1bHQgPSBjbGFzc29mUmF3KE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogcmVzdWx0O1xufTtcbiIsInZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgb3duS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vd24ta2V5cycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuICB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbiAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoIWhhcyh0YXJnZXQsIGtleSkpIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgfVxufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEYoKSB7IC8qIGVtcHR5ICovIH1cbiAgRi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBudWxsO1xuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBGKCkpICE9PSBGLnByb3RvdHlwZTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJykuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7XG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICBJdGVyYXRvckNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yQ29uc3RydWN0b3IsIFRPX1NUUklOR19UQUcsIGZhbHNlLCB0cnVlKTtcbiAgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpcztcbiAgcmV0dXJuIEl0ZXJhdG9yQ29uc3RydWN0b3I7XG59O1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIGtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgdmFyIHByb3BlcnR5S2V5ID0gdG9QcmltaXRpdmUoa2V5KTtcbiAgaWYgKHByb3BlcnR5S2V5IGluIG9iamVjdCkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIHByb3BlcnR5S2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgdmFsdWUpKTtcbiAgZWxzZSBvYmplY3RbcHJvcGVydHlLZXldID0gdmFsdWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3InKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgSXRlcmF0b3JzQ29yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMtY29yZScpO1xuXG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSBJdGVyYXRvcnNDb3JlLkl0ZXJhdG9yUHJvdG90eXBlO1xudmFyIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSBJdGVyYXRvcnNDb3JlLkJVR0dZX1NBRkFSSV9JVEVSQVRPUlM7XG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgS0VZUyA9ICdrZXlzJztcbnZhciBWQUxVRVMgPSAndmFsdWVzJztcbnZhciBFTlRSSUVTID0gJ2VudHJpZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEl0ZXJhYmxlLCBOQU1FLCBJdGVyYXRvckNvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yKEl0ZXJhdG9yQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpO1xuXG4gIHZhciBnZXRJdGVyYXRpb25NZXRob2QgPSBmdW5jdGlvbiAoS0lORCkge1xuICAgIGlmIChLSU5EID09PSBERUZBVUxUICYmIGRlZmF1bHRJdGVyYXRvcikgcmV0dXJuIGRlZmF1bHRJdGVyYXRvcjtcbiAgICBpZiAoIUJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgJiYgS0lORCBpbiBJdGVyYWJsZVByb3RvdHlwZSkgcmV0dXJuIEl0ZXJhYmxlUHJvdG90eXBlW0tJTkRdO1xuICAgIHN3aXRjaCAoS0lORCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICAgIGNhc2UgRU5UUklFUzogcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICB9IHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzKTsgfTtcbiAgfTtcblxuICB2YXIgVE9fU1RSSU5HX1RBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJztcbiAgdmFyIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IGZhbHNlO1xuICB2YXIgSXRlcmFibGVQcm90b3R5cGUgPSBJdGVyYWJsZS5wcm90b3R5cGU7XG4gIHZhciBuYXRpdmVJdGVyYXRvciA9IEl0ZXJhYmxlUHJvdG90eXBlW0lURVJBVE9SXVxuICAgIHx8IEl0ZXJhYmxlUHJvdG90eXBlWydAQGl0ZXJhdG9yJ11cbiAgICB8fCBERUZBVUxUICYmIEl0ZXJhYmxlUHJvdG90eXBlW0RFRkFVTFRdO1xuICB2YXIgZGVmYXVsdEl0ZXJhdG9yID0gIUJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgJiYgbmF0aXZlSXRlcmF0b3IgfHwgZ2V0SXRlcmF0aW9uTWV0aG9kKERFRkFVTFQpO1xuICB2YXIgYW55TmF0aXZlSXRlcmF0b3IgPSBOQU1FID09ICdBcnJheScgPyBJdGVyYWJsZVByb3RvdHlwZS5lbnRyaWVzIHx8IG5hdGl2ZUl0ZXJhdG9yIDogbmF0aXZlSXRlcmF0b3I7XG4gIHZhciBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIG1ldGhvZHMsIEtFWTtcblxuICAvLyBmaXggbmF0aXZlXG4gIGlmIChhbnlOYXRpdmVJdGVyYXRvcikge1xuICAgIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGFueU5hdGl2ZUl0ZXJhdG9yLmNhbGwobmV3IEl0ZXJhYmxlKCkpKTtcbiAgICBpZiAoSXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIGlmICghSVNfUFVSRSAmJiBnZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUpICE9PSBJdGVyYXRvclByb3RvdHlwZSkge1xuICAgICAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgICAgICBzZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIHRydWUsIHRydWUpO1xuICAgICAgaWYgKElTX1BVUkUpIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7XG4gICAgfVxuICB9XG5cbiAgLy8gZml4IEFycmF5I3t2YWx1ZXMsIEBAaXRlcmF0b3J9Lm5hbWUgaW4gVjggLyBGRlxuICBpZiAoREVGQVVMVCA9PSBWQUxVRVMgJiYgbmF0aXZlSXRlcmF0b3IgJiYgbmF0aXZlSXRlcmF0b3IubmFtZSAhPT0gVkFMVUVTKSB7XG4gICAgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gdHJ1ZTtcbiAgICBkZWZhdWx0SXRlcmF0b3IgPSBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuYXRpdmVJdGVyYXRvci5jYWxsKHRoaXMpOyB9O1xuICB9XG5cbiAgLy8gZGVmaW5lIGl0ZXJhdG9yXG4gIGlmICgoIUlTX1BVUkUgfHwgRk9SQ0VEKSAmJiBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl0gIT09IGRlZmF1bHRJdGVyYXRvcikge1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShJdGVyYWJsZVByb3RvdHlwZSwgSVRFUkFUT1IsIGRlZmF1bHRJdGVyYXRvcik7XG4gIH1cbiAgSXRlcmF0b3JzW05BTUVdID0gZGVmYXVsdEl0ZXJhdG9yO1xuXG4gIC8vIGV4cG9ydCBhZGRpdGlvbmFsIG1ldGhvZHNcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBnZXRJdGVyYXRpb25NZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/IGRlZmF1bHRJdGVyYXRvciA6IGdldEl0ZXJhdGlvbk1ldGhvZChLRVlTKSxcbiAgICAgIGVudHJpZXM6IGdldEl0ZXJhdGlvbk1ldGhvZChFTlRSSUVTKVxuICAgIH07XG4gICAgaWYgKEZPUkNFRCkgZm9yIChLRVkgaW4gbWV0aG9kcykge1xuICAgICAgaWYgKEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgfHwgSU5DT1JSRUNUX1ZBTFVFU19OQU1FIHx8ICEoS0VZIGluIEl0ZXJhYmxlUHJvdG90eXBlKSkge1xuICAgICAgICByZWRlZmluZShJdGVyYWJsZVByb3RvdHlwZSwgS0VZLCBtZXRob2RzW0tFWV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSAkKHsgdGFyZ2V0OiBOQU1FLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB9LCBtZXRob2RzKTtcbiAgfVxuXG4gIHJldHVybiBtZXRob2RzO1xufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG4vLyBEZXRlY3QgSUU4J3MgaW5jb21wbGV0ZSBkZWZpbmVQcm9wZXJ0eSBpbXBsZW1lbnRhdGlvblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAxLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KVsxXSAhPSA3O1xufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBFWElTVFMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBFWElTVFMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTtcbiIsIi8vIGl0ZXJhYmxlIERPTSBjb2xsZWN0aW9uc1xuLy8gZmxhZyAtIGBpdGVyYWJsZWAgaW50ZXJmYWNlIC0gJ2VudHJpZXMnLCAna2V5cycsICd2YWx1ZXMnLCAnZm9yRWFjaCcgbWV0aG9kc1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIENTU1J1bGVMaXN0OiAwLFxuICBDU1NTdHlsZURlY2xhcmF0aW9uOiAwLFxuICBDU1NWYWx1ZUxpc3Q6IDAsXG4gIENsaWVudFJlY3RMaXN0OiAwLFxuICBET01SZWN0TGlzdDogMCxcbiAgRE9NU3RyaW5nTGlzdDogMCxcbiAgRE9NVG9rZW5MaXN0OiAxLFxuICBEYXRhVHJhbnNmZXJJdGVtTGlzdDogMCxcbiAgRmlsZUxpc3Q6IDAsXG4gIEhUTUxBbGxDb2xsZWN0aW9uOiAwLFxuICBIVE1MQ29sbGVjdGlvbjogMCxcbiAgSFRNTEZvcm1FbGVtZW50OiAwLFxuICBIVE1MU2VsZWN0RWxlbWVudDogMCxcbiAgTWVkaWFMaXN0OiAwLFxuICBNaW1lVHlwZUFycmF5OiAwLFxuICBOYW1lZE5vZGVNYXA6IDAsXG4gIE5vZGVMaXN0OiAxLFxuICBQYWludFJlcXVlc3RMaXN0OiAwLFxuICBQbHVnaW46IDAsXG4gIFBsdWdpbkFycmF5OiAwLFxuICBTVkdMZW5ndGhMaXN0OiAwLFxuICBTVkdOdW1iZXJMaXN0OiAwLFxuICBTVkdQYXRoU2VnTGlzdDogMCxcbiAgU1ZHUG9pbnRMaXN0OiAwLFxuICBTVkdTdHJpbmdMaXN0OiAwLFxuICBTVkdUcmFuc2Zvcm1MaXN0OiAwLFxuICBTb3VyY2VCdWZmZXJMaXN0OiAwLFxuICBTdHlsZVNoZWV0TGlzdDogMCxcbiAgVGV4dFRyYWNrQ3VlTGlzdDogMCxcbiAgVGV4dFRyYWNrTGlzdDogMCxcbiAgVG91Y2hMaXN0OiAwXG59O1xuIiwidmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IC8oaXBob25lfGlwb2R8aXBhZCkuKmFwcGxld2Via2l0L2kudGVzdCh1c2VyQWdlbnQpO1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3NvZihnbG9iYWwucHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xuIiwidmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IC93ZWIwcyg/IS4qY2hyb21lKS9pLnRlc3QodXNlckFnZW50KTtcbiIsInZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ25hdmlnYXRvcicsICd1c2VyQWdlbnQnKSB8fCAnJztcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50Jyk7XG5cbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgdmVyc2lvbnMgPSBwcm9jZXNzICYmIHByb2Nlc3MudmVyc2lvbnM7XG52YXIgdjggPSB2ZXJzaW9ucyAmJiB2ZXJzaW9ucy52ODtcbnZhciBtYXRjaCwgdmVyc2lvbjtcblxuaWYgKHY4KSB7XG4gIG1hdGNoID0gdjguc3BsaXQoJy4nKTtcbiAgdmVyc2lvbiA9IG1hdGNoWzBdICsgbWF0Y2hbMV07XG59IGVsc2UgaWYgKHVzZXJBZ2VudCkge1xuICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvRWRnZVxcLyhcXGQrKS8pO1xuICBpZiAoIW1hdGNoIHx8IG1hdGNoWzFdID49IDc0KSB7XG4gICAgbWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0Nocm9tZVxcLyhcXGQrKS8pO1xuICAgIGlmIChtYXRjaCkgdmVyc2lvbiA9IG1hdGNoWzFdO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmVyc2lvbiAmJiArdmVyc2lvbjtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcblxudmFyIGNhbGwgPSBGdW5jdGlvbi5jYWxsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUiwgTUVUSE9ELCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJpbmQoY2FsbCwgZ2xvYmFsW0NPTlNUUlVDVE9SXS5wcm90b3R5cGVbTUVUSE9EXSwgbGVuZ3RoKTtcbn07XG4iLCIvLyBJRTgtIGRvbid0IGVudW0gYnVnIGtleXNcbm1vZHVsZS5leHBvcnRzID0gW1xuICAnY29uc3RydWN0b3InLFxuICAnaGFzT3duUHJvcGVydHknLFxuICAnaXNQcm90b3R5cGVPZicsXG4gICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXG4gICd0b0xvY2FsZVN0cmluZycsXG4gICd0b1N0cmluZycsXG4gICd2YWx1ZU9mJ1xuXTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKS5mO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHNldEdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZ2xvYmFsJyk7XG52YXIgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMnKTtcbnZhciBpc0ZvcmNlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1mb3JjZWQnKTtcblxuLypcbiAgb3B0aW9ucy50YXJnZXQgICAgICAtIG5hbWUgb2YgdGhlIHRhcmdldCBvYmplY3RcbiAgb3B0aW9ucy5nbG9iYWwgICAgICAtIHRhcmdldCBpcyB0aGUgZ2xvYmFsIG9iamVjdFxuICBvcHRpb25zLnN0YXQgICAgICAgIC0gZXhwb3J0IGFzIHN0YXRpYyBtZXRob2RzIG9mIHRhcmdldFxuICBvcHRpb25zLnByb3RvICAgICAgIC0gZXhwb3J0IGFzIHByb3RvdHlwZSBtZXRob2RzIG9mIHRhcmdldFxuICBvcHRpb25zLnJlYWwgICAgICAgIC0gcmVhbCBwcm90b3R5cGUgbWV0aG9kIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy5mb3JjZWQgICAgICAtIGV4cG9ydCBldmVuIGlmIHRoZSBuYXRpdmUgZmVhdHVyZSBpcyBhdmFpbGFibGVcbiAgb3B0aW9ucy5iaW5kICAgICAgICAtIGJpbmQgbWV0aG9kcyB0byB0aGUgdGFyZ2V0LCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMud3JhcCAgICAgICAgLSB3cmFwIGNvbnN0cnVjdG9ycyB0byBwcmV2ZW50aW5nIGdsb2JhbCBwb2xsdXRpb24sIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy51bnNhZmUgICAgICAtIHVzZSB0aGUgc2ltcGxlIGFzc2lnbm1lbnQgb2YgcHJvcGVydHkgaW5zdGVhZCBvZiBkZWxldGUgKyBkZWZpbmVQcm9wZXJ0eVxuICBvcHRpb25zLnNoYW0gICAgICAgIC0gYWRkIGEgZmxhZyB0byBub3QgY29tcGxldGVseSBmdWxsIHBvbHlmaWxsc1xuICBvcHRpb25zLmVudW1lcmFibGUgIC0gZXhwb3J0IGFzIGVudW1lcmFibGUgcHJvcGVydHlcbiAgb3B0aW9ucy5ub1RhcmdldEdldCAtIHByZXZlbnQgY2FsbGluZyBhIGdldHRlciBvbiB0YXJnZXRcbiovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcHRpb25zLCBzb3VyY2UpIHtcbiAgdmFyIFRBUkdFVCA9IG9wdGlvbnMudGFyZ2V0O1xuICB2YXIgR0xPQkFMID0gb3B0aW9ucy5nbG9iYWw7XG4gIHZhciBTVEFUSUMgPSBvcHRpb25zLnN0YXQ7XG4gIHZhciBGT1JDRUQsIHRhcmdldCwga2V5LCB0YXJnZXRQcm9wZXJ0eSwgc291cmNlUHJvcGVydHksIGRlc2NyaXB0b3I7XG4gIGlmIChHTE9CQUwpIHtcbiAgICB0YXJnZXQgPSBnbG9iYWw7XG4gIH0gZWxzZSBpZiAoU1RBVElDKSB7XG4gICAgdGFyZ2V0ID0gZ2xvYmFsW1RBUkdFVF0gfHwgc2V0R2xvYmFsKFRBUkdFVCwge30pO1xuICB9IGVsc2Uge1xuICAgIHRhcmdldCA9IChnbG9iYWxbVEFSR0VUXSB8fCB7fSkucHJvdG90eXBlO1xuICB9XG4gIGlmICh0YXJnZXQpIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgIHNvdXJjZVByb3BlcnR5ID0gc291cmNlW2tleV07XG4gICAgaWYgKG9wdGlvbnMubm9UYXJnZXRHZXQpIHtcbiAgICAgIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpO1xuICAgICAgdGFyZ2V0UHJvcGVydHkgPSBkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IudmFsdWU7XG4gICAgfSBlbHNlIHRhcmdldFByb3BlcnR5ID0gdGFyZ2V0W2tleV07XG4gICAgRk9SQ0VEID0gaXNGb3JjZWQoR0xPQkFMID8ga2V5IDogVEFSR0VUICsgKFNUQVRJQyA/ICcuJyA6ICcjJykgKyBrZXksIG9wdGlvbnMuZm9yY2VkKTtcbiAgICAvLyBjb250YWluZWQgaW4gdGFyZ2V0XG4gICAgaWYgKCFGT1JDRUQgJiYgdGFyZ2V0UHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBzb3VyY2VQcm9wZXJ0eSA9PT0gdHlwZW9mIHRhcmdldFByb3BlcnR5KSBjb250aW51ZTtcbiAgICAgIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoc291cmNlUHJvcGVydHksIHRhcmdldFByb3BlcnR5KTtcbiAgICB9XG4gICAgLy8gYWRkIGEgZmxhZyB0byBub3QgY29tcGxldGVseSBmdWxsIHBvbHlmaWxsc1xuICAgIGlmIChvcHRpb25zLnNoYW0gfHwgKHRhcmdldFByb3BlcnR5ICYmIHRhcmdldFByb3BlcnR5LnNoYW0pKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoc291cmNlUHJvcGVydHksICdzaGFtJywgdHJ1ZSk7XG4gICAgfVxuICAgIC8vIGV4dGVuZCBnbG9iYWxcbiAgICByZWRlZmluZSh0YXJnZXQsIGtleSwgc291cmNlUHJvcGVydHksIG9wdGlvbnMpO1xuICB9XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiIsInZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xuXG4vLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQpO1xuICAgIH07XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbnZhciBzbGljZSA9IFtdLnNsaWNlO1xudmFyIGZhY3RvcmllcyA9IHt9O1xuXG52YXIgY29uc3RydWN0ID0gZnVuY3Rpb24gKEMsIGFyZ3NMZW5ndGgsIGFyZ3MpIHtcbiAgaWYgKCEoYXJnc0xlbmd0aCBpbiBmYWN0b3JpZXMpKSB7XG4gICAgZm9yICh2YXIgbGlzdCA9IFtdLCBpID0gMDsgaSA8IGFyZ3NMZW5ndGg7IGkrKykgbGlzdFtpXSA9ICdhWycgKyBpICsgJ10nO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgIGZhY3Rvcmllc1thcmdzTGVuZ3RoXSA9IEZ1bmN0aW9uKCdDLGEnLCAncmV0dXJuIG5ldyBDKCcgKyBsaXN0LmpvaW4oJywnKSArICcpJyk7XG4gIH0gcmV0dXJuIGZhY3Rvcmllc1thcmdzTGVuZ3RoXShDLCBhcmdzKTtcbn07XG5cbi8vIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uLmJpbmQgfHwgZnVuY3Rpb24gYmluZCh0aGF0IC8qICwgLi4uYXJncyAqLykge1xuICB2YXIgZm4gPSBhRnVuY3Rpb24odGhpcyk7XG4gIHZhciBwYXJ0QXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgdmFyIGJvdW5kRnVuY3Rpb24gPSBmdW5jdGlvbiBib3VuZCgvKiBhcmdzLi4uICovKSB7XG4gICAgdmFyIGFyZ3MgPSBwYXJ0QXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGJvdW5kRnVuY3Rpb24gPyBjb25zdHJ1Y3QoZm4sIGFyZ3MubGVuZ3RoLCBhcmdzKSA6IGZuLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICB9O1xuICBpZiAoaXNPYmplY3QoZm4ucHJvdG90eXBlKSkgYm91bmRGdW5jdGlvbi5wcm90b3R5cGUgPSBmbi5wcm90b3R5cGU7XG4gIHJldHVybiBib3VuZEZ1bmN0aW9uO1xufTtcbiIsInZhciBwYXRoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BhdGgnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbnZhciBhRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFyaWFibGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YXJpYWJsZSA9PSAnZnVuY3Rpb24nID8gdmFyaWFibGUgOiB1bmRlZmluZWQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lc3BhY2UsIG1ldGhvZCkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBhRnVuY3Rpb24ocGF0aFtuYW1lc3BhY2VdKSB8fCBhRnVuY3Rpb24oZ2xvYmFsW25hbWVzcGFjZV0pXG4gICAgOiBwYXRoW25hbWVzcGFjZV0gJiYgcGF0aFtuYW1lc3BhY2VdW21ldGhvZF0gfHwgZ2xvYmFsW25hbWVzcGFjZV0gJiYgZ2xvYmFsW25hbWVzcGFjZV1bbWV0aG9kXTtcbn07XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCAhPSB1bmRlZmluZWQpIHJldHVybiBpdFtJVEVSQVRPUl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07XG4iLCJ2YXIgY2hlY2sgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICYmIGl0Lk1hdGggPT0gTWF0aCAmJiBpdDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG5tb2R1bGUuZXhwb3J0cyA9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICBjaGVjayh0eXBlb2YgZ2xvYmFsVGhpcyA9PSAnb2JqZWN0JyAmJiBnbG9iYWxUaGlzKSB8fFxuICBjaGVjayh0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdykgfHxcbiAgY2hlY2sodHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZikgfHxcbiAgY2hlY2sodHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSkoKSB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuIiwidmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgdmFyIGNvbnNvbGUgPSBnbG9iYWwuY29uc29sZTtcbiAgaWYgKGNvbnNvbGUgJiYgY29uc29sZS5lcnJvcikge1xuICAgIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBjb25zb2xlLmVycm9yKGEpIDogY29uc29sZS5lcnJvcihhLCBiKTtcbiAgfVxufTtcbiIsInZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ2RvY3VtZW50JywgJ2RvY3VtZW50RWxlbWVudCcpO1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG5cbi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIURFU0NSSVBUT1JTICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3JlYXRlRWxlbWVudCgnZGl2JyksICdhJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfVxuICB9KS5hICE9IDc7XG59KTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxudmFyIHNwbGl0ID0gJycuc3BsaXQ7XG5cbi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG5tb2R1bGUuZXhwb3J0cyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gdGhyb3dzIGFuIGVycm9yIGluIHJoaW5vLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvcmhpbm8vaXNzdWVzLzM0NlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gIHJldHVybiAhT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCk7XG59KSA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gY2xhc3NvZihpdCkgPT0gJ1N0cmluZycgPyBzcGxpdC5jYWxsKGl0LCAnJykgOiBPYmplY3QoaXQpO1xufSA6IE9iamVjdDtcbiIsInZhciBzdG9yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcblxudmFyIGZ1bmN0aW9uVG9TdHJpbmcgPSBGdW5jdGlvbi50b1N0cmluZztcblxuLy8gdGhpcyBoZWxwZXIgYnJva2VuIGluIGAzLjQuMS0zLjQuNGAsIHNvIHdlIGNhbid0IHVzZSBgc2hhcmVkYCBoZWxwZXJcbmlmICh0eXBlb2Ygc3RvcmUuaW5zcGVjdFNvdXJjZSAhPSAnZnVuY3Rpb24nKSB7XG4gIHN0b3JlLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb25Ub1N0cmluZy5jYWxsKGl0KTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdG9yZS5pbnNwZWN0U291cmNlO1xuIiwidmFyIE5BVElWRV9XRUFLX01BUCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIG9iamVjdEhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG5cbnZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7XG52YXIgc2V0LCBnZXQsIGhhcztcblxudmFyIGVuZm9yY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGhhcyhpdCkgPyBnZXQoaXQpIDogc2V0KGl0LCB7fSk7XG59O1xuXG52YXIgZ2V0dGVyRm9yID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHZhciBzdGF0ZTtcbiAgICBpZiAoIWlzT2JqZWN0KGl0KSB8fCAoc3RhdGUgPSBnZXQoaXQpKS50eXBlICE9PSBUWVBFKSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29tcGF0aWJsZSByZWNlaXZlciwgJyArIFRZUEUgKyAnIHJlcXVpcmVkJyk7XG4gICAgfSByZXR1cm4gc3RhdGU7XG4gIH07XG59O1xuXG5pZiAoTkFUSVZFX1dFQUtfTUFQKSB7XG4gIHZhciBzdG9yZSA9IHNoYXJlZC5zdGF0ZSB8fCAoc2hhcmVkLnN0YXRlID0gbmV3IFdlYWtNYXAoKSk7XG4gIHZhciB3bWdldCA9IHN0b3JlLmdldDtcbiAgdmFyIHdtaGFzID0gc3RvcmUuaGFzO1xuICB2YXIgd21zZXQgPSBzdG9yZS5zZXQ7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBtZXRhZGF0YS5mYWNhZGUgPSBpdDtcbiAgICB3bXNldC5jYWxsKHN0b3JlLCBpdCwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHdtZ2V0LmNhbGwoc3RvcmUsIGl0KSB8fCB7fTtcbiAgfTtcbiAgaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHdtaGFzLmNhbGwoc3RvcmUsIGl0KTtcbiAgfTtcbn0gZWxzZSB7XG4gIHZhciBTVEFURSA9IHNoYXJlZEtleSgnc3RhdGUnKTtcbiAgaGlkZGVuS2V5c1tTVEFURV0gPSB0cnVlO1xuICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gICAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGl0LCBTVEFURSwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIG9iamVjdEhhcyhpdCwgU1RBVEUpID8gaXRbU1RBVEVdIDoge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBvYmplY3RIYXMoaXQsIFNUQVRFKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBnZXQ6IGdldCxcbiAgaGFzOiBoYXMsXG4gIGVuZm9yY2U6IGVuZm9yY2UsXG4gIGdldHRlckZvcjogZ2V0dGVyRm9yXG59O1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG4vLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvdHlwZVtJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG4vLyBgSXNBcnJheWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzYXJyYXlcbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZykge1xuICByZXR1cm4gY2xhc3NvZihhcmcpID09ICdBcnJheSc7XG59O1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciByZXBsYWNlbWVudCA9IC8jfFxcLnByb3RvdHlwZVxcLi87XG5cbnZhciBpc0ZvcmNlZCA9IGZ1bmN0aW9uIChmZWF0dXJlLCBkZXRlY3Rpb24pIHtcbiAgdmFyIHZhbHVlID0gZGF0YVtub3JtYWxpemUoZmVhdHVyZSldO1xuICByZXR1cm4gdmFsdWUgPT0gUE9MWUZJTEwgPyB0cnVlXG4gICAgOiB2YWx1ZSA9PSBOQVRJVkUgPyBmYWxzZVxuICAgIDogdHlwZW9mIGRldGVjdGlvbiA9PSAnZnVuY3Rpb24nID8gZmFpbHMoZGV0ZWN0aW9uKVxuICAgIDogISFkZXRlY3Rpb247XG59O1xuXG52YXIgbm9ybWFsaXplID0gaXNGb3JjZWQubm9ybWFsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZShyZXBsYWNlbWVudCwgJy4nKS50b0xvd2VyQ2FzZSgpO1xufTtcblxudmFyIGRhdGEgPSBpc0ZvcmNlZC5kYXRhID0ge307XG52YXIgTkFUSVZFID0gaXNGb3JjZWQuTkFUSVZFID0gJ04nO1xudmFyIFBPTFlGSUxMID0gaXNGb3JjZWQuUE9MWUZJTEwgPSAnUCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGb3JjZWQ7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZmFsc2U7XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXNBcnJheUl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIGl0ZXJhdG9yQ2xvc2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3ItY2xvc2UnKTtcblxudmFyIFJlc3VsdCA9IGZ1bmN0aW9uIChzdG9wcGVkLCByZXN1bHQpIHtcbiAgdGhpcy5zdG9wcGVkID0gc3RvcHBlZDtcbiAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYWJsZSwgdW5ib3VuZEZ1bmN0aW9uLCBvcHRpb25zKSB7XG4gIHZhciB0aGF0ID0gb3B0aW9ucyAmJiBvcHRpb25zLnRoYXQ7XG4gIHZhciBBU19FTlRSSUVTID0gISEob3B0aW9ucyAmJiBvcHRpb25zLkFTX0VOVFJJRVMpO1xuICB2YXIgSVNfSVRFUkFUT1IgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSVNfSVRFUkFUT1IpO1xuICB2YXIgSU5URVJSVVBURUQgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSU5URVJSVVBURUQpO1xuICB2YXIgZm4gPSBiaW5kKHVuYm91bmRGdW5jdGlvbiwgdGhhdCwgMSArIEFTX0VOVFJJRVMgKyBJTlRFUlJVUFRFRCk7XG4gIHZhciBpdGVyYXRvciwgaXRlckZuLCBpbmRleCwgbGVuZ3RoLCByZXN1bHQsIG5leHQsIHN0ZXA7XG5cbiAgdmFyIHN0b3AgPSBmdW5jdGlvbiAoY29uZGl0aW9uKSB7XG4gICAgaWYgKGl0ZXJhdG9yKSBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yKTtcbiAgICByZXR1cm4gbmV3IFJlc3VsdCh0cnVlLCBjb25kaXRpb24pO1xuICB9O1xuXG4gIHZhciBjYWxsRm4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAoQVNfRU5UUklFUykge1xuICAgICAgYW5PYmplY3QodmFsdWUpO1xuICAgICAgcmV0dXJuIElOVEVSUlVQVEVEID8gZm4odmFsdWVbMF0sIHZhbHVlWzFdLCBzdG9wKSA6IGZuKHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG4gICAgfSByZXR1cm4gSU5URVJSVVBURUQgPyBmbih2YWx1ZSwgc3RvcCkgOiBmbih2YWx1ZSk7XG4gIH07XG5cbiAgaWYgKElTX0lURVJBVE9SKSB7XG4gICAgaXRlcmF0b3IgPSBpdGVyYWJsZTtcbiAgfSBlbHNlIHtcbiAgICBpdGVyRm4gPSBnZXRJdGVyYXRvck1ldGhvZChpdGVyYWJsZSk7XG4gICAgaWYgKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKCdUYXJnZXQgaXMgbm90IGl0ZXJhYmxlJyk7XG4gICAgLy8gb3B0aW1pc2F0aW9uIGZvciBhcnJheSBpdGVyYXRvcnNcbiAgICBpZiAoaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJGbikpIHtcbiAgICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSB0b0xlbmd0aChpdGVyYWJsZS5sZW5ndGgpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgICByZXN1bHQgPSBjYWxsRm4oaXRlcmFibGVbaW5kZXhdKTtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQgaW5zdGFuY2VvZiBSZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICB9IHJldHVybiBuZXcgUmVzdWx0KGZhbHNlKTtcbiAgICB9XG4gICAgaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7XG4gIH1cblxuICBuZXh0ID0gaXRlcmF0b3IubmV4dDtcbiAgd2hpbGUgKCEoc3RlcCA9IG5leHQuY2FsbChpdGVyYXRvcikpLmRvbmUpIHtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gY2FsbEZuKHN0ZXAudmFsdWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PSAnb2JqZWN0JyAmJiByZXN1bHQgJiYgcmVzdWx0IGluc3RhbmNlb2YgUmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICB9IHJldHVybiBuZXcgUmVzdWx0KGZhbHNlKTtcbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yKSB7XG4gIHZhciByZXR1cm5NZXRob2QgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gIGlmIChyZXR1cm5NZXRob2QgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBhbk9iamVjdChyZXR1cm5NZXRob2QuY2FsbChpdGVyYXRvcikpLnZhbHVlO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IGZhbHNlO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbi8vIGAlSXRlcmF0b3JQcm90b3R5cGUlYCBvYmplY3Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJWl0ZXJhdG9ycHJvdG90eXBlJS1vYmplY3RcbnZhciBJdGVyYXRvclByb3RvdHlwZSwgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlLCBhcnJheUl0ZXJhdG9yO1xuXG5pZiAoW10ua2V5cykge1xuICBhcnJheUl0ZXJhdG9yID0gW10ua2V5cygpO1xuICAvLyBTYWZhcmkgOCBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbiAgaWYgKCEoJ25leHQnIGluIGFycmF5SXRlcmF0b3IpKSBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gdHJ1ZTtcbiAgZWxzZSB7XG4gICAgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoZ2V0UHJvdG90eXBlT2YoYXJyYXlJdGVyYXRvcikpO1xuICAgIGlmIChQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpIEl0ZXJhdG9yUHJvdG90eXBlID0gUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG59XG5cbnZhciBORVdfSVRFUkFUT1JfUFJPVE9UWVBFID0gSXRlcmF0b3JQcm90b3R5cGUgPT0gdW5kZWZpbmVkIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRlc3QgPSB7fTtcbiAgLy8gRkY0NC0gbGVnYWN5IGl0ZXJhdG9ycyBjYXNlXG4gIHJldHVybiBJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0uY2FsbCh0ZXN0KSAhPT0gdGVzdDtcbn0pO1xuXG5pZiAoTkVXX0lURVJBVE9SX1BST1RPVFlQRSkgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcbmlmICgoIUlTX1BVUkUgfHwgTkVXX0lURVJBVE9SX1BST1RPVFlQRSkgJiYgIWhhcyhJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IpKSB7XG4gIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgSXRlcmF0b3JQcm90b3R5cGU6IEl0ZXJhdG9yUHJvdG90eXBlLFxuICBCVUdHWV9TQUZBUklfSVRFUkFUT1JTOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKS5mO1xudmFyIG1hY3JvdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90YXNrJykuc2V0O1xudmFyIElTX0lPUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtaW9zJyk7XG52YXIgSVNfV0VCT1NfV0VCS0lUID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy13ZWJvcy13ZWJraXQnKTtcbnZhciBJU19OT0RFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlJyk7XG5cbnZhciBNdXRhdGlvbk9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIFByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcbi8vIE5vZGUuanMgMTEgc2hvd3MgRXhwZXJpbWVudGFsV2FybmluZyBvbiBnZXR0aW5nIGBxdWV1ZU1pY3JvdGFza2BcbnZhciBxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZ2xvYmFsLCAncXVldWVNaWNyb3Rhc2snKTtcbnZhciBxdWV1ZU1pY3JvdGFzayA9IHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvciAmJiBxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IudmFsdWU7XG5cbnZhciBmbHVzaCwgaGVhZCwgbGFzdCwgbm90aWZ5LCB0b2dnbGUsIG5vZGUsIHByb21pc2UsIHRoZW47XG5cbi8vIG1vZGVybiBlbmdpbmVzIGhhdmUgcXVldWVNaWNyb3Rhc2sgbWV0aG9kXG5pZiAoIXF1ZXVlTWljcm90YXNrKSB7XG4gIGZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnQsIGZuO1xuICAgIGlmIChJU19OT0RFICYmIChwYXJlbnQgPSBwcm9jZXNzLmRvbWFpbikpIHBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUgKGhlYWQpIHtcbiAgICAgIGZuID0gaGVhZC5mbjtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGhlYWQpIG5vdGlmeSgpO1xuICAgICAgICBlbHNlIGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gbGFzdCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQuZW50ZXIoKTtcbiAgfTtcblxuICAvLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXIsIGV4Y2VwdCBpT1MgLSBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMzM5XG4gIC8vIGFsc28gZXhjZXB0IFdlYk9TIFdlYmtpdCBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODk4XG4gIGlmICghSVNfSU9TICYmICFJU19OT0RFICYmICFJU19XRUJPU19XRUJLSVQgJiYgTXV0YXRpb25PYnNlcnZlciAmJiBkb2N1bWVudCkge1xuICAgIHRvZ2dsZSA9IHRydWU7XG4gICAgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgTXV0YXRpb25PYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYgKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKSB7XG4gICAgLy8gUHJvbWlzZS5yZXNvbHZlIHdpdGhvdXQgYW4gYXJndW1lbnQgdGhyb3dzIGFuIGVycm9yIGluIExHIFdlYk9TIDJcbiAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgdGhlbiA9IHByb21pc2UudGhlbjtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGVuLmNhbGwocHJvbWlzZSwgZmx1c2gpO1xuICAgIH07XG4gIC8vIE5vZGUuanMgd2l0aG91dCBwcm9taXNlc1xuICB9IGVsc2UgaWYgKElTX05PREUpIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgICAgbWFjcm90YXNrLmNhbGwoZ2xvYmFsLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHF1ZXVlTWljcm90YXNrIHx8IGZ1bmN0aW9uIChmbikge1xuICB2YXIgdGFzayA9IHsgZm46IGZuLCBuZXh0OiB1bmRlZmluZWQgfTtcbiAgaWYgKGxhc3QpIGxhc3QubmV4dCA9IHRhc2s7XG4gIGlmICghaGVhZCkge1xuICAgIGhlYWQgPSB0YXNrO1xuICAgIG5vdGlmeSgpO1xuICB9IGxhc3QgPSB0YXNrO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLlByb21pc2U7XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gQ2hyb21lIDM4IFN5bWJvbCBoYXMgaW5jb3JyZWN0IHRvU3RyaW5nIGNvbnZlcnNpb25cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHJldHVybiAhU3RyaW5nKFN5bWJvbCgpKTtcbn0pO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG5cbnZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7XG5cbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KGluc3BlY3RTb3VyY2UoV2Vha01hcCkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG5cbnZhciBQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7XG4gIHZhciByZXNvbHZlLCByZWplY3Q7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBDKGZ1bmN0aW9uICgkJHJlc29sdmUsICQkcmVqZWN0KSB7XG4gICAgaWYgKHJlc29sdmUgIT09IHVuZGVmaW5lZCB8fCByZWplY3QgIT09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ID0gJCRyZWplY3Q7XG4gIH0pO1xuICB0aGlzLnJlc29sdmUgPSBhRnVuY3Rpb24ocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ID0gYUZ1bmN0aW9uKHJlamVjdCk7XG59O1xuXG4vLyAyNS40LjEuNSBOZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIChDKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcblxudmFyIG5hdGl2ZUFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbi8vIGBPYmplY3QuYXNzaWduYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmFzc2lnblxubW9kdWxlLmV4cG9ydHMgPSAhbmF0aXZlQXNzaWduIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gc2hvdWxkIGhhdmUgY29ycmVjdCBvcmRlciBvZiBvcGVyYXRpb25zIChFZGdlIGJ1ZylcbiAgaWYgKERFU0NSSVBUT1JTICYmIG5hdGl2ZUFzc2lnbih7IGI6IDEgfSwgbmF0aXZlQXNzaWduKGRlZmluZVByb3BlcnR5KHt9LCAnYScsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgZGVmaW5lUHJvcGVydHkodGhpcywgJ2InLCB7XG4gICAgICAgIHZhbHVlOiAzLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9KSwgeyBiOiAyIH0pKS5iICE9PSAxKSByZXR1cm4gdHJ1ZTtcbiAgLy8gc2hvdWxkIHdvcmsgd2l0aCBzeW1ib2xzIGFuZCBzaG91bGQgaGF2ZSBkZXRlcm1pbmlzdGljIHByb3BlcnR5IG9yZGVyIChWOCBidWcpXG4gIHZhciBBID0ge307XG4gIHZhciBCID0ge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICB2YXIgc3ltYm9sID0gU3ltYm9sKCk7XG4gIHZhciBhbHBoYWJldCA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbc3ltYm9sXSA9IDc7XG4gIGFscGhhYmV0LnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChjaHIpIHsgQltjaHJdID0gY2hyOyB9KTtcbiAgcmV0dXJuIG5hdGl2ZUFzc2lnbih7fSwgQSlbc3ltYm9sXSAhPSA3IHx8IG9iamVjdEtleXMobmF0aXZlQXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gYWxwaGFiZXQ7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHZhciBUID0gdG9PYmplY3QodGFyZ2V0KTtcbiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDE7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgdmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZjtcbiAgd2hpbGUgKGFyZ3VtZW50c0xlbmd0aCA+IGluZGV4KSB7XG4gICAgdmFyIFMgPSBJbmRleGVkT2JqZWN0KGFyZ3VtZW50c1tpbmRleCsrXSk7XG4gICAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBvYmplY3RLZXlzKFMpLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoUykpIDogb2JqZWN0S2V5cyhTKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGogPSAwO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGopIHtcbiAgICAgIGtleSA9IGtleXNbaisrXTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMgfHwgcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChTLCBrZXkpKSBUW2tleV0gPSBTW2tleV07XG4gICAgfVxuICB9IHJldHVybiBUO1xufSA6IG5hdGl2ZUFzc2lnbjtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBkZWZpbmVQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcycpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9odG1sJyk7XG52YXIgZG9jdW1lbnRDcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcblxudmFyIEdUID0gJz4nO1xudmFyIExUID0gJzwnO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xudmFyIFNDUklQVCA9ICdzY3JpcHQnO1xudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xuXG52YXIgRW1wdHlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxudmFyIHNjcmlwdFRhZyA9IGZ1bmN0aW9uIChjb250ZW50KSB7XG4gIHJldHVybiBMVCArIFNDUklQVCArIEdUICsgY29udGVudCArIExUICsgJy8nICsgU0NSSVBUICsgR1Q7XG59O1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgQWN0aXZlWCBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVggPSBmdW5jdGlvbiAoYWN0aXZlWERvY3VtZW50KSB7XG4gIGFjdGl2ZVhEb2N1bWVudC53cml0ZShzY3JpcHRUYWcoJycpKTtcbiAgYWN0aXZlWERvY3VtZW50LmNsb3NlKCk7XG4gIHZhciB0ZW1wID0gYWN0aXZlWERvY3VtZW50LnBhcmVudFdpbmRvdy5PYmplY3Q7XG4gIGFjdGl2ZVhEb2N1bWVudCA9IG51bGw7IC8vIGF2b2lkIG1lbW9yeSBsZWFrXG4gIHJldHVybiB0ZW1wO1xufTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIE51bGxQcm90b09iamVjdFZpYUlGcmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IGRvY3VtZW50Q3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gIHZhciBKUyA9ICdqYXZhJyArIFNDUklQVCArICc6JztcbiAgdmFyIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaHRtbC5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNDc1XG4gIGlmcmFtZS5zcmMgPSBTdHJpbmcoSlMpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKHNjcmlwdFRhZygnZG9jdW1lbnQuRj1PYmplY3QnKSk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIHJldHVybiBpZnJhbWVEb2N1bWVudC5GO1xufTtcblxuLy8gQ2hlY2sgZm9yIGRvY3VtZW50LmRvbWFpbiBhbmQgYWN0aXZlIHggc3VwcG9ydFxuLy8gTm8gbmVlZCB0byB1c2UgYWN0aXZlIHggYXBwcm9hY2ggd2hlbiBkb2N1bWVudC5kb21haW4gaXMgbm90IHNldFxuLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbS9pc3N1ZXMvMTUwXG4vLyB2YXJpYXRpb24gb2YgaHR0cHM6Ly9naXRodWIuY29tL2tpdGNhbWJyaWRnZS9lczUtc2hpbS9jb21taXQvNGY3MzhhYzA2NjM0NlxuLy8gYXZvaWQgSUUgR0MgYnVnXG52YXIgYWN0aXZlWERvY3VtZW50O1xudmFyIE51bGxQcm90b09iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICAvKiBnbG9iYWwgQWN0aXZlWE9iamVjdCAqL1xuICAgIGFjdGl2ZVhEb2N1bWVudCA9IGRvY3VtZW50LmRvbWFpbiAmJiBuZXcgQWN0aXZlWE9iamVjdCgnaHRtbGZpbGUnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogaWdub3JlICovIH1cbiAgTnVsbFByb3RvT2JqZWN0ID0gYWN0aXZlWERvY3VtZW50ID8gTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWChhY3RpdmVYRG9jdW1lbnQpIDogTnVsbFByb3RvT2JqZWN0VmlhSUZyYW1lKCk7XG4gIHZhciBsZW5ndGggPSBlbnVtQnVnS2V5cy5sZW5ndGg7XG4gIHdoaWxlIChsZW5ndGgtLSkgZGVsZXRlIE51bGxQcm90b09iamVjdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2xlbmd0aF1dO1xuICByZXR1cm4gTnVsbFByb3RvT2JqZWN0KCk7XG59O1xuXG5oaWRkZW5LZXlzW0lFX1BST1RPXSA9IHRydWU7XG5cbi8vIGBPYmplY3QuY3JlYXRlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmNyZWF0ZVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlDb25zdHJ1Y3RvcltQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5Q29uc3RydWN0b3IoKTtcbiAgICBFbXB0eUNvbnN0cnVjdG9yW1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IE51bGxQcm90b09iamVjdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0aWVzXG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzID0gb2JqZWN0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIga2V5O1xuICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIGRlZmluZVByb3BlcnR5TW9kdWxlLmYoTywga2V5ID0ga2V5c1tpbmRleCsrXSwgUHJvcGVydGllc1trZXldKTtcbiAgcmV0dXJuIE87XG59O1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcblxudmFyIG5hdGl2ZURlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG4vLyBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnR5XG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IG5hdGl2ZURlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xuXG52YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yXG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIE8gPSB0b0luZGV4ZWRPYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKGhhcyhPLCBQKSkgcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcighcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07XG4iLCJ2YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpO1xuXG52YXIgaGlkZGVuS2V5cyA9IGVudW1CdWdLZXlzLmNvbmNhdCgnbGVuZ3RoJywgJ3Byb3RvdHlwZScpO1xuXG4vLyBgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHluYW1lc1xuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgaGlkZGVuS2V5cyk7XG59O1xuIiwiZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbiIsInZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyJyk7XG5cbnZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTtcbnZhciBPYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuXG4vLyBgT2JqZWN0LmdldFByb3RvdHlwZU9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldHByb3RvdHlwZW9mXG5tb2R1bGUuZXhwb3J0cyA9IENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIChPKSB7XG4gIE8gPSB0b09iamVjdChPKTtcbiAgaWYgKGhhcyhPLCBJRV9QUk9UTykpIHJldHVybiBPW0lFX1BST1RPXTtcbiAgaWYgKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90b3R5cGUgOiBudWxsO1xufTtcbiIsInZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgaW5kZXhPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcycpLmluZGV4T2Y7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7XG4gIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KG9iamVjdCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBPKSAhaGFzKGhpZGRlbktleXMsIGtleSkgJiYgaGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkgaWYgKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSkge1xuICAgIH5pbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwidmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxuLy8gYE9iamVjdC5rZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmtleXNcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgZW51bUJ1Z0tleXMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIE5hc2hvcm4gfiBKREs4IGJ1Z1xudmFyIE5BU0hPUk5fQlVHID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmICFuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHsgMTogMiB9LCAxKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGVgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLnByb3BlcnR5aXNlbnVtZXJhYmxlXG5leHBvcnRzLmYgPSBOQVNIT1JOX0JVRyA/IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKFYpIHtcbiAgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcywgVik7XG4gIHJldHVybiAhIWRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci5lbnVtZXJhYmxlO1xufSA6IG5hdGl2ZVByb3BlcnR5SXNFbnVtZXJhYmxlO1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGFQb3NzaWJsZVByb3RvdHlwZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLXBvc3NpYmxlLXByb3RvdHlwZScpO1xuXG4vLyBgT2JqZWN0LnNldFByb3RvdHlwZU9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnNldHByb3RvdHlwZW9mXG4vLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyBmdW5jdGlvbiAoKSB7XG4gIHZhciBDT1JSRUNUX1NFVFRFUiA9IGZhbHNlO1xuICB2YXIgdGVzdCA9IHt9O1xuICB2YXIgc2V0dGVyO1xuICB0cnkge1xuICAgIHNldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LnByb3RvdHlwZSwgJ19fcHJvdG9fXycpLnNldDtcbiAgICBzZXR0ZXIuY2FsbCh0ZXN0LCBbXSk7XG4gICAgQ09SUkVDVF9TRVRURVIgPSB0ZXN0IGluc3RhbmNlb2YgQXJyYXk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7XG4gICAgYW5PYmplY3QoTyk7XG4gICAgYVBvc3NpYmxlUHJvdG90eXBlKHByb3RvKTtcbiAgICBpZiAoQ09SUkVDVF9TRVRURVIpIHNldHRlci5jYWxsKE8sIHByb3RvKTtcbiAgICBlbHNlIE8uX19wcm90b19fID0gcHJvdG87XG4gICAgcmV0dXJuIE87XG4gIH07XG59KCkgOiB1bmRlZmluZWQpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IFRPX1NUUklOR19UQUdfU1VQUE9SVCA/IHt9LnRvU3RyaW5nIDogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiAnW29iamVjdCAnICsgY2xhc3NvZih0aGlzKSArICddJztcbn07XG4iLCJ2YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxuLy8gYWxsIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBub24tZW51bWVyYWJsZSBhbmQgc3ltYm9sc1xubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdSZWZsZWN0JywgJ293bktleXMnKSB8fCBmdW5jdGlvbiBvd25LZXlzKGl0KSB7XG4gIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mKGFuT2JqZWN0KGl0KSk7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgcmV0dXJuIGdldE93blByb3BlcnR5U3ltYm9scyA/IGtleXMuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyhpdCkpIDoga2V5cztcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdsb2JhbDtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlcnJvcjogZmFsc2UsIHZhbHVlOiBleGVjKCkgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSwgdmFsdWU6IGVycm9yIH07XG4gIH1cbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7XG4gIGFuT2JqZWN0KEMpO1xuICBpZiAoaXNPYmplY3QoeCkgJiYgeC5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIHg7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7XG4gIHZhciByZXNvbHZlID0gcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgcmVzb2x2ZSh4KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59O1xuIiwidmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc3JjLCBvcHRpb25zKSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzcmNba2V5XSwgb3B0aW9ucyk7XG4gIHJldHVybiB0YXJnZXQ7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHNldEdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZ2xvYmFsJyk7XG52YXIgaW5zcGVjdFNvdXJjZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZScpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcblxudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZW5mb3JjZTtcbnZhciBURU1QTEFURSA9IFN0cmluZyhTdHJpbmcpLnNwbGl0KCdTdHJpbmcnKTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgdmFyIHVuc2FmZSA9IG9wdGlvbnMgPyAhIW9wdGlvbnMudW5zYWZlIDogZmFsc2U7XG4gIHZhciBzaW1wbGUgPSBvcHRpb25zID8gISFvcHRpb25zLmVudW1lcmFibGUgOiBmYWxzZTtcbiAgdmFyIG5vVGFyZ2V0R2V0ID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5ub1RhcmdldEdldCA6IGZhbHNlO1xuICB2YXIgc3RhdGU7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmICh0eXBlb2Yga2V5ID09ICdzdHJpbmcnICYmICFoYXModmFsdWUsICduYW1lJykpIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSh2YWx1ZSwgJ25hbWUnLCBrZXkpO1xuICAgIH1cbiAgICBzdGF0ZSA9IGVuZm9yY2VJbnRlcm5hbFN0YXRlKHZhbHVlKTtcbiAgICBpZiAoIXN0YXRlLnNvdXJjZSkge1xuICAgICAgc3RhdGUuc291cmNlID0gVEVNUExBVEUuam9pbih0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8ga2V5IDogJycpO1xuICAgIH1cbiAgfVxuICBpZiAoTyA9PT0gZ2xvYmFsKSB7XG4gICAgaWYgKHNpbXBsZSkgT1trZXldID0gdmFsdWU7XG4gICAgZWxzZSBzZXRHbG9iYWwoa2V5LCB2YWx1ZSk7XG4gICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKCF1bnNhZmUpIHtcbiAgICBkZWxldGUgT1trZXldO1xuICB9IGVsc2UgaWYgKCFub1RhcmdldEdldCAmJiBPW2tleV0pIHtcbiAgICBzaW1wbGUgPSB0cnVlO1xuICB9XG4gIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICBlbHNlIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShPLCBrZXksIHZhbHVlKTtcbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgJiYgZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zb3VyY2UgfHwgaW5zcGVjdFNvdXJjZSh0aGlzKTtcbn0pO1xuIiwiLy8gYFJlcXVpcmVPYmplY3RDb2VyY2libGVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZXF1aXJlb2JqZWN0Y29lcmNpYmxlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGdsb2JhbCwga2V5LCB2YWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZ2xvYmFsW2tleV0gPSB2YWx1ZTtcbiAgfSByZXR1cm4gdmFsdWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SX05BTUUpIHtcbiAgdmFyIENvbnN0cnVjdG9yID0gZ2V0QnVpbHRJbihDT05TVFJVQ1RPUl9OQU1FKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcblxuICBpZiAoREVTQ1JJUFRPUlMgJiYgQ29uc3RydWN0b3IgJiYgIUNvbnN0cnVjdG9yW1NQRUNJRVNdKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFNQRUNJRVMsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIH0pO1xuICB9XG59O1xuIiwidmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBUQUcsIFNUQVRJQykge1xuICBpZiAoaXQgJiYgIWhhcyhpdCA9IFNUQVRJQyA/IGl0IDogaXQucHJvdG90eXBlLCBUT19TVFJJTkdfVEFHKSkge1xuICAgIGRlZmluZVByb3BlcnR5KGl0LCBUT19TVFJJTkdfVEFHLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IFRBRyB9KTtcbiAgfVxufTtcbiIsInZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xuXG52YXIga2V5cyA9IHNoYXJlZCgna2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIGtleXNba2V5XSB8fCAoa2V5c1trZXldID0gdWlkKGtleSkpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2V0R2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1nbG9iYWwnKTtcblxudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgc2V0R2xvYmFsKFNIQVJFRCwge30pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0b3JlO1xuIiwidmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIHN0b3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZScpO1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KTtcbn0pKCd2ZXJzaW9ucycsIFtdKS5wdXNoKHtcbiAgdmVyc2lvbjogJzMuOC4zJyxcbiAgbW9kZTogSVNfUFVSRSA/ICdwdXJlJyA6ICdnbG9iYWwnLFxuICBjb3B5cmlnaHQ6ICfCqSAyMDIxIERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpJ1xufSk7XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxuLy8gYFNwZWNpZXNDb25zdHJ1Y3RvcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNwZWNpZXNjb25zdHJ1Y3RvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgZGVmYXVsdENvbnN0cnVjdG9yKSB7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3I7XG4gIHZhciBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IGRlZmF1bHRDb25zdHJ1Y3RvciA6IGFGdW5jdGlvbihTKTtcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS57IGNvZGVQb2ludEF0LCBhdCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKENPTlZFUlRfVE9fU1RSSU5HKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIHBvcykge1xuICAgIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoJHRoaXMpKTtcbiAgICB2YXIgcG9zaXRpb24gPSB0b0ludGVnZXIocG9zKTtcbiAgICB2YXIgc2l6ZSA9IFMubGVuZ3RoO1xuICAgIHZhciBmaXJzdCwgc2Vjb25kO1xuICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gc2l6ZSkgcmV0dXJuIENPTlZFUlRfVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgZmlyc3QgPSBTLmNoYXJDb2RlQXQocG9zaXRpb24pO1xuICAgIHJldHVybiBmaXJzdCA8IDB4RDgwMCB8fCBmaXJzdCA+IDB4REJGRiB8fCBwb3NpdGlvbiArIDEgPT09IHNpemVcbiAgICAgIHx8IChzZWNvbmQgPSBTLmNoYXJDb2RlQXQocG9zaXRpb24gKyAxKSkgPCAweERDMDAgfHwgc2Vjb25kID4gMHhERkZGXG4gICAgICAgID8gQ09OVkVSVF9UT19TVFJJTkcgPyBTLmNoYXJBdChwb3NpdGlvbikgOiBmaXJzdFxuICAgICAgICA6IENPTlZFUlRfVE9fU1RSSU5HID8gUy5zbGljZShwb3NpdGlvbiwgcG9zaXRpb24gKyAyKSA6IChmaXJzdCAtIDB4RDgwMCA8PCAxMCkgKyAoc2Vjb25kIC0gMHhEQzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXRgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuY29kZXBvaW50YXRcbiAgY29kZUF0OiBjcmVhdGVNZXRob2QoZmFsc2UpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS5hdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuYXRcbiAgY2hhckF0OiBjcmVhdGVNZXRob2QodHJ1ZSlcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2h0bWwnKTtcbnZhciBjcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG52YXIgSVNfSU9TID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MnKTtcbnZhciBJU19OT0RFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlJyk7XG5cbnZhciBsb2NhdGlvbiA9IGdsb2JhbC5sb2NhdGlvbjtcbnZhciBzZXQgPSBnbG9iYWwuc2V0SW1tZWRpYXRlO1xudmFyIGNsZWFyID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlO1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBNZXNzYWdlQ2hhbm5lbCA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbDtcbnZhciBEaXNwYXRjaCA9IGdsb2JhbC5EaXNwYXRjaDtcbnZhciBjb3VudGVyID0gMDtcbnZhciBxdWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xuXG52YXIgcnVuID0gZnVuY3Rpb24gKGlkKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgaWYgKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG5cbnZhciBydW5uZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBydW4oaWQpO1xuICB9O1xufTtcblxudmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHJ1bihldmVudC5kYXRhKTtcbn07XG5cbnZhciBwb3N0ID0gZnVuY3Rpb24gKGlkKSB7XG4gIC8vIG9sZCBlbmdpbmVzIGhhdmUgbm90IGxvY2F0aW9uLm9yaWdpblxuICBnbG9iYWwucG9zdE1lc3NhZ2UoaWQgKyAnJywgbG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgbG9jYXRpb24uaG9zdCk7XG59O1xuXG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZiAoIXNldCB8fCAhY2xlYXIpIHtcbiAgc2V0ID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICB2YXIgaSA9IDE7XG4gICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgICAgICh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pKS5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgIH07XG4gICAgZGVmZXIoY291bnRlcik7XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH07XG4gIGNsZWFyID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpIHtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYgKElTX05PREUpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhydW5uZXIoaWQpKTtcbiAgICB9O1xuICAvLyBTcGhlcmUgKEpTIGdhbWUgZW5naW5lKSBEaXNwYXRjaCBBUElcbiAgfSBlbHNlIGlmIChEaXNwYXRjaCAmJiBEaXNwYXRjaC5ub3cpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgRGlzcGF0Y2gubm93KHJ1bm5lcihpZCkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgLy8gZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82MjRcbiAgfSBlbHNlIGlmIChNZXNzYWdlQ2hhbm5lbCAmJiAhSVNfSU9TKSB7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGlzdGVuZXI7XG4gICAgZGVmZXIgPSBiaW5kKHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmIChcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJlxuICAgIHR5cGVvZiBwb3N0TWVzc2FnZSA9PSAnZnVuY3Rpb24nICYmXG4gICAgIWdsb2JhbC5pbXBvcnRTY3JpcHRzICYmXG4gICAgbG9jYXRpb24gJiYgbG9jYXRpb24ucHJvdG9jb2wgIT09ICdmaWxlOicgJiZcbiAgICAhZmFpbHMocG9zdClcbiAgKSB7XG4gICAgZGVmZXIgPSBwb3N0O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4oaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBzZXRUaW1lb3V0KHJ1bm5lcihpZCksIDApO1xuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBjbGVhcjogY2xlYXJcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcblxudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBIZWxwZXIgZm9yIGEgcG9wdWxhciByZXBlYXRpbmcgY2FzZSBvZiB0aGUgc3BlYzpcbi8vIExldCBpbnRlZ2VyIGJlID8gVG9JbnRlZ2VyKGluZGV4KS5cbi8vIElmIGludGVnZXIgPCAwLCBsZXQgcmVzdWx0IGJlIG1heCgobGVuZ3RoICsgaW50ZWdlciksIDApOyBlbHNlIGxldCByZXN1bHQgYmUgbWluKGludGVnZXIsIGxlbmd0aCkuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIHZhciBpbnRlZ2VyID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGludGVnZXIgPCAwID8gbWF4KGludGVnZXIgKyBsZW5ndGgsIDApIDogbWluKGludGVnZXIsIGxlbmd0aCk7XG59O1xuIiwiLy8gdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEluZGV4ZWRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShpdCkpO1xufTtcbiIsInZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcblxuLy8gYFRvSW50ZWdlcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvaW50ZWdlclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGlzTmFOKGFyZ3VtZW50ID0gK2FyZ3VtZW50KSA/IDAgOiAoYXJndW1lbnQgPiAwID8gZmxvb3IgOiBjZWlsKShhcmd1bWVudCk7XG59O1xuIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG5cbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gYFRvTGVuZ3RoYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9sZW5ndGhcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBhcmd1bWVudCA+IDAgPyBtaW4odG9JbnRlZ2VyKGFyZ3VtZW50KSwgMHgxRkZGRkZGRkZGRkZGRikgOiAwOyAvLyAyICoqIDUzIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuIiwidmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbi8vIGBUb09iamVjdGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvb2JqZWN0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpKTtcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbi8vIGBUb1ByaW1pdGl2ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvcHJpbWl0aXZlXG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlucHV0LCBQUkVGRVJSRURfU1RSSU5HKSB7XG4gIGlmICghaXNPYmplY3QoaW5wdXQpKSByZXR1cm4gaW5wdXQ7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAoUFJFRkVSUkVEX1NUUklORyAmJiB0eXBlb2YgKGZuID0gaW5wdXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHR5cGVvZiAoZm4gPSBpbnB1dC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGlucHV0KSkpIHJldHVybiB2YWw7XG4gIGlmICghUFJFRkVSUkVEX1NUUklORyAmJiB0eXBlb2YgKGZuID0gaW5wdXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgdGVzdCA9IHt9O1xuXG50ZXN0W1RPX1NUUklOR19UQUddID0gJ3onO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmluZyh0ZXN0KSA9PT0gJ1tvYmplY3Qgel0nO1xuIiwidmFyIGlkID0gMDtcbnZhciBwb3N0Zml4ID0gTWF0aC5yYW5kb20oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcgKyBTdHJpbmcoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSkgKyAnKV8nICsgKCsraWQgKyBwb3N0Zml4KS50b1N0cmluZygzNik7XG59O1xuIiwidmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5BVElWRV9TWU1CT0xcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICYmICFTeW1ib2wuc2hhbVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJztcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtc3ltYm9sJyk7XG52YXIgVVNFX1NZTUJPTF9BU19VSUQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQnKTtcblxudmFyIFdlbGxLbm93blN5bWJvbHNTdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBjcmVhdGVXZWxsS25vd25TeW1ib2wgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IFN5bWJvbCA6IFN5bWJvbCAmJiBTeW1ib2wud2l0aG91dFNldHRlciB8fCB1aWQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgaWYgKCFoYXMoV2VsbEtub3duU3ltYm9sc1N0b3JlLCBuYW1lKSkge1xuICAgIGlmIChOQVRJVkVfU1lNQk9MICYmIGhhcyhTeW1ib2wsIG5hbWUpKSBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBTeW1ib2xbbmFtZV07XG4gICAgZWxzZSBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBjcmVhdGVXZWxsS25vd25TeW1ib2woJ1N5bWJvbC4nICsgbmFtZSk7XG4gIH0gcmV0dXJuIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG5cbnZhciAkQWdncmVnYXRlRXJyb3IgPSBmdW5jdGlvbiBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIG1lc3NhZ2UpIHtcbiAgdmFyIHRoYXQgPSB0aGlzO1xuICBpZiAoISh0aGF0IGluc3RhbmNlb2YgJEFnZ3JlZ2F0ZUVycm9yKSkgcmV0dXJuIG5ldyAkQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBtZXNzYWdlKTtcbiAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vZXJyb3ItbWVzc2FnZVxuICAgIHRoYXQgPSBzZXRQcm90b3R5cGVPZihuZXcgRXJyb3IodW5kZWZpbmVkKSwgZ2V0UHJvdG90eXBlT2YodGhhdCkpO1xuICB9XG4gIGlmIChtZXNzYWdlICE9PSB1bmRlZmluZWQpIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSh0aGF0LCAnbWVzc2FnZScsIFN0cmluZyhtZXNzYWdlKSk7XG4gIHZhciBlcnJvcnNBcnJheSA9IFtdO1xuICBpdGVyYXRlKGVycm9ycywgZXJyb3JzQXJyYXkucHVzaCwgeyB0aGF0OiBlcnJvcnNBcnJheSB9KTtcbiAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHRoYXQsICdlcnJvcnMnLCBlcnJvcnNBcnJheSk7XG4gIHJldHVybiB0aGF0O1xufTtcblxuJEFnZ3JlZ2F0ZUVycm9yLnByb3RvdHlwZSA9IGNyZWF0ZShFcnJvci5wcm90b3R5cGUsIHtcbiAgY29uc3RydWN0b3I6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcig1LCAkQWdncmVnYXRlRXJyb3IpLFxuICBtZXNzYWdlOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoNSwgJycpLFxuICBuYW1lOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoNSwgJ0FnZ3JlZ2F0ZUVycm9yJylcbn0pO1xuXG4vLyBgQWdncmVnYXRlRXJyb3JgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFnZ3JlZ2F0ZS1lcnJvci1jb25zdHJ1Y3RvclxuJCh7IGdsb2JhbDogdHJ1ZSB9LCB7XG4gIEFnZ3JlZ2F0ZUVycm9yOiAkQWdncmVnYXRlRXJyb3Jcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJGZpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZmluZDtcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcycpO1xudmFyIGFycmF5TWV0aG9kVXNlc1RvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC11c2VzLXRvLWxlbmd0aCcpO1xuXG52YXIgRklORCA9ICdmaW5kJztcbnZhciBTS0lQU19IT0xFUyA9IHRydWU7XG5cbnZhciBVU0VTX1RPX0xFTkdUSCA9IGFycmF5TWV0aG9kVXNlc1RvTGVuZ3RoKEZJTkQpO1xuXG4vLyBTaG91bGRuJ3Qgc2tpcCBob2xlc1xuaWYgKEZJTkQgaW4gW10pIEFycmF5KDEpW0ZJTkRdKGZ1bmN0aW9uICgpIHsgU0tJUFNfSE9MRVMgPSBmYWxzZTsgfSk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZmluZGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBTS0lQU19IT0xFUyB8fCAhVVNFU19UT19MRU5HVEggfSwge1xuICBmaW5kOiBmdW5jdGlvbiBmaW5kKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgcmV0dXJuICRmaW5kKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoRklORCk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5Jyk7XG5cbi8vIGBBcnJheS5pc0FycmF5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkuaXNhcnJheVxuJCh7IHRhcmdldDogJ0FycmF5Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIGlzQXJyYXk6IGlzQXJyYXlcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3InKTtcblxudmFyIEFSUkFZX0lURVJBVE9SID0gJ0FycmF5IEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKEFSUkFZX0lURVJBVE9SKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5lbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmVudHJpZXNcbi8vIGBBcnJheS5wcm90b3R5cGUua2V5c2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5rZXlzXG4vLyBgQXJyYXkucHJvdG90eXBlLnZhbHVlc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS52YWx1ZXNcbi8vIGBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEBpdGVyYXRvclxuLy8gYENyZWF0ZUFycmF5SXRlcmF0b3JgIGludGVybmFsIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGVhcnJheWl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmluZUl0ZXJhdG9yKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogQVJSQVlfSVRFUkFUT1IsXG4gICAgdGFyZ2V0OiB0b0luZGV4ZWRPYmplY3QoaXRlcmF0ZWQpLCAvLyB0YXJnZXRcbiAgICBpbmRleDogMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgICBraW5kOiBraW5kICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtpbmRcbiAgfSk7XG4vLyBgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0lYXJyYXlpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgdGFyZ2V0ID0gc3RhdGUudGFyZ2V0O1xuICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4Kys7XG4gIGlmICghdGFyZ2V0IHx8IGluZGV4ID49IHRhcmdldC5sZW5ndGgpIHtcbiAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG4gIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHsgdmFsdWU6IGluZGV4LCBkb25lOiBmYWxzZSB9O1xuICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHsgdmFsdWU6IHRhcmdldFtpbmRleF0sIGRvbmU6IGZhbHNlIH07XG4gIHJldHVybiB7IHZhbHVlOiBbaW5kZXgsIHRhcmdldFtpbmRleF1dLCBkb25lOiBmYWxzZSB9O1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyVcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRldW5tYXBwZWRhcmd1bWVudHNvYmplY3Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRlbWFwcGVkYXJndW1lbnRzb2JqZWN0XG5JdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRzb21lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpLnNvbWU7XG52YXIgYXJyYXlNZXRob2RJc1N0cmljdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0Jyk7XG52YXIgYXJyYXlNZXRob2RVc2VzVG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLXVzZXMtdG8tbGVuZ3RoJyk7XG5cbnZhciBTVFJJQ1RfTUVUSE9EID0gYXJyYXlNZXRob2RJc1N0cmljdCgnc29tZScpO1xudmFyIFVTRVNfVE9fTEVOR1RIID0gYXJyYXlNZXRob2RVc2VzVG9MZW5ndGgoJ3NvbWUnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5zb21lYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnNvbWVcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFTVFJJQ1RfTUVUSE9EIHx8ICFVU0VTX1RPX0xFTkdUSCB9LCB7XG4gIHNvbWU6IGZ1bmN0aW9uIHNvbWUoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICByZXR1cm4gJHNvbWUodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5Jyk7XG52YXIgYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaGFzLXNwZWNpZXMtc3VwcG9ydCcpO1xudmFyIGFycmF5TWV0aG9kVXNlc1RvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC11c2VzLXRvLWxlbmd0aCcpO1xuXG52YXIgSEFTX1NQRUNJRVNfU1VQUE9SVCA9IGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQoJ3NwbGljZScpO1xudmFyIFVTRVNfVE9fTEVOR1RIID0gYXJyYXlNZXRob2RVc2VzVG9MZW5ndGgoJ3NwbGljZScsIHsgQUNDRVNTT1JTOiB0cnVlLCAwOiAwLCAxOiAyIH0pO1xuXG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDB4MUZGRkZGRkZGRkZGRkY7XG52YXIgTUFYSU1VTV9BTExPV0VEX0xFTkdUSF9FWENFRURFRCA9ICdNYXhpbXVtIGFsbG93ZWQgbGVuZ3RoIGV4Y2VlZGVkJztcblxuLy8gYEFycmF5LnByb3RvdHlwZS5zcGxpY2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc3BsaWNlXG4vLyB3aXRoIGFkZGluZyBzdXBwb3J0IG9mIEBAc3BlY2llc1xuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIUhBU19TUEVDSUVTX1NVUFBPUlQgfHwgIVVTRVNfVE9fTEVOR1RIIH0sIHtcbiAgc3BsaWNlOiBmdW5jdGlvbiBzcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50IC8qICwgLi4uaXRlbXMgKi8pIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgIHZhciBsZW4gPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgdmFyIGFjdHVhbFN0YXJ0ID0gdG9BYnNvbHV0ZUluZGV4KHN0YXJ0LCBsZW4pO1xuICAgIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBpbnNlcnRDb3VudCwgYWN0dWFsRGVsZXRlQ291bnQsIEEsIGssIGZyb20sIHRvO1xuICAgIGlmIChhcmd1bWVudHNMZW5ndGggPT09IDApIHtcbiAgICAgIGluc2VydENvdW50ID0gYWN0dWFsRGVsZXRlQ291bnQgPSAwO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzTGVuZ3RoID09PSAxKSB7XG4gICAgICBpbnNlcnRDb3VudCA9IDA7XG4gICAgICBhY3R1YWxEZWxldGVDb3VudCA9IGxlbiAtIGFjdHVhbFN0YXJ0O1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnNlcnRDb3VudCA9IGFyZ3VtZW50c0xlbmd0aCAtIDI7XG4gICAgICBhY3R1YWxEZWxldGVDb3VudCA9IG1pbihtYXgodG9JbnRlZ2VyKGRlbGV0ZUNvdW50KSwgMCksIGxlbiAtIGFjdHVhbFN0YXJ0KTtcbiAgICB9XG4gICAgaWYgKGxlbiArIGluc2VydENvdW50IC0gYWN0dWFsRGVsZXRlQ291bnQgPiBNQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoTUFYSU1VTV9BTExPV0VEX0xFTkdUSF9FWENFRURFRCk7XG4gICAgfVxuICAgIEEgPSBhcnJheVNwZWNpZXNDcmVhdGUoTywgYWN0dWFsRGVsZXRlQ291bnQpO1xuICAgIGZvciAoayA9IDA7IGsgPCBhY3R1YWxEZWxldGVDb3VudDsgaysrKSB7XG4gICAgICBmcm9tID0gYWN0dWFsU3RhcnQgKyBrO1xuICAgICAgaWYgKGZyb20gaW4gTykgY3JlYXRlUHJvcGVydHkoQSwgaywgT1tmcm9tXSk7XG4gICAgfVxuICAgIEEubGVuZ3RoID0gYWN0dWFsRGVsZXRlQ291bnQ7XG4gICAgaWYgKGluc2VydENvdW50IDwgYWN0dWFsRGVsZXRlQ291bnQpIHtcbiAgICAgIGZvciAoayA9IGFjdHVhbFN0YXJ0OyBrIDwgbGVuIC0gYWN0dWFsRGVsZXRlQ291bnQ7IGsrKykge1xuICAgICAgICBmcm9tID0gayArIGFjdHVhbERlbGV0ZUNvdW50O1xuICAgICAgICB0byA9IGsgKyBpbnNlcnRDb3VudDtcbiAgICAgICAgaWYgKGZyb20gaW4gTykgT1t0b10gPSBPW2Zyb21dO1xuICAgICAgICBlbHNlIGRlbGV0ZSBPW3RvXTtcbiAgICAgIH1cbiAgICAgIGZvciAoayA9IGxlbjsgayA+IGxlbiAtIGFjdHVhbERlbGV0ZUNvdW50ICsgaW5zZXJ0Q291bnQ7IGstLSkgZGVsZXRlIE9bayAtIDFdO1xuICAgIH0gZWxzZSBpZiAoaW5zZXJ0Q291bnQgPiBhY3R1YWxEZWxldGVDb3VudCkge1xuICAgICAgZm9yIChrID0gbGVuIC0gYWN0dWFsRGVsZXRlQ291bnQ7IGsgPiBhY3R1YWxTdGFydDsgay0tKSB7XG4gICAgICAgIGZyb20gPSBrICsgYWN0dWFsRGVsZXRlQ291bnQgLSAxO1xuICAgICAgICB0byA9IGsgKyBpbnNlcnRDb3VudCAtIDE7XG4gICAgICAgIGlmIChmcm9tIGluIE8pIE9bdG9dID0gT1tmcm9tXTtcbiAgICAgICAgZWxzZSBkZWxldGUgT1t0b107XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoayA9IDA7IGsgPCBpbnNlcnRDb3VudDsgaysrKSB7XG4gICAgICBPW2sgKyBhY3R1YWxTdGFydF0gPSBhcmd1bWVudHNbayArIDJdO1xuICAgIH1cbiAgICBPLmxlbmd0aCA9IGxlbiAtIGFjdHVhbERlbGV0ZUNvdW50ICsgaW5zZXJ0Q291bnQ7XG4gICAgcmV0dXJuIEE7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kJyk7XG5cbi8vIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kXG4kKHsgdGFyZ2V0OiAnRnVuY3Rpb24nLCBwcm90bzogdHJ1ZSB9LCB7XG4gIGJpbmQ6IGJpbmRcbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgYXNzaWduID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1hc3NpZ24nKTtcblxuLy8gYE9iamVjdC5hc3NpZ25gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuYXNzaWduXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBPYmplY3QuYXNzaWduICE9PSBhc3NpZ24gfSwge1xuICBhc3NpZ246IGFzc2lnblxufSk7XG4iLCJ2YXIgVE9fU1RSSU5HX1RBR19TVVBQT1JUID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXRvLXN0cmluZycpO1xuXG4vLyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmdcbmlmICghVE9fU1RSSU5HX1RBR19TVVBQT1JUKSB7XG4gIHJlZGVmaW5lKE9iamVjdC5wcm90b3R5cGUsICd0b1N0cmluZycsIHRvU3RyaW5nLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGVyZm9ybScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xuXG4vLyBgUHJvbWlzZS5hbGxTZXR0bGVkYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbGxzZXR0bGVkXG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUgfSwge1xuICBhbGxTZXR0bGVkOiBmdW5jdGlvbiBhbGxTZXR0bGVkKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHByb21pc2VSZXNvbHZlID0gYUZ1bmN0aW9uKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIHByb21pc2VSZXNvbHZlLmNhbGwoQywgcHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB7IHN0YXR1czogJ2Z1bGZpbGxlZCcsIHZhbHVlOiB2YWx1ZSB9O1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0geyBzdGF0dXM6ICdyZWplY3RlZCcsIHJlYXNvbjogZXJyb3IgfTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGVyZm9ybScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xuXG52YXIgUFJPTUlTRV9BTllfRVJST1IgPSAnTm8gb25lIHByb21pc2UgcmVzb2x2ZWQnO1xuXG4vLyBgUHJvbWlzZS5hbnlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLmFueVxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBzdGF0OiB0cnVlIH0sIHtcbiAgYW55OiBmdW5jdGlvbiBhbnkoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcHJvbWlzZVJlc29sdmUgPSBhRnVuY3Rpb24oQy5yZXNvbHZlKTtcbiAgICAgIHZhciBlcnJvcnMgPSBbXTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgdmFyIGFscmVhZHlSZXNvbHZlZCA9IGZhbHNlO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrO1xuICAgICAgICB2YXIgYWxyZWFkeVJlamVjdGVkID0gZmFsc2U7XG4gICAgICAgIGVycm9ycy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlSZWplY3RlZCB8fCBhbHJlYWR5UmVzb2x2ZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5UmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeVJlamVjdGVkIHx8IGFscmVhZHlSZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlSZWplY3RlZCA9IHRydWU7XG4gICAgICAgICAgZXJyb3JzW2luZGV4XSA9IGVycm9yO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlamVjdChuZXcgKGdldEJ1aWx0SW4oJ0FnZ3JlZ2F0ZUVycm9yJykpKGVycm9ycywgUFJPTUlTRV9BTllfRVJST1IpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlamVjdChuZXcgKGdldEJ1aWx0SW4oJ0FnZ3JlZ2F0ZUVycm9yJykpKGVycm9ycywgUFJPTUlTRV9BTllfRVJST1IpKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIE5hdGl2ZVByb21pc2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3InKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xuXG4vLyBTYWZhcmkgYnVnIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDA4MjlcbnZhciBOT05fR0VORVJJQyA9ICEhTmF0aXZlUHJvbWlzZSAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIE5hdGl2ZVByb21pc2UucHJvdG90eXBlWydmaW5hbGx5J10uY2FsbCh7IHRoZW46IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSB9LCBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSk7XG5cbi8vIGBQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5wcm90b3R5cGUuZmluYWxseVxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBOT05fR0VORVJJQyB9LCB7XG4gICdmaW5hbGx5JzogZnVuY3Rpb24gKG9uRmluYWxseSkge1xuICAgIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIGdldEJ1aWx0SW4oJ1Byb21pc2UnKSk7XG4gICAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2Ygb25GaW5hbGx5ID09ICdmdW5jdGlvbic7XG4gICAgcmV0dXJuIHRoaXMudGhlbihcbiAgICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4geDsgfSk7XG4gICAgICB9IDogb25GaW5hbGx5LFxuICAgICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHRocm93IGU7IH0pO1xuICAgICAgfSA6IG9uRmluYWxseVxuICAgICk7XG4gIH1cbn0pO1xuXG4vLyBwYXRjaCBuYXRpdmUgUHJvbWlzZS5wcm90b3R5cGUgZm9yIG5hdGl2ZSBhc3luYyBmdW5jdGlvbnNcbmlmICghSVNfUFVSRSAmJiB0eXBlb2YgTmF0aXZlUHJvbWlzZSA9PSAnZnVuY3Rpb24nICYmICFOYXRpdmVQcm9taXNlLnByb3RvdHlwZVsnZmluYWxseSddKSB7XG4gIHJlZGVmaW5lKE5hdGl2ZVByb21pc2UucHJvdG90eXBlLCAnZmluYWxseScsIGdldEJ1aWx0SW4oJ1Byb21pc2UnKS5wcm90b3R5cGVbJ2ZpbmFsbHknXSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBOYXRpdmVQcm9taXNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1wcm9taXNlLWNvbnN0cnVjdG9yJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZS1hbGwnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9taWNyb3Rhc2snKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTtcbnZhciBob3N0UmVwb3J0RXJyb3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycycpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfTk9ERSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZScpO1xudmFyIFY4X1ZFUlNJT04gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXY4LXZlcnNpb24nKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcbnZhciBQUk9NSVNFID0gJ1Byb21pc2UnO1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihQUk9NSVNFKTtcbnZhciBQcm9taXNlQ29uc3RydWN0b3IgPSBOYXRpdmVQcm9taXNlO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyICRmZXRjaCA9IGdldEJ1aWx0SW4oJ2ZldGNoJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mO1xudmFyIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5O1xudmFyIERJU1BBVENIX0VWRU5UID0gISEoZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3JlYXRlRXZlbnQgJiYgZ2xvYmFsLmRpc3BhdGNoRXZlbnQpO1xudmFyIE5BVElWRV9SRUpFQ1RJT05fRVZFTlQgPSB0eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50ID09ICdmdW5jdGlvbic7XG52YXIgVU5IQU5ETEVEX1JFSkVDVElPTiA9ICd1bmhhbmRsZWRyZWplY3Rpb24nO1xudmFyIFJFSkVDVElPTl9IQU5ETEVEID0gJ3JlamVjdGlvbmhhbmRsZWQnO1xudmFyIFBFTkRJTkcgPSAwO1xudmFyIEZVTEZJTExFRCA9IDE7XG52YXIgUkVKRUNURUQgPSAyO1xudmFyIEhBTkRMRUQgPSAxO1xudmFyIFVOSEFORExFRCA9IDI7XG52YXIgSW50ZXJuYWwsIE93blByb21pc2VDYXBhYmlsaXR5LCBQcm9taXNlV3JhcHBlciwgbmF0aXZlVGhlbjtcblxudmFyIEZPUkNFRCA9IGlzRm9yY2VkKFBST01JU0UsIGZ1bmN0aW9uICgpIHtcbiAgdmFyIEdMT0JBTF9DT1JFX0pTX1BST01JU0UgPSBpbnNwZWN0U291cmNlKFByb21pc2VDb25zdHJ1Y3RvcikgIT09IFN0cmluZyhQcm9taXNlQ29uc3RydWN0b3IpO1xuICBpZiAoIUdMT0JBTF9DT1JFX0pTX1BST01JU0UpIHtcbiAgICAvLyBWOCA2LjYgKE5vZGUgMTAgYW5kIENocm9tZSA2NikgaGF2ZSBhIGJ1ZyB3aXRoIHJlc29sdmluZyBjdXN0b20gdGhlbmFibGVzXG4gICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9ODMwNTY1XG4gICAgLy8gV2UgY2FuJ3QgZGV0ZWN0IGl0IHN5bmNocm9ub3VzbHksIHNvIGp1c3QgY2hlY2sgdmVyc2lvbnNcbiAgICBpZiAoVjhfVkVSU0lPTiA9PT0gNjYpIHJldHVybiB0cnVlO1xuICAgIC8vIFVuaGFuZGxlZCByZWplY3Rpb25zIHRyYWNraW5nIHN1cHBvcnQsIE5vZGVKUyBQcm9taXNlIHdpdGhvdXQgaXQgZmFpbHMgQEBzcGVjaWVzIHRlc3RcbiAgICBpZiAoIUlTX05PREUgJiYgIU5BVElWRV9SRUpFQ1RJT05fRVZFTlQpIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIFdlIG5lZWQgUHJvbWlzZSNmaW5hbGx5IGluIHRoZSBwdXJlIHZlcnNpb24gZm9yIHByZXZlbnRpbmcgcHJvdG90eXBlIHBvbGx1dGlvblxuICBpZiAoSVNfUFVSRSAmJiAhUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZVsnZmluYWxseSddKSByZXR1cm4gdHJ1ZTtcbiAgLy8gV2UgY2FuJ3QgdXNlIEBAc3BlY2llcyBmZWF0dXJlIGRldGVjdGlvbiBpbiBWOCBzaW5jZSBpdCBjYXVzZXNcbiAgLy8gZGVvcHRpbWl6YXRpb24gYW5kIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzlcbiAgaWYgKFY4X1ZFUlNJT04gPj0gNTEgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KFByb21pc2VDb25zdHJ1Y3RvcikpIHJldHVybiBmYWxzZTtcbiAgLy8gRGV0ZWN0IGNvcnJlY3RuZXNzIG9mIHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgdmFyIHByb21pc2UgPSBQcm9taXNlQ29uc3RydWN0b3IucmVzb2x2ZSgxKTtcbiAgdmFyIEZha2VQcm9taXNlID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgICBleGVjKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbiAgfTtcbiAgdmFyIGNvbnN0cnVjdG9yID0gcHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9O1xuICBjb25zdHJ1Y3RvcltTUEVDSUVTXSA9IEZha2VQcm9taXNlO1xuICByZXR1cm4gIShwcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlKTtcbn0pO1xuXG52YXIgSU5DT1JSRUNUX0lURVJBVElPTiA9IEZPUkNFRCB8fCAhY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkge1xuICBQcm9taXNlQ29uc3RydWN0b3IuYWxsKGl0ZXJhYmxlKVsnY2F0Y2gnXShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSk7XG5cbi8vIGhlbHBlcnNcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xuXG52YXIgbm90aWZ5ID0gZnVuY3Rpb24gKHN0YXRlLCBpc1JlamVjdCkge1xuICBpZiAoc3RhdGUubm90aWZpZWQpIHJldHVybjtcbiAgc3RhdGUubm90aWZpZWQgPSB0cnVlO1xuICB2YXIgY2hhaW4gPSBzdGF0ZS5yZWFjdGlvbnM7XG4gIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgdmFyIG9rID0gc3RhdGUuc3RhdGUgPT0gRlVMRklMTEVEO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICB3aGlsZSAoY2hhaW4ubGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhciByZWFjdGlvbiA9IGNoYWluW2luZGV4KytdO1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgICAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTtcbiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gICAgICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICAgICAgdmFyIHJlc3VsdCwgdGhlbiwgZXhpdGVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUucmVqZWN0aW9uID09PSBVTkhBTkRMRUQpIG9uSGFuZGxlVW5oYW5kbGVkKHN0YXRlKTtcbiAgICAgICAgICAgIHN0YXRlLnJlamVjdGlvbiA9IEhBTkRMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYW5kbGVyID09PSB0cnVlKSByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkb21haW4pIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7IC8vIGNhbiB0aHJvd1xuICAgICAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgICAgICBkb21haW4uZXhpdCgpO1xuICAgICAgICAgICAgICBleGl0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKSB7XG4gICAgICAgICAgICByZWplY3QoVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSkge1xuICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChkb21haW4gJiYgIWV4aXRlZCkgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RhdGUucmVhY3Rpb25zID0gW107XG4gICAgc3RhdGUubm90aWZpZWQgPSBmYWxzZTtcbiAgICBpZiAoaXNSZWplY3QgJiYgIXN0YXRlLnJlamVjdGlvbikgb25VbmhhbmRsZWQoc3RhdGUpO1xuICB9KTtcbn07XG5cbnZhciBkaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIHByb21pc2UsIHJlYXNvbikge1xuICB2YXIgZXZlbnQsIGhhbmRsZXI7XG4gIGlmIChESVNQQVRDSF9FVkVOVCkge1xuICAgIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZlbnQucHJvbWlzZSA9IHByb21pc2U7XG4gICAgZXZlbnQucmVhc29uID0gcmVhc29uO1xuICAgIGV2ZW50LmluaXRFdmVudChuYW1lLCBmYWxzZSwgdHJ1ZSk7XG4gICAgZ2xvYmFsLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9IGVsc2UgZXZlbnQgPSB7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcmVhc29uIH07XG4gIGlmICghTkFUSVZFX1JFSkVDVElPTl9FVkVOVCAmJiAoaGFuZGxlciA9IGdsb2JhbFsnb24nICsgbmFtZV0pKSBoYW5kbGVyKGV2ZW50KTtcbiAgZWxzZSBpZiAobmFtZSA9PT0gVU5IQU5ETEVEX1JFSkVDVElPTikgaG9zdFJlcG9ydEVycm9ycygnVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgcmVhc29uKTtcbn07XG5cbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBzdGF0ZS5mYWNhZGU7XG4gICAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgdmFyIElTX1VOSEFORExFRCA9IGlzVW5oYW5kbGVkKHN0YXRlKTtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGlmIChJU19VTkhBTkRMRUQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoSVNfTk9ERSkge1xuICAgICAgICAgIHByb2Nlc3MuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgdmFsdWUsIHByb21pc2UpO1xuICAgICAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChVTkhBTkRMRURfUkVKRUNUSU9OLCBwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIC8vIEJyb3dzZXJzIHNob3VsZCBub3QgdHJpZ2dlciBgcmVqZWN0aW9uSGFuZGxlZGAgZXZlbnQgaWYgaXQgd2FzIGhhbmRsZWQgaGVyZSwgTm9kZUpTIC0gc2hvdWxkXG4gICAgICBzdGF0ZS5yZWplY3Rpb24gPSBJU19OT0RFIHx8IGlzVW5oYW5kbGVkKHN0YXRlKSA/IFVOSEFORExFRCA6IEhBTkRMRUQ7XG4gICAgICBpZiAocmVzdWx0LmVycm9yKSB0aHJvdyByZXN1bHQudmFsdWU7XG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUucmVqZWN0aW9uICE9PSBIQU5ETEVEICYmICFzdGF0ZS5wYXJlbnQ7XG59O1xuXG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gc3RhdGUuZmFjYWRlO1xuICAgIGlmIChJU19OT0RFKSB7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChSRUpFQ1RJT05fSEFORExFRCwgcHJvbWlzZSwgc3RhdGUudmFsdWUpO1xuICB9KTtcbn07XG5cbnZhciBiaW5kID0gZnVuY3Rpb24gKGZuLCBzdGF0ZSwgdW53cmFwKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBmbihzdGF0ZSwgdmFsdWUsIHVud3JhcCk7XG4gIH07XG59O1xuXG52YXIgaW50ZXJuYWxSZWplY3QgPSBmdW5jdGlvbiAoc3RhdGUsIHZhbHVlLCB1bndyYXApIHtcbiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybjtcbiAgc3RhdGUuZG9uZSA9IHRydWU7XG4gIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwO1xuICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICBzdGF0ZS5zdGF0ZSA9IFJFSkVDVEVEO1xuICBub3RpZnkoc3RhdGUsIHRydWUpO1xufTtcblxudmFyIGludGVybmFsUmVzb2x2ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHRyeSB7XG4gICAgaWYgKHN0YXRlLmZhY2FkZSA9PT0gdmFsdWUpIHRocm93IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIHZhciB0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSk7XG4gICAgaWYgKHRoZW4pIHtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3cmFwcGVyID0geyBkb25lOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSxcbiAgICAgICAgICAgIGJpbmQoaW50ZXJuYWxSZXNvbHZlLCB3cmFwcGVyLCBzdGF0ZSksXG4gICAgICAgICAgICBiaW5kKGludGVybmFsUmVqZWN0LCB3cmFwcGVyLCBzdGF0ZSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGludGVybmFsUmVqZWN0KHdyYXBwZXIsIGVycm9yLCBzdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgc3RhdGUuc3RhdGUgPSBGVUxGSUxMRUQ7XG4gICAgICBub3RpZnkoc3RhdGUsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaW50ZXJuYWxSZWplY3QoeyBkb25lOiBmYWxzZSB9LCBlcnJvciwgc3RhdGUpO1xuICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RvciBwb2x5ZmlsbFxuaWYgKEZPUkNFRCkge1xuICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKVxuICBQcm9taXNlQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCBQcm9taXNlQ29uc3RydWN0b3IsIFBST01JU0UpO1xuICAgIGFGdW5jdGlvbihleGVjdXRvcik7XG4gICAgSW50ZXJuYWwuY2FsbCh0aGlzKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihiaW5kKGludGVybmFsUmVzb2x2ZSwgc3RhdGUpLCBiaW5kKGludGVybmFsUmVqZWN0LCBzdGF0ZSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpbnRlcm5hbFJlamVjdChzdGF0ZSwgZXJyb3IpO1xuICAgIH1cbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIEludGVybmFsID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgICAgdHlwZTogUFJPTUlTRSxcbiAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgbm90aWZpZWQ6IGZhbHNlLFxuICAgICAgcGFyZW50OiBmYWxzZSxcbiAgICAgIHJlYWN0aW9uczogW10sXG4gICAgICByZWplY3Rpb246IGZhbHNlLFxuICAgICAgc3RhdGU6IFBFTkRJTkcsXG4gICAgICB2YWx1ZTogdW5kZWZpbmVkXG4gICAgfSk7XG4gIH07XG4gIEludGVybmFsLnByb3RvdHlwZSA9IHJlZGVmaW5lQWxsKFByb21pc2VDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHtcbiAgICAvLyBgUHJvbWlzZS5wcm90b3R5cGUudGhlbmAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS50aGVuXG4gICAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUodGhpcyk7XG4gICAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgUHJvbWlzZUNvbnN0cnVjdG9yKSk7XG4gICAgICByZWFjdGlvbi5vayA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PSAnZnVuY3Rpb24nID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgICAgcmVhY3Rpb24uZmFpbCA9IHR5cGVvZiBvblJlamVjdGVkID09ICdmdW5jdGlvbicgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IElTX05PREUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDtcbiAgICAgIHN0YXRlLnBhcmVudCA9IHRydWU7XG4gICAgICBzdGF0ZS5yZWFjdGlvbnMucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAoc3RhdGUuc3RhdGUgIT0gUEVORElORykgbm90aWZ5KHN0YXRlLCBmYWxzZSk7XG4gICAgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTtcbiAgICB9LFxuICAgIC8vIGBQcm9taXNlLnByb3RvdHlwZS5jYXRjaGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS5jYXRjaFxuICAgICdjYXRjaCc6IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgfVxuICB9KTtcbiAgT3duUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBuZXcgSW50ZXJuYWwoKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHByb21pc2UpO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgdGhpcy5yZXNvbHZlID0gYmluZChpbnRlcm5hbFJlc29sdmUsIHN0YXRlKTtcbiAgICB0aGlzLnJlamVjdCA9IGJpbmQoaW50ZXJuYWxSZWplY3QsIHN0YXRlKTtcbiAgfTtcbiAgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgICByZXR1cm4gQyA9PT0gUHJvbWlzZUNvbnN0cnVjdG9yIHx8IEMgPT09IFByb21pc2VXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG5cbiAgaWYgKCFJU19QVVJFICYmIHR5cGVvZiBOYXRpdmVQcm9taXNlID09ICdmdW5jdGlvbicpIHtcbiAgICBuYXRpdmVUaGVuID0gTmF0aXZlUHJvbWlzZS5wcm90b3R5cGUudGhlbjtcblxuICAgIC8vIHdyYXAgbmF0aXZlIFByb21pc2UjdGhlbiBmb3IgbmF0aXZlIGFzeW5jIGZ1bmN0aW9uc1xuICAgIHJlZGVmaW5lKE5hdGl2ZVByb21pc2UucHJvdG90eXBlLCAndGhlbicsIGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgbmF0aXZlVGhlbi5jYWxsKHRoYXQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjQwXG4gICAgfSwgeyB1bnNhZmU6IHRydWUgfSk7XG5cbiAgICAvLyB3cmFwIGZldGNoIHJlc3VsdFxuICAgIGlmICh0eXBlb2YgJGZldGNoID09ICdmdW5jdGlvbicpICQoeyBnbG9iYWw6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIGZvcmNlZDogdHJ1ZSB9LCB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIGZldGNoOiBmdW5jdGlvbiBmZXRjaChpbnB1dCAvKiAsIGluaXQgKi8pIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKFByb21pc2VDb25zdHJ1Y3RvciwgJGZldGNoLmFwcGx5KGdsb2JhbCwgYXJndW1lbnRzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuJCh7IGdsb2JhbDogdHJ1ZSwgd3JhcDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICBQcm9taXNlOiBQcm9taXNlQ29uc3RydWN0b3Jcbn0pO1xuXG5zZXRUb1N0cmluZ1RhZyhQcm9taXNlQ29uc3RydWN0b3IsIFBST01JU0UsIGZhbHNlLCB0cnVlKTtcbnNldFNwZWNpZXMoUFJPTUlTRSk7XG5cblByb21pc2VXcmFwcGVyID0gZ2V0QnVpbHRJbihQUk9NSVNFKTtcblxuLy8gc3RhdGljc1xuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICAvLyBgUHJvbWlzZS5yZWplY3RgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmVqZWN0XG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpO1xuICAgIGNhcGFiaWxpdHkucmVqZWN0LmNhbGwodW5kZWZpbmVkLCByKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcblxuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIHx8IEZPUkNFRCB9LCB7XG4gIC8vIGBQcm9taXNlLnJlc29sdmVgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmVzb2x2ZVxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpIHtcbiAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoSVNfUFVSRSAmJiB0aGlzID09PSBQcm9taXNlV3JhcHBlciA/IFByb21pc2VDb25zdHJ1Y3RvciA6IHRoaXMsIHgpO1xuICB9XG59KTtcblxuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgLy8gYFByb21pc2UuYWxsYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLmFsbFxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHByb21pc2VSZXNvbHZlID0gYUZ1bmN0aW9uKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgICRwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gYFByb21pc2UucmFjZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5yYWNlXG4gIHJhY2U6IGZ1bmN0aW9uIHJhY2UoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRwcm9taXNlUmVzb2x2ZSA9IGFGdW5jdGlvbihDLnJlc29sdmUpO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgJHByb21pc2VSZXNvbHZlLmNhbGwoQywgcHJvbWlzZSkudGhlbihjYXBhYmlsaXR5LnJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjaGFyQXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZScpLmNoYXJBdDtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yJyk7XG5cbnZhciBTVFJJTkdfSVRFUkFUT1IgPSAnU3RyaW5nIEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFNUUklOR19JVEVSQVRPUik7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS1AQGl0ZXJhdG9yXG5kZWZpbmVJdGVyYXRvcihTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbiAoaXRlcmF0ZWQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogU1RSSU5HX0lURVJBVE9SLFxuICAgIHN0cmluZzogU3RyaW5nKGl0ZXJhdGVkKSxcbiAgICBpbmRleDogMFxuICB9KTtcbi8vIGAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0lc3RyaW5naXRlcmF0b3Jwcm90b3R5cGUlLm5leHRcbn0sIGZ1bmN0aW9uIG5leHQoKSB7XG4gIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gIHZhciBzdHJpbmcgPSBzdGF0ZS5zdHJpbmc7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4O1xuICB2YXIgcG9pbnQ7XG4gIGlmIChpbmRleCA+PSBzdHJpbmcubGVuZ3RoKSByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIHBvaW50ID0gY2hhckF0KHN0cmluZywgaW5kZXgpO1xuICBzdGF0ZS5pbmRleCArPSBwb2ludC5sZW5ndGg7XG4gIHJldHVybiB7IHZhbHVlOiBwb2ludCwgZG9uZTogZmFsc2UgfTtcbn0pO1xuIiwiLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGBcbnJlcXVpcmUoJy4vZXMuYWdncmVnYXRlLWVycm9yJyk7XG4iLCIvLyBUT0RPOiBSZW1vdmUgZnJvbSBgY29yZS1qc0A0YFxucmVxdWlyZSgnLi9lcy5wcm9taXNlLmFsbC1zZXR0bGVkLmpzJyk7XG4iLCIvLyBUT0RPOiBSZW1vdmUgZnJvbSBgY29yZS1qc0A0YFxucmVxdWlyZSgnLi9lcy5wcm9taXNlLmFueScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGVyZm9ybScpO1xuXG4vLyBgUHJvbWlzZS50cnlgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS10cnlcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSB9LCB7XG4gICd0cnknOiBmdW5jdGlvbiAoY2FsbGJhY2tmbikge1xuICAgIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYodGhpcyk7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oY2FsbGJhY2tmbik7XG4gICAgKHJlc3VsdC5lcnJvciA/IHByb21pc2VDYXBhYmlsaXR5LnJlamVjdCA6IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmUpKHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBET01JdGVyYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9tLWl0ZXJhYmxlcycpO1xudmFyIEFycmF5SXRlcmF0b3JNZXRob2RzID0gcmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvcicpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgQXJyYXlWYWx1ZXMgPSBBcnJheUl0ZXJhdG9yTWV0aG9kcy52YWx1ZXM7XG5cbmZvciAodmFyIENPTExFQ1RJT05fTkFNRSBpbiBET01JdGVyYWJsZXMpIHtcbiAgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbQ09MTEVDVElPTl9OQU1FXTtcbiAgdmFyIENvbGxlY3Rpb25Qcm90b3R5cGUgPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlO1xuICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZSkge1xuICAgIC8vIHNvbWUgQ2hyb21lIHZlcnNpb25zIGhhdmUgbm9uLWNvbmZpZ3VyYWJsZSBtZXRob2RzIG9uIERPTVRva2VuTGlzdFxuICAgIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlW0lURVJBVE9SXSAhPT0gQXJyYXlWYWx1ZXMpIHRyeSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ29sbGVjdGlvblByb3RvdHlwZSwgSVRFUkFUT1IsIEFycmF5VmFsdWVzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgQ29sbGVjdGlvblByb3RvdHlwZVtJVEVSQVRPUl0gPSBBcnJheVZhbHVlcztcbiAgICB9XG4gICAgaWYgKCFDb2xsZWN0aW9uUHJvdG90eXBlW1RPX1NUUklOR19UQUddKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ29sbGVjdGlvblByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgQ09MTEVDVElPTl9OQU1FKTtcbiAgICB9XG4gICAgaWYgKERPTUl0ZXJhYmxlc1tDT0xMRUNUSU9OX05BTUVdKSBmb3IgKHZhciBNRVRIT0RfTkFNRSBpbiBBcnJheUl0ZXJhdG9yTWV0aG9kcykge1xuICAgICAgLy8gc29tZSBDaHJvbWUgdmVyc2lvbnMgaGF2ZSBub24tY29uZmlndXJhYmxlIG1ldGhvZHMgb24gRE9NVG9rZW5MaXN0XG4gICAgICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZVtNRVRIT0RfTkFNRV0gIT09IEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXSkgdHJ5IHtcbiAgICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KENvbGxlY3Rpb25Qcm90b3R5cGUsIE1FVEhPRF9OQU1FLCBBcnJheUl0ZXJhdG9yTWV0aG9kc1tNRVRIT0RfTkFNRV0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQ29sbGVjdGlvblByb3RvdHlwZVtNRVRIT0RfTkFNRV0gPSBBcnJheUl0ZXJhdG9yTWV0aG9kc1tNRVRIT0RfTkFNRV07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvKiEgaWVlZTc1NC4gQlNELTMtQ2xhdXNlIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqL1xuZXhwb3J0cy5yZWFkID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG1cbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSAoZSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSAobSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXNcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiAoKHMgPyAtMSA6IDEpICogSW5maW5pdHkpXG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKVxuICAgIGUgPSBlIC0gZUJpYXNcbiAgfVxuICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKVxufVxuXG5leHBvcnRzLndyaXRlID0gZnVuY3Rpb24gKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICgodmFsdWUgKiBjKSAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFycikgPT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG4iLCJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iLCIvLyBEZWNsYXJlIHRoZSBFUzYgZmVhdHVyZXMgd2UncmUgdXNpbmdcclxuXHJcbi8vIFRPRE86IENvbnNpZGVyIHVzaW5nIHRoZSBsb2NhbCBmdW5jdGlvbiB2ZXJzaW9ucyBvZiB0aGVzZSwgc28gdGhhdCB3ZVxyXG4vLyBhdm9pZCBtb2RpZnlpbmcgYnJvd3NlciBnbG9iYWxzIChwb3RlbnRpYWwgZm9yIGludGVyb3AgYnVncyB3aXRoIG90aGVyIGxpYnJhcmllc1xyXG4vLyBvbiB0aGUgcGFnZSB0aGF0IG1pZ2h0IGJlIHBvbHlmaWxsaW5nIEVTNiBmZWF0dXJlcylcclxuXHJcbmltcG9ydCAnY29yZS1qcy9mZWF0dXJlcy9wcm9taXNlJztcclxuaW1wb3J0ICdjb3JlLWpzL2ZlYXR1cmVzL2Z1bmN0aW9uL2JpbmQnO1xyXG5pbXBvcnQgJ2NvcmUtanMvZmVhdHVyZXMvb2JqZWN0L2Fzc2lnbic7XHJcbmltcG9ydCAnY29yZS1qcy9mZWF0dXJlcy9hcnJheS9maW5kJztcclxuaW1wb3J0ICdjb3JlLWpzL2ZlYXR1cmVzL2FycmF5L3NvbWUnO1xyXG5pbXBvcnQgJ2NvcmUtanMvZmVhdHVyZXMvYXJyYXkvaXMtYXJyYXknO1xyXG5pbXBvcnQgJ2NvcmUtanMvZmVhdHVyZXMvYXJyYXkvc3BsaWNlJztcclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5pbXBvcnQgeyBUaW1lciB9IGZyb20gJy4vVGltZXIuanMnO1xyXG5cclxuY29uc3QgRGVmYXVsdEFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lID0gNjA7IC8vIHNlY29uZHNcclxuXHJcbmV4cG9ydCBjbGFzcyBBY2Nlc3NUb2tlbkV2ZW50cyB7XHJcblxyXG4gICAgY29uc3RydWN0b3Ioe1xyXG4gICAgICAgIGFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lID0gRGVmYXVsdEFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lLFxyXG4gICAgICAgIGFjY2Vzc1Rva2VuRXhwaXJpbmdUaW1lciA9IG5ldyBUaW1lcihcIkFjY2VzcyB0b2tlbiBleHBpcmluZ1wiKSxcclxuICAgICAgICBhY2Nlc3NUb2tlbkV4cGlyZWRUaW1lciA9IG5ldyBUaW1lcihcIkFjY2VzcyB0b2tlbiBleHBpcmVkXCIpXHJcbiAgICB9ID0ge30pIHtcclxuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSA9IGFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lO1xyXG5cclxuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nID0gYWNjZXNzVG9rZW5FeHBpcmluZ1RpbWVyO1xyXG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZCA9IGFjY2Vzc1Rva2VuRXhwaXJlZFRpbWVyO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWQoY29udGFpbmVyKSB7XHJcbiAgICAgICAgLy8gb25seSByZWdpc3RlciBldmVudHMgaWYgdGhlcmUncyBhbiBhY2Nlc3MgdG9rZW4gYW5kIGl0IGhhcyBhbiBleHBpcmF0aW9uXHJcbiAgICAgICAgaWYgKGNvbnRhaW5lci5hY2Nlc3NfdG9rZW4gJiYgY29udGFpbmVyLmV4cGlyZXNfaW4gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZXQgZHVyYXRpb24gPSBjb250YWluZXIuZXhwaXJlc19pbjtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiQWNjZXNzVG9rZW5FdmVudHMubG9hZDogYWNjZXNzIHRva2VuIHByZXNlbnQsIHJlbWFpbmluZyBkdXJhdGlvbjpcIiwgZHVyYXRpb24pO1xyXG5cclxuICAgICAgICAgICAgaWYgKGR1cmF0aW9uID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gb25seSByZWdpc3RlciBleHBpcmluZyBpZiB3ZSBzdGlsbCBoYXZlIHRpbWVcclxuICAgICAgICAgICAgICAgIGxldCBleHBpcmluZyA9IGR1cmF0aW9uIC0gdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXhwaXJpbmcgPD0gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhwaXJpbmcgPSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJBY2Nlc3NUb2tlbkV2ZW50cy5sb2FkOiByZWdpc3RlcmluZyBleHBpcmluZyB0aW1lciBpbjpcIiwgZXhwaXJpbmcpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZy5pbml0KGV4cGlyaW5nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIkFjY2Vzc1Rva2VuRXZlbnRzLmxvYWQ6IGNhbmNlbGluZyBleGlzdGluZyBleHBpcmluZyB0aW1lciBiZWNhc2Ugd2UncmUgcGFzdCBleHBpcmF0aW9uLlwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJpbmcuY2FuY2VsKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGlmIGl0J3MgbmVnYXRpdmUsIGl0IHdpbGwgc3RpbGwgZmlyZVxyXG4gICAgICAgICAgICBsZXQgZXhwaXJlZCA9IGR1cmF0aW9uICsgMTtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiQWNjZXNzVG9rZW5FdmVudHMubG9hZDogcmVnaXN0ZXJpbmcgZXhwaXJlZCB0aW1lciBpbjpcIiwgZXhwaXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZC5pbml0KGV4cGlyZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZy5jYW5jZWwoKTtcclxuICAgICAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmVkLmNhbmNlbCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1bmxvYWQoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiQWNjZXNzVG9rZW5FdmVudHMudW5sb2FkOiBjYW5jZWxpbmcgZXhpc3RpbmcgYWNjZXNzIHRva2VuIHRpbWVyc1wiKTtcclxuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nLmNhbmNlbCgpO1xyXG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZC5jYW5jZWwoKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRBY2Nlc3NUb2tlbkV4cGlyaW5nKGNiKSB7XHJcbiAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZy5hZGRIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIHJlbW92ZUFjY2Vzc1Rva2VuRXhwaXJpbmcoY2IpIHtcclxuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nLnJlbW92ZUhhbmRsZXIoY2IpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEFjY2Vzc1Rva2VuRXhwaXJlZChjYikge1xyXG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZC5hZGRIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIHJlbW92ZUFjY2Vzc1Rva2VuRXhwaXJlZChjYikge1xyXG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZC5yZW1vdmVIYW5kbGVyKGNiKTtcclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcblxyXG5jb25zdCBEZWZhdWx0SW50ZXJ2YWwgPSAyMDAwO1xyXG5cclxuZXhwb3J0IGNsYXNzIENoZWNrU2Vzc2lvbklGcmFtZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihjYWxsYmFjaywgY2xpZW50X2lkLCB1cmwsIGludGVydmFsLCBzdG9wT25FcnJvciA9IHRydWUpIHtcclxuICAgICAgICB0aGlzLl9jYWxsYmFjayA9IGNhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMuX2NsaWVudF9pZCA9IGNsaWVudF9pZDtcclxuICAgICAgICB0aGlzLl91cmwgPSB1cmw7XHJcbiAgICAgICAgdGhpcy5faW50ZXJ2YWwgPSBpbnRlcnZhbCB8fCBEZWZhdWx0SW50ZXJ2YWw7XHJcbiAgICAgICAgdGhpcy5fc3RvcE9uRXJyb3IgPSBzdG9wT25FcnJvcjtcclxuXHJcbiAgICAgICAgdmFyIGlkeCA9IHVybC5pbmRleE9mKFwiL1wiLCB1cmwuaW5kZXhPZihcIi8vXCIpICsgMik7XHJcbiAgICAgICAgdGhpcy5fZnJhbWVfb3JpZ2luID0gdXJsLnN1YnN0cigwLCBpZHgpO1xyXG5cclxuICAgICAgICB0aGlzLl9mcmFtZSA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xyXG5cclxuICAgICAgICAvLyBzaG90Z3VuIGFwcHJvYWNoXHJcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XHJcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIHRoaXMuX2ZyYW1lLndpZHRoID0gMDtcclxuICAgICAgICB0aGlzLl9mcmFtZS5oZWlnaHQgPSAwO1xyXG5cclxuICAgICAgICB0aGlzLl9mcmFtZS5zcmMgPSB1cmw7XHJcbiAgICB9XHJcbiAgICBsb2FkKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9mcmFtZS5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2ZyYW1lKTtcclxuICAgICAgICAgICAgdGhpcy5fYm91bmRNZXNzYWdlRXZlbnQgPSB0aGlzLl9tZXNzYWdlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLl9ib3VuZE1lc3NhZ2VFdmVudCwgZmFsc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgX21lc3NhZ2UoZSkge1xyXG4gICAgICAgIGlmIChlLm9yaWdpbiA9PT0gdGhpcy5fZnJhbWVfb3JpZ2luICYmXHJcbiAgICAgICAgICAgIGUuc291cmNlID09PSB0aGlzLl9mcmFtZS5jb250ZW50V2luZG93XHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmRhdGEgPT09IFwiZXJyb3JcIikge1xyXG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiQ2hlY2tTZXNzaW9uSUZyYW1lOiBlcnJvciBtZXNzYWdlIGZyb20gY2hlY2sgc2Vzc2lvbiBvcCBpZnJhbWVcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RvcE9uRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3AoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChlLmRhdGEgPT09IFwiY2hhbmdlZFwiKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJDaGVja1Nlc3Npb25JRnJhbWU6IGNoYW5nZWQgbWVzc2FnZSBmcm9tIGNoZWNrIHNlc3Npb24gb3AgaWZyYW1lXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFjaygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiQ2hlY2tTZXNzaW9uSUZyYW1lOiBcIiArIGUuZGF0YSArIFwiIG1lc3NhZ2UgZnJvbSBjaGVjayBzZXNzaW9uIG9wIGlmcmFtZVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXJ0KHNlc3Npb25fc3RhdGUpIHtcclxuICAgICAgICBpZiAodGhpcy5fc2Vzc2lvbl9zdGF0ZSAhPT0gc2Vzc2lvbl9zdGF0ZSkge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJDaGVja1Nlc3Npb25JRnJhbWUuc3RhcnRcIik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN0b3AoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3Nlc3Npb25fc3RhdGUgPSBzZXNzaW9uX3N0YXRlO1xyXG5cclxuICAgICAgICAgICAgbGV0IHNlbmQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9mcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKHRoaXMuX2NsaWVudF9pZCArIFwiIFwiICsgdGhpcy5fc2Vzc2lvbl9zdGF0ZSwgdGhpcy5fZnJhbWVfb3JpZ2luKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIHRyaWdnZXIgbm93XHJcbiAgICAgICAgICAgIHNlbmQoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGFuZCBzZXR1cCB0aW1lclxyXG4gICAgICAgICAgICB0aGlzLl90aW1lciA9IHdpbmRvdy5zZXRJbnRlcnZhbChzZW5kLCB0aGlzLl9pbnRlcnZhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0b3AoKSB7XHJcbiAgICAgICAgdGhpcy5fc2Vzc2lvbl9zdGF0ZSA9IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl90aW1lcikge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJDaGVja1Nlc3Npb25JRnJhbWUuc3RvcFwiKTtcclxuXHJcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuX3RpbWVyKTtcclxuICAgICAgICAgICAgdGhpcy5fdGltZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCJleHBvcnQgY2xhc3MgQ2xvY2tTZXJ2aWNlIHtcclxuICAgIGdldEVwb2NoVGltZSgpIHtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKERhdGUubm93KCkgLyAxMDAwIHwgMCk7XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgQ29yZG92YVBvcHVwV2luZG93IH0gZnJvbSAnLi9Db3Jkb3ZhUG9wdXBXaW5kb3cuanMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvcmRvdmFJRnJhbWVOYXZpZ2F0b3Ige1xyXG5cclxuICAgIHByZXBhcmUocGFyYW1zKSB7XHJcbiAgICAgICAgcGFyYW1zLnBvcHVwV2luZG93RmVhdHVyZXMgPSAnaGlkZGVuPXllcyc7XHJcbiAgICAgICAgbGV0IHBvcHVwID0gbmV3IENvcmRvdmFQb3B1cFdpbmRvdyhwYXJhbXMpO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocG9wdXApO1xyXG4gICAgfVxyXG59XHJcbiIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCB7IENvcmRvdmFQb3B1cFdpbmRvdyB9IGZyb20gJy4vQ29yZG92YVBvcHVwV2luZG93LmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBDb3Jkb3ZhUG9wdXBOYXZpZ2F0b3Ige1xyXG5cclxuICAgIHByZXBhcmUocGFyYW1zKSB7XHJcbiAgICAgICAgbGV0IHBvcHVwID0gbmV3IENvcmRvdmFQb3B1cFdpbmRvdyhwYXJhbXMpO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocG9wdXApO1xyXG4gICAgfVxyXG59XHJcbiIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCB7IExvZyB9IGZyb20gJy4vTG9nLmpzJztcclxuXHJcbmNvbnN0IERlZmF1bHRQb3B1cEZlYXR1cmVzID0gJ2xvY2F0aW9uPW5vLHRvb2xiYXI9bm8sem9vbT1ubyc7XHJcbmNvbnN0IERlZmF1bHRQb3B1cFRhcmdldCA9IFwiX2JsYW5rXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ29yZG92YVBvcHVwV2luZG93IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcclxuICAgICAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9yZXNvbHZlID0gcmVzb2x2ZTtcclxuICAgICAgICAgICAgdGhpcy5fcmVqZWN0ID0gcmVqZWN0O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmZlYXR1cmVzID0gcGFyYW1zLnBvcHVwV2luZG93RmVhdHVyZXMgfHwgRGVmYXVsdFBvcHVwRmVhdHVyZXM7XHJcbiAgICAgICAgdGhpcy50YXJnZXQgPSBwYXJhbXMucG9wdXBXaW5kb3dUYXJnZXQgfHwgRGVmYXVsdFBvcHVwVGFyZ2V0O1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMucmVkaXJlY3RfdXJpID0gcGFyYW1zLnN0YXJ0VXJsO1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIkNvcmRvdmFQb3B1cFdpbmRvdy5jdG9yOiByZWRpcmVjdF91cmk6IFwiICsgdGhpcy5yZWRpcmVjdF91cmkpO1xyXG4gICAgfVxyXG5cclxuICAgIF9pc0luQXBwQnJvd3Nlckluc3RhbGxlZChjb3Jkb3ZhTWV0YWRhdGEpIHtcclxuICAgICAgICByZXR1cm4gW1wiY29yZG92YS1wbHVnaW4taW5hcHBicm93c2VyXCIsIFwiY29yZG92YS1wbHVnaW4taW5hcHBicm93c2VyLmluYXBwYnJvd3NlclwiLCBcIm9yZy5hcGFjaGUuY29yZG92YS5pbmFwcGJyb3dzZXJcIl0uc29tZShmdW5jdGlvbiAobmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gY29yZG92YU1ldGFkYXRhLmhhc093blByb3BlcnR5KG5hbWUpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgIFxyXG4gICAgbmF2aWdhdGUocGFyYW1zKSB7XHJcbiAgICAgICAgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy51cmwpIHtcclxuICAgICAgICAgICAgdGhpcy5fZXJyb3IoXCJObyB1cmwgcHJvdmlkZWRcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCF3aW5kb3cuY29yZG92YSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKFwiY29yZG92YSBpcyB1bmRlZmluZWRcIilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdmFyIGNvcmRvdmFNZXRhZGF0YSA9IHdpbmRvdy5jb3Jkb3ZhLnJlcXVpcmUoXCJjb3Jkb3ZhL3BsdWdpbl9saXN0XCIpLm1ldGFkYXRhO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5faXNJbkFwcEJyb3dzZXJJbnN0YWxsZWQoY29yZG92YU1ldGFkYXRhKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lcnJvcihcIkluQXBwQnJvd3NlciBwbHVnaW4gbm90IGZvdW5kXCIpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcG9wdXAgPSBjb3Jkb3ZhLkluQXBwQnJvd3Nlci5vcGVuKHBhcmFtcy51cmwsIHRoaXMudGFyZ2V0LCB0aGlzLmZlYXR1cmVzKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BvcHVwKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJDb3Jkb3ZhUG9wdXBXaW5kb3cubmF2aWdhdGU6IHBvcHVwIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9leGl0Q2FsbGJhY2tFdmVudCA9IHRoaXMuX2V4aXRDYWxsYmFjay5iaW5kKHRoaXMpOyBcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRTdGFydENhbGxiYWNrRXZlbnQgPSB0aGlzLl9sb2FkU3RhcnRDYWxsYmFjay5iaW5kKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wb3B1cC5hZGRFdmVudExpc3RlbmVyKFwiZXhpdFwiLCB0aGlzLl9leGl0Q2FsbGJhY2tFdmVudCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcG9wdXAuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRzdGFydFwiLCB0aGlzLl9sb2FkU3RhcnRDYWxsYmFja0V2ZW50LCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnJvcihcIkVycm9yIG9wZW5pbmcgcG9wdXAgd2luZG93XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByb21pc2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgX2xvYWRTdGFydENhbGxiYWNrKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LnVybC5pbmRleE9mKHRoaXMucmVkaXJlY3RfdXJpKSA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zdWNjZXNzKHsgdXJsOiBldmVudC51cmwgfSk7XHJcbiAgICAgICAgfSAgICBcclxuICAgIH1cclxuICAgIF9leGl0Q2FsbGJhY2sobWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMuX2Vycm9yKG1lc3NhZ2UpOyAgICBcclxuICAgIH1cclxuICAgIFxyXG4gICAgX3N1Y2Nlc3MoZGF0YSkge1xyXG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcclxuXHJcbiAgICAgICAgTG9nLmRlYnVnKFwiQ29yZG92YVBvcHVwV2luZG93OiBTdWNjZXNzZnVsIHJlc3BvbnNlIGZyb20gY29yZG92YSBwb3B1cCB3aW5kb3dcIik7XHJcbiAgICAgICAgdGhpcy5fcmVzb2x2ZShkYXRhKTtcclxuICAgIH1cclxuICAgIF9lcnJvcihtZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5fY2xlYW51cCgpO1xyXG5cclxuICAgICAgICBMb2cuZXJyb3IobWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5fcmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2UoKSB7XHJcbiAgICAgICAgdGhpcy5fY2xlYW51cCgpO1xyXG4gICAgfVxyXG5cclxuICAgIF9jbGVhbnVwKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9wb3B1cCl7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIkNvcmRvdmFQb3B1cFdpbmRvdzogY2xlYW5pbmcgdXAgcG9wdXBcIik7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJleGl0XCIsIHRoaXMuX2V4aXRDYWxsYmFja0V2ZW50LCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJsb2Fkc3RhcnRcIiwgdGhpcy5fbG9hZFN0YXJ0Q2FsbGJhY2tFdmVudCwgZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9wb3B1cCA9IG51bGw7XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEVycm9yUmVzcG9uc2UgZXh0ZW5kcyBFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7ZXJyb3IsIGVycm9yX2Rlc2NyaXB0aW9uLCBlcnJvcl91cmksIHN0YXRlLCBzZXNzaW9uX3N0YXRlfT17fVxyXG4gICAgKSB7XHJcbiAgICAgICAgIGlmICghZXJyb3Ipe1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBlcnJvciBwYXNzZWQgdG8gRXJyb3JSZXNwb25zZVwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXJyb3JcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlcihlcnJvcl9kZXNjcmlwdGlvbiB8fCBlcnJvcik7XHJcblxyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiRXJyb3JSZXNwb25zZVwiO1xyXG5cclxuICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7XHJcbiAgICAgICAgdGhpcy5lcnJvcl9kZXNjcmlwdGlvbiA9IGVycm9yX2Rlc2NyaXB0aW9uO1xyXG4gICAgICAgIHRoaXMuZXJyb3JfdXJpID0gZXJyb3JfdXJpO1xyXG5cclxuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XHJcbiAgICAgICAgdGhpcy5zZXNzaW9uX3N0YXRlID0gc2Vzc2lvbl9zdGF0ZTtcclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgRXZlbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG5hbWUpIHtcclxuICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTtcclxuICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRIYW5kbGVyKGNiKSB7XHJcbiAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnB1c2goY2IpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUhhbmRsZXIoY2IpIHtcclxuICAgICAgICB2YXIgaWR4ID0gdGhpcy5fY2FsbGJhY2tzLmZpbmRJbmRleChpdGVtID0+IGl0ZW0gPT09IGNiKTtcclxuICAgICAgICBpZiAoaWR4ID49IDApIHtcclxuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpZHgsIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByYWlzZSguLi5wYXJhbXMpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJFdmVudDogUmFpc2luZyBldmVudDogXCIgKyB0aGlzLl9uYW1lKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3NbaV0oLi4ucGFyYW1zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuY29uc3QgdGltZXIgPSB7XHJcbiAgICBzZXRJbnRlcnZhbDogZnVuY3Rpb24gKGNiLCBkdXJhdGlvbikge1xyXG4gICAgICAgIHJldHVybiBzZXRJbnRlcnZhbChjYiwgZHVyYXRpb24pO1xyXG4gICAgfSxcclxuICAgIGNsZWFySW50ZXJ2YWw6IGZ1bmN0aW9uIChoYW5kbGUpIHtcclxuICAgICAgICByZXR1cm4gY2xlYXJJbnRlcnZhbChoYW5kbGUpO1xyXG4gICAgfVxyXG59O1xyXG5cclxubGV0IHRlc3RpbmcgPSBmYWxzZTtcclxubGV0IHJlcXVlc3QgPSBudWxsO1xyXG5cclxuZXhwb3J0IGNsYXNzIEdsb2JhbCB7XHJcblxyXG4gICAgc3RhdGljIF90ZXN0aW5nKCkge1xyXG4gICAgICAgIHRlc3RpbmcgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXQgbG9jYXRpb24oKSB7XHJcbiAgICAgICAgaWYgKCF0ZXN0aW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBsb2NhbFN0b3JhZ2UoKSB7XHJcbiAgICAgICAgaWYgKCF0ZXN0aW5nICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXQgc2Vzc2lvblN0b3JhZ2UoKSB7XHJcbiAgICAgICAgaWYgKCF0ZXN0aW5nICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZXNzaW9uU3RvcmFnZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHNldFhNTEh0dHBSZXF1ZXN0KG5ld1JlcXVlc3QpIHtcclxuICAgICAgICByZXF1ZXN0ID0gbmV3UmVxdWVzdDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IFhNTEh0dHBSZXF1ZXN0KCkge1xyXG4gICAgICAgIGlmICghdGVzdGluZyAmJiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdCB8fCBYTUxIdHRwUmVxdWVzdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCB0aW1lcigpIHtcclxuICAgICAgICBpZiAoIXRlc3RpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRpbWVyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcbmltcG9ydCB7IElGcmFtZVdpbmRvdyB9IGZyb20gJy4vSUZyYW1lV2luZG93LmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBJRnJhbWVOYXZpZ2F0b3Ige1xyXG5cclxuICAgIHByZXBhcmUocGFyYW1zKSB7XHJcbiAgICAgICAgbGV0IGZyYW1lID0gbmV3IElGcmFtZVdpbmRvdyhwYXJhbXMpO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZnJhbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbGxiYWNrKHVybCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIklGcmFtZU5hdmlnYXRvci5jYWxsYmFja1wiKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgSUZyYW1lV2luZG93Lm5vdGlmeVBhcmVudCh1cmwpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5cclxuY29uc3QgRGVmYXVsdFRpbWVvdXQgPSAxMDAwMDtcclxuXHJcbmV4cG9ydCBjbGFzcyBJRnJhbWVXaW5kb3cge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xyXG4gICAgICAgIHRoaXMuX3Byb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmUgPSByZXNvbHZlO1xyXG4gICAgICAgICAgICB0aGlzLl9yZWplY3QgPSByZWplY3Q7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2JvdW5kTWVzc2FnZUV2ZW50ID0gdGhpcy5fbWVzc2FnZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLl9ib3VuZE1lc3NhZ2VFdmVudCwgZmFsc2UpO1xyXG5cclxuICAgICAgICB0aGlzLl9mcmFtZSA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xyXG5cclxuICAgICAgICAvLyBzaG90Z3VuIGFwcHJvYWNoXHJcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XHJcbiAgICAgICAgdGhpcy5fZnJhbWUud2lkdGggPSAwO1xyXG4gICAgICAgIHRoaXMuX2ZyYW1lLmhlaWdodCA9IDA7XHJcblxyXG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2ZyYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBuYXZpZ2F0ZShwYXJhbXMpIHtcclxuICAgICAgICBpZiAoIXBhcmFtcyB8fCAhcGFyYW1zLnVybCkge1xyXG4gICAgICAgICAgICB0aGlzLl9lcnJvcihcIk5vIHVybCBwcm92aWRlZFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCB0aW1lb3V0ID0gcGFyYW1zLnNpbGVudFJlcXVlc3RUaW1lb3V0IHx8IERlZmF1bHRUaW1lb3V0O1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJJRnJhbWVXaW5kb3cubmF2aWdhdGU6IFVzaW5nIHRpbWVvdXQgb2Y6XCIsIHRpbWVvdXQpO1xyXG4gICAgICAgICAgICB0aGlzLl90aW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuX3RpbWVvdXQuYmluZCh0aGlzKSwgdGltZW91dCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lLnNyYyA9IHBhcmFtcy51cmw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwcm9taXNlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIF9zdWNjZXNzKGRhdGEpIHtcclxuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XHJcblxyXG4gICAgICAgIExvZy5kZWJ1ZyhcIklGcmFtZVdpbmRvdzogU3VjY2Vzc2Z1bCByZXNwb25zZSBmcm9tIGZyYW1lIHdpbmRvd1wiKTtcclxuICAgICAgICB0aGlzLl9yZXNvbHZlKGRhdGEpO1xyXG4gICAgfVxyXG4gICAgX2Vycm9yKG1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XHJcblxyXG4gICAgICAgIExvZy5lcnJvcihtZXNzYWdlKTtcclxuICAgICAgICB0aGlzLl9yZWplY3QobmV3IEVycm9yKG1lc3NhZ2UpKTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZSgpIHtcclxuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgX2NsZWFudXAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2ZyYW1lKSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIklGcmFtZVdpbmRvdzogY2xlYW51cFwiKTtcclxuXHJcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLl9ib3VuZE1lc3NhZ2VFdmVudCwgZmFsc2UpO1xyXG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcclxuICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5fZnJhbWUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fdGltZXIgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLl9mcmFtZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuX2JvdW5kTWVzc2FnZUV2ZW50ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX3RpbWVvdXQoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiSUZyYW1lV2luZG93LnRpbWVvdXRcIik7XHJcbiAgICAgICAgdGhpcy5fZXJyb3IoXCJGcmFtZSB3aW5kb3cgdGltZWQgb3V0XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIF9tZXNzYWdlKGUpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJJRnJhbWVXaW5kb3cubWVzc2FnZVwiKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVyICYmXHJcbiAgICAgICAgICAgIGUub3JpZ2luID09PSB0aGlzLl9vcmlnaW4gJiZcclxuICAgICAgICAgICAgZS5zb3VyY2UgPT09IHRoaXMuX2ZyYW1lLmNvbnRlbnRXaW5kb3cgJiZcclxuICAgICAgICAgICAgKHR5cGVvZiBlLmRhdGEgPT09ICdzdHJpbmcnICYmIChlLmRhdGEuc3RhcnRzV2l0aCgnaHR0cDovLycpIHx8IGUuZGF0YS5zdGFydHNXaXRoKCdodHRwczovLycpKSlcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgbGV0IHVybCA9IGUuZGF0YTtcclxuICAgICAgICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3VjY2Vzcyh7IHVybDogdXJsIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyb3IoXCJJbnZhbGlkIHJlc3BvbnNlIGZyb20gZnJhbWVcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IF9vcmlnaW4oKSB7XHJcbiAgICAgICAgcmV0dXJuIGxvY2F0aW9uLnByb3RvY29sICsgXCIvL1wiICsgbG9jYXRpb24uaG9zdDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbm90aWZ5UGFyZW50KHVybCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIklGcmFtZVdpbmRvdy5ub3RpZnlQYXJlbnRcIik7XHJcbiAgICAgICAgdXJsID0gdXJsIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xyXG4gICAgICAgIGlmICh1cmwpIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiSUZyYW1lV2luZG93Lm5vdGlmeVBhcmVudDogcG9zdGluZyB1cmwgbWVzc2FnZSB0byBwYXJlbnRcIik7XHJcbiAgICAgICAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UodXJsLCBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiArIGxvY2F0aW9uLmhvc3QpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgSW5NZW1vcnlXZWJTdG9yYWdle1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB0aGlzLl9kYXRhID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SXRlbShrZXkpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJJbk1lbW9yeVdlYlN0b3JhZ2UuZ2V0SXRlbVwiLCBrZXkpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhW2tleV07XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SXRlbShrZXksIHZhbHVlKXtcclxuICAgICAgICBMb2cuZGVidWcoXCJJbk1lbW9yeVdlYlN0b3JhZ2Uuc2V0SXRlbVwiLCBrZXkpO1xyXG4gICAgICAgIHRoaXMuX2RhdGFba2V5XSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUl0ZW0oa2V5KXtcclxuICAgICAgICBMb2cuZGVidWcoXCJJbk1lbW9yeVdlYlN0b3JhZ2UucmVtb3ZlSXRlbVwiLCBrZXkpO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLl9kYXRhW2tleV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxlbmd0aCgpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcy5fZGF0YSkubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIGtleShpbmRleCkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzLl9kYXRhKVtpbmRleF07XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgandzLCBLZXlVdGlsLCBYNTA5LCBjcnlwdG8sIGhleHRvYjY0dSwgYjY0dG9oZXgsIEFsbG93ZWRTaWduaW5nQWxncyB9IGZyb20gJy4vY3J5cHRvL2pzcnNhc2lnbic7XHJcbmltcG9ydCBnZXRKb3NlVXRpbCBmcm9tICcuL0pvc2VVdGlsSW1wbCc7XHJcblxyXG5leHBvcnQgY29uc3QgSm9zZVV0aWwgPSBnZXRKb3NlVXRpbCh7IGp3cywgS2V5VXRpbCwgWDUwOSwgY3J5cHRvLCBoZXh0b2I2NHUsIGI2NHRvaGV4LCBBbGxvd2VkU2lnbmluZ0FsZ3MgfSk7XHJcbiIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCB7IExvZyB9IGZyb20gJy4vTG9nLmpzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEpvc2VVdGlsKHsgandzLCBLZXlVdGlsLCBYNTA5LCBjcnlwdG8sIGhleHRvYjY0dSwgYjY0dG9oZXgsIEFsbG93ZWRTaWduaW5nQWxncyB9KSB7XHJcbiAgICByZXR1cm4gY2xhc3MgSm9zZVV0aWwge1xyXG5cclxuICAgICAgICBzdGF0aWMgcGFyc2VKd3Qoand0KSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIkpvc2VVdGlsLnBhcnNlSnd0XCIpO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHRva2VuID0gandzLkpXUy5wYXJzZShqd3QpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBoZWFkZXI6IHRva2VuLmhlYWRlck9iaixcclxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB0b2tlbi5wYXlsb2FkT2JqXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIExvZy5lcnJvcihlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3RhdGljIHZhbGlkYXRlSnd0KGp3dCwga2V5LCBpc3N1ZXIsIGF1ZGllbmNlLCBjbG9ja1NrZXcsIG5vdywgdGltZUluc2Vuc2l0aXZlKSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIkpvc2VVdGlsLnZhbGlkYXRlSnd0XCIpO1xyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkua3R5ID09PSBcIlJTQVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5lICYmIGtleS5uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IEtleVV0aWwuZ2V0S2V5KGtleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkueDVjICYmIGtleS54NWMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoZXggPSBiNjR0b2hleChrZXkueDVjWzBdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gWDUwOS5nZXRQdWJsaWNLZXlGcm9tQ2VydEhleChoZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIkpvc2VVdGlsLnZhbGlkYXRlSnd0OiBSU0Ega2V5IG1pc3Npbmcga2V5IG1hdGVyaWFsXCIsIGtleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJSU0Ega2V5IG1pc3Npbmcga2V5IG1hdGVyaWFsXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5rdHkgPT09IFwiRUNcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkuY3J2ICYmIGtleS54ICYmIGtleS55KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IEtleVV0aWwuZ2V0S2V5KGtleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiSm9zZVV0aWwudmFsaWRhdGVKd3Q6IEVDIGtleSBtaXNzaW5nIGtleSBtYXRlcmlhbFwiLCBrZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRUMga2V5IG1pc3Npbmcga2V5IG1hdGVyaWFsXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIkpvc2VVdGlsLnZhbGlkYXRlSnd0OiBVbnN1cHBvcnRlZCBrZXkgdHlwZVwiLCBrZXkgJiYga2V5Lmt0eSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGtleSB0eXBlOiBcIiArIGtleSAmJiBrZXkua3R5KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpvc2VVdGlsLl92YWxpZGF0ZUp3dChqd3QsIGtleSwgaXNzdWVyLCBhdWRpZW5jZSwgY2xvY2tTa2V3LCBub3csIHRpbWVJbnNlbnNpdGl2ZSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIExvZy5lcnJvcihlICYmIGUubWVzc2FnZSB8fCBlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIkpXVCB2YWxpZGF0aW9uIGZhaWxlZFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3RhdGljIHZhbGlkYXRlSnd0QXR0cmlidXRlcyhqd3QsIGlzc3VlciwgYXVkaWVuY2UsIGNsb2NrU2tldywgbm93LCB0aW1lSW5zZW5zaXRpdmUpIHtcclxuICAgICAgICAgICAgaWYgKCFjbG9ja1NrZXcpIHtcclxuICAgICAgICAgICAgICAgIGNsb2NrU2tldyA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghbm93KSB7XHJcbiAgICAgICAgICAgICAgICBub3cgPSBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBwYXlsb2FkID0gSm9zZVV0aWwucGFyc2VKd3Qoand0KS5wYXlsb2FkO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFwYXlsb2FkLmlzcykge1xyXG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiSm9zZVV0aWwuX3ZhbGlkYXRlSnd0OiBpc3N1ZXIgd2FzIG5vdCBwcm92aWRlZFwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJpc3N1ZXIgd2FzIG5vdCBwcm92aWRlZFwiKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHBheWxvYWQuaXNzICE9PSBpc3N1ZXIpIHtcclxuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIkpvc2VVdGlsLl92YWxpZGF0ZUp3dDogSW52YWxpZCBpc3N1ZXIgaW4gdG9rZW5cIiwgcGF5bG9hZC5pc3MpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgaXNzdWVyIGluIHRva2VuOiBcIiArIHBheWxvYWQuaXNzKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghcGF5bG9hZC5hdWQpIHtcclxuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIkpvc2VVdGlsLl92YWxpZGF0ZUp3dDogYXVkIHdhcyBub3QgcHJvdmlkZWRcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiYXVkIHdhcyBub3QgcHJvdmlkZWRcIikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciB2YWxpZEF1ZGllbmNlID0gcGF5bG9hZC5hdWQgPT09IGF1ZGllbmNlIHx8IChBcnJheS5pc0FycmF5KHBheWxvYWQuYXVkKSAmJiBwYXlsb2FkLmF1ZC5pbmRleE9mKGF1ZGllbmNlKSA+PSAwKTtcclxuICAgICAgICAgICAgaWYgKCF2YWxpZEF1ZGllbmNlKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJKb3NlVXRpbC5fdmFsaWRhdGVKd3Q6IEludmFsaWQgYXVkaWVuY2UgaW4gdG9rZW5cIiwgcGF5bG9hZC5hdWQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgYXVkaWVuY2UgaW4gdG9rZW46IFwiICsgcGF5bG9hZC5hdWQpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocGF5bG9hZC5henAgJiYgcGF5bG9hZC5henAgIT09IGF1ZGllbmNlKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJKb3NlVXRpbC5fdmFsaWRhdGVKd3Q6IEludmFsaWQgYXpwIGluIHRva2VuXCIsIHBheWxvYWQuYXpwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJJbnZhbGlkIGF6cCBpbiB0b2tlbjogXCIgKyBwYXlsb2FkLmF6cCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRpbWVJbnNlbnNpdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGxvd2VyTm93ID0gbm93ICsgY2xvY2tTa2V3O1xyXG4gICAgICAgICAgICAgICAgdmFyIHVwcGVyTm93ID0gbm93IC0gY2xvY2tTa2V3O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghcGF5bG9hZC5pYXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJKb3NlVXRpbC5fdmFsaWRhdGVKd3Q6IGlhdCB3YXMgbm90IHByb3ZpZGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJpYXQgd2FzIG5vdCBwcm92aWRlZFwiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAobG93ZXJOb3cgPCBwYXlsb2FkLmlhdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIkpvc2VVdGlsLl92YWxpZGF0ZUp3dDogaWF0IGlzIGluIHRoZSBmdXR1cmVcIiwgcGF5bG9hZC5pYXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJpYXQgaXMgaW4gdGhlIGZ1dHVyZTogXCIgKyBwYXlsb2FkLmlhdCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkLm5iZiAmJiBsb3dlck5vdyA8IHBheWxvYWQubmJmKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiSm9zZVV0aWwuX3ZhbGlkYXRlSnd0OiBuYmYgaXMgaW4gdGhlIGZ1dHVyZVwiLCBwYXlsb2FkLm5iZik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIm5iZiBpcyBpbiB0aGUgZnV0dXJlOiBcIiArIHBheWxvYWQubmJmKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCFwYXlsb2FkLmV4cCkge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIkpvc2VVdGlsLl92YWxpZGF0ZUp3dDogZXhwIHdhcyBub3QgcHJvdmlkZWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImV4cCB3YXMgbm90IHByb3ZpZGVkXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkLmV4cCA8IHVwcGVyTm93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiSm9zZVV0aWwuX3ZhbGlkYXRlSnd0OiBleHAgaXMgaW4gdGhlIHBhc3RcIiwgcGF5bG9hZC5leHApO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJleHAgaXMgaW4gdGhlIHBhc3Q6XCIgKyBwYXlsb2FkLmV4cCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBheWxvYWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3RhdGljIF92YWxpZGF0ZUp3dChqd3QsIGtleSwgaXNzdWVyLCBhdWRpZW5jZSwgY2xvY2tTa2V3LCBub3csIHRpbWVJbnNlbnNpdGl2ZSkge1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIEpvc2VVdGlsLnZhbGlkYXRlSnd0QXR0cmlidXRlcyhqd3QsIGlzc3VlciwgYXVkaWVuY2UsIGNsb2NrU2tldywgbm93LCB0aW1lSW5zZW5zaXRpdmUpLnRoZW4ocGF5bG9hZCA9PiB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghandzLkpXUy52ZXJpZnkoand0LCBrZXksIEFsbG93ZWRTaWduaW5nQWxncykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiSm9zZVV0aWwuX3ZhbGlkYXRlSnd0OiBzaWduYXR1cmUgdmFsaWRhdGlvbiBmYWlsZWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJzaWduYXR1cmUgdmFsaWRhdGlvbiBmYWlsZWRcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKGUgJiYgZS5tZXNzYWdlIHx8IGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJzaWduYXR1cmUgdmFsaWRhdGlvbiBmYWlsZWRcIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN0YXRpYyBoYXNoU3RyaW5nKHZhbHVlLCBhbGcpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjcnlwdG8uVXRpbC5oYXNoU3RyaW5nKHZhbHVlLCBhbGcpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN0YXRpYyBoZXhUb0Jhc2U2NFVybCh2YWx1ZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhleHRvYjY0dSh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIExvZy5lcnJvcihlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gJy4vR2xvYmFsLmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBKc29uU2VydmljZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBhZGRpdGlvbmFsQ29udGVudFR5cGVzID0gbnVsbCwgXHJcbiAgICAgICAgWE1MSHR0cFJlcXVlc3RDdG9yID0gR2xvYmFsLlhNTEh0dHBSZXF1ZXN0LCBcclxuICAgICAgICBqd3RIYW5kbGVyID0gbnVsbFxyXG4gICAgKSB7XHJcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxDb250ZW50VHlwZXMgJiYgQXJyYXkuaXNBcnJheShhZGRpdGlvbmFsQ29udGVudFR5cGVzKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRUeXBlcyA9IGFkZGl0aW9uYWxDb250ZW50VHlwZXMuc2xpY2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fY29udGVudFR5cGVzID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NvbnRlbnRUeXBlcy5wdXNoKCdhcHBsaWNhdGlvbi9qc29uJyk7XHJcbiAgICAgICAgaWYgKGp3dEhhbmRsZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fY29udGVudFR5cGVzLnB1c2goJ2FwcGxpY2F0aW9uL2p3dCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fWE1MSHR0cFJlcXVlc3QgPSBYTUxIdHRwUmVxdWVzdEN0b3I7XHJcbiAgICAgICAgdGhpcy5fand0SGFuZGxlciA9IGp3dEhhbmRsZXI7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SnNvbih1cmwsIHRva2VuKSB7XHJcbiAgICAgICAgaWYgKCF1cmwpe1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJKc29uU2VydmljZS5nZXRKc29uOiBObyB1cmwgcGFzc2VkXCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1cmxcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBMb2cuZGVidWcoXCJKc29uU2VydmljZS5nZXRKc29uLCB1cmw6IFwiLCB1cmwpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgdmFyIHJlcSA9IG5ldyB0aGlzLl9YTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgICAgICAgICByZXEub3BlbignR0VUJywgdXJsKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBhbGxvd2VkQ29udGVudFR5cGVzID0gdGhpcy5fY29udGVudFR5cGVzO1xyXG4gICAgICAgICAgICB2YXIgand0SGFuZGxlciA9IHRoaXMuX2p3dEhhbmRsZXI7XHJcblxyXG4gICAgICAgICAgICByZXEub25sb2FkID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJKc29uU2VydmljZS5nZXRKc29uOiBIVFRQIHJlc3BvbnNlIHJlY2VpdmVkLCBzdGF0dXNcIiwgcmVxLnN0YXR1cyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHJlcS5zdGF0dXMgPT09IDIwMCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgY29udGVudFR5cGUgPSByZXEuZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LVR5cGVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm91bmQgPSBhbGxvd2VkQ29udGVudFR5cGVzLmZpbmQoaXRlbT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlLnN0YXJ0c1dpdGgoaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQgPT0gXCJhcHBsaWNhdGlvbi9qd3RcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgand0SGFuZGxlcihyZXEpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoSlNPTi5wYXJzZShyZXEucmVzcG9uc2VUZXh0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJKc29uU2VydmljZS5nZXRKc29uOiBFcnJvciBwYXJzaW5nIEpTT04gcmVzcG9uc2VcIiwgZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IoXCJJbnZhbGlkIHJlc3BvbnNlIENvbnRlbnQtVHlwZTogXCIgKyBjb250ZW50VHlwZSArIFwiLCBmcm9tIFVSTDogXCIgKyB1cmwpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChFcnJvcihyZXEuc3RhdHVzVGV4dCArIFwiIChcIiArIHJlcS5zdGF0dXMgKyBcIilcIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgcmVxLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIkpzb25TZXJ2aWNlLmdldEpzb246IG5ldHdvcmsgZXJyb3JcIik7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IoXCJOZXR3b3JrIEVycm9yXCIpKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0b2tlbikge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiSnNvblNlcnZpY2UuZ2V0SnNvbjogdG9rZW4gcGFzc2VkLCBzZXR0aW5nIEF1dGhvcml6YXRpb24gaGVhZGVyXCIpO1xyXG4gICAgICAgICAgICAgICAgcmVxLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiICsgdG9rZW4pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXEuc2VuZCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHBvc3RGb3JtKHVybCwgcGF5bG9hZCwgYmFzaWNBdXRoKSB7XHJcbiAgICAgICAgaWYgKCF1cmwpe1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJKc29uU2VydmljZS5wb3N0Rm9ybTogTm8gdXJsIHBhc3NlZFwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidXJsXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgTG9nLmRlYnVnKFwiSnNvblNlcnZpY2UucG9zdEZvcm0sIHVybDogXCIsIHVybCk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICAgICAgICB2YXIgcmVxID0gbmV3IHRoaXMuX1hNTEh0dHBSZXF1ZXN0KCk7XHJcbiAgICAgICAgICAgIHJlcS5vcGVuKCdQT1NUJywgdXJsKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBhbGxvd2VkQ29udGVudFR5cGVzID0gdGhpcy5fY29udGVudFR5cGVzO1xyXG5cclxuICAgICAgICAgICAgcmVxLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiSnNvblNlcnZpY2UucG9zdEZvcm06IEhUVFAgcmVzcG9uc2UgcmVjZWl2ZWQsIHN0YXR1c1wiLCByZXEuc3RhdHVzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocmVxLnN0YXR1cyA9PT0gMjAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb250ZW50VHlwZSA9IHJlcS5nZXRSZXNwb25zZUhlYWRlcihcIkNvbnRlbnQtVHlwZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudFR5cGUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmb3VuZCA9IGFsbG93ZWRDb250ZW50VHlwZXMuZmluZChpdGVtPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudFR5cGUuc3RhcnRzV2l0aChpdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKEpTT04ucGFyc2UocmVxLnJlc3BvbnNlVGV4dCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiSnNvblNlcnZpY2UucG9zdEZvcm06IEVycm9yIHBhcnNpbmcgSlNPTiByZXNwb25zZVwiLCBlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChFcnJvcihcIkludmFsaWQgcmVzcG9uc2UgQ29udGVudC1UeXBlOiBcIiArIGNvbnRlbnRUeXBlICsgXCIsIGZyb20gVVJMOiBcIiArIHVybCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocmVxLnN0YXR1cyA9PT0gNDAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb250ZW50VHlwZSA9IHJlcS5nZXRSZXNwb25zZUhlYWRlcihcIkNvbnRlbnQtVHlwZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudFR5cGUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmb3VuZCA9IGFsbG93ZWRDb250ZW50VHlwZXMuZmluZChpdGVtPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudFR5cGUuc3RhcnRzV2l0aChpdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGF5bG9hZCA9IEpTT04ucGFyc2UocmVxLnJlc3BvbnNlVGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBheWxvYWQgJiYgcGF5bG9hZC5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJKc29uU2VydmljZS5wb3N0Rm9ybTogRXJyb3IgZnJvbSBzZXJ2ZXI6IFwiLCBwYXlsb2FkLmVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihwYXlsb2FkLmVycm9yKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIkpzb25TZXJ2aWNlLnBvc3RGb3JtOiBFcnJvciBwYXJzaW5nIEpTT04gcmVzcG9uc2VcIiwgZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJlamVjdChFcnJvcihyZXEuc3RhdHVzVGV4dCArIFwiIChcIiArIHJlcS5zdGF0dXMgKyBcIilcIikpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgcmVxLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIkpzb25TZXJ2aWNlLnBvc3RGb3JtOiBuZXR3b3JrIGVycm9yXCIpO1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KEVycm9yKFwiTmV0d29yayBFcnJvclwiKSk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBsZXQgYm9keSA9IFwiXCI7XHJcbiAgICAgICAgICAgIGZvcihsZXQga2V5IGluIHBheWxvYWQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBwYXlsb2FkW2tleV07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChib2R5Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSArPSBcIiZcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSBcIj1cIjtcclxuICAgICAgICAgICAgICAgICAgICBib2R5ICs9IGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlcS5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGJhc2ljQXV0aCAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXEuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCYXNpYyBcIiArIGJ0b2EoYmFzaWNBdXRoKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlcS5zZW5kKGJvZHkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmxldCBub3BMb2dnZXIgPSB7XHJcbiAgICBkZWJ1Zygpe30sXHJcbiAgICBpbmZvKCl7fSxcclxuICAgIHdhcm4oKXt9LFxyXG4gICAgZXJyb3IoKXt9XHJcbn07XHJcblxyXG5jb25zdCBOT05FID0gMDtcclxuY29uc3QgRVJST1IgPSAxO1xyXG5jb25zdCBXQVJOID0gMjtcclxuY29uc3QgSU5GTyA9IDM7XHJcbmNvbnN0IERFQlVHID0gNDtcclxuXHJcbmxldCBsb2dnZXI7XHJcbmxldCBsZXZlbDtcclxuXHJcbmV4cG9ydCBjbGFzcyBMb2cge1xyXG4gICAgc3RhdGljIGdldCBOT05FKCkge3JldHVybiBOT05FfTtcclxuICAgIHN0YXRpYyBnZXQgRVJST1IoKSB7cmV0dXJuIEVSUk9SfTtcclxuICAgIHN0YXRpYyBnZXQgV0FSTigpIHtyZXR1cm4gV0FSTn07XHJcbiAgICBzdGF0aWMgZ2V0IElORk8oKSB7cmV0dXJuIElORk99O1xyXG4gICAgc3RhdGljIGdldCBERUJVRygpIHtyZXR1cm4gREVCVUd9O1xyXG4gICAgXHJcbiAgICBzdGF0aWMgcmVzZXQoKXtcclxuICAgICAgICBsZXZlbCA9IElORk87XHJcbiAgICAgICAgbG9nZ2VyID0gbm9wTG9nZ2VyO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBzdGF0aWMgZ2V0IGxldmVsKCl7XHJcbiAgICAgICAgcmV0dXJuIGxldmVsO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIHNldCBsZXZlbCh2YWx1ZSl7XHJcbiAgICAgICAgaWYgKE5PTkUgPD0gdmFsdWUgJiYgdmFsdWUgPD0gREVCVUcpe1xyXG4gICAgICAgICAgICBsZXZlbCA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBsb2cgbGV2ZWxcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBzdGF0aWMgZ2V0IGxvZ2dlcigpe1xyXG4gICAgICAgIHJldHVybiBsb2dnZXI7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgc2V0IGxvZ2dlcih2YWx1ZSl7XHJcbiAgICAgICAgaWYgKCF2YWx1ZS5kZWJ1ZyAmJiB2YWx1ZS5pbmZvKSB7XHJcbiAgICAgICAgICAgIC8vIGp1c3QgdG8gc3RheSBiYWNrd2FyZHMgY29tcGF0LiBjYW4gcmVtb3ZlIGluIDIuMFxyXG4gICAgICAgICAgICB2YWx1ZS5kZWJ1ZyA9IHZhbHVlLmluZm87XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodmFsdWUuZGVidWcgJiYgdmFsdWUuaW5mbyAmJiB2YWx1ZS53YXJuICYmIHZhbHVlLmVycm9yKXtcclxuICAgICAgICAgICAgbG9nZ2VyID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxvZ2dlclwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHN0YXRpYyBkZWJ1ZyguLi5hcmdzKXtcclxuICAgICAgICBpZiAobGV2ZWwgPj0gREVCVUcpe1xyXG4gICAgICAgICAgICBsb2dnZXIuZGVidWcuYXBwbHkobG9nZ2VyLCBBcnJheS5mcm9tKGFyZ3MpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgaW5mbyguLi5hcmdzKXtcclxuICAgICAgICBpZiAobGV2ZWwgPj0gSU5GTyl7XHJcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvLmFwcGx5KGxvZ2dlciwgQXJyYXkuZnJvbShhcmdzKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIHdhcm4oLi4uYXJncyl7XHJcbiAgICAgICAgaWYgKGxldmVsID49IFdBUk4pe1xyXG4gICAgICAgICAgICBsb2dnZXIud2Fybi5hcHBseShsb2dnZXIsIEFycmF5LmZyb20oYXJncykpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXRpYyBlcnJvciguLi5hcmdzKXtcclxuICAgICAgICBpZiAobGV2ZWwgPj0gRVJST1Ipe1xyXG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IuYXBwbHkobG9nZ2VyLCBBcnJheS5mcm9tKGFyZ3MpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbkxvZy5yZXNldCgpO1xyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcbmltcG9ydCB7IEpzb25TZXJ2aWNlIH0gZnJvbSAnLi9Kc29uU2VydmljZS5qcyc7XHJcblxyXG5jb25zdCBPaWRjTWV0YWRhdGFVcmxQYXRoID0gJy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uJztcclxuXHJcbmV4cG9ydCBjbGFzcyBNZXRhZGF0YVNlcnZpY2Uge1xyXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MsIEpzb25TZXJ2aWNlQ3RvciA9IEpzb25TZXJ2aWNlKSB7XHJcbiAgICAgICAgaWYgKCFzZXR0aW5ncykge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJNZXRhZGF0YVNlcnZpY2U6IE5vIHNldHRpbmdzIHBhc3NlZCB0byBNZXRhZGF0YVNlcnZpY2VcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNldHRpbmdzXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBzZXR0aW5ncztcclxuICAgICAgICB0aGlzLl9qc29uU2VydmljZSA9IG5ldyBKc29uU2VydmljZUN0b3IoWydhcHBsaWNhdGlvbi9qd2stc2V0K2pzb24nXSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1ldGFkYXRhVXJsKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fbWV0YWRhdGFVcmwpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLm1ldGFkYXRhVXJsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVVybCA9IHRoaXMuX3NldHRpbmdzLm1ldGFkYXRhVXJsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGFVcmwgPSB0aGlzLl9zZXR0aW5ncy5hdXRob3JpdHk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21ldGFkYXRhVXJsICYmIHRoaXMuX21ldGFkYXRhVXJsLmluZGV4T2YoT2lkY01ldGFkYXRhVXJsUGF0aCkgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX21ldGFkYXRhVXJsW3RoaXMuX21ldGFkYXRhVXJsLmxlbmd0aCAtIDFdICE9PSAnLycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGFVcmwgKz0gJy8nO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVVybCArPSBPaWRjTWV0YWRhdGFVcmxQYXRoO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFVcmw7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXRTaWduaW5nS2V5cygpIHtcclxuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IHRoaXMuX3NldHRpbmdzIHx8IHt9XHJcbiAgICAgICAgdGhpcy5fc2V0dGluZ3Muc2lnbmluZ0tleXMgPSB1bmRlZmluZWRcclxuICAgIH1cclxuXHJcbiAgICBnZXRNZXRhZGF0YSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3MubWV0YWRhdGEpIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiTWV0YWRhdGFTZXJ2aWNlLmdldE1ldGFkYXRhOiBSZXR1cm5pbmcgbWV0YWRhdGEgZnJvbSBzZXR0aW5nc1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9zZXR0aW5ncy5tZXRhZGF0YSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMubWV0YWRhdGFVcmwpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTWV0YWRhdGFTZXJ2aWNlLmdldE1ldGFkYXRhOiBObyBhdXRob3JpdHkgb3IgbWV0YWRhdGFVcmwgY29uZmlndXJlZCBvbiBzZXR0aW5nc1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGF1dGhvcml0eSBvciBtZXRhZGF0YVVybCBjb25maWd1cmVkIG9uIHNldHRpbmdzXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIExvZy5kZWJ1ZyhcIk1ldGFkYXRhU2VydmljZS5nZXRNZXRhZGF0YTogZ2V0dGluZyBtZXRhZGF0YSBmcm9tXCIsIHRoaXMubWV0YWRhdGFVcmwpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fanNvblNlcnZpY2UuZ2V0SnNvbih0aGlzLm1ldGFkYXRhVXJsKVxyXG4gICAgICAgICAgICAudGhlbihtZXRhZGF0YSA9PiB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJNZXRhZGF0YVNlcnZpY2UuZ2V0TWV0YWRhdGE6IGpzb24gcmVjZWl2ZWRcIik7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHZhciBzZWVkID0gdGhpcy5fc2V0dGluZ3MubWV0YWRhdGFTZWVkIHx8IHt9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3MubWV0YWRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBzZWVkLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3MubWV0YWRhdGE7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldElzc3VlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0YWRhdGFQcm9wZXJ0eShcImlzc3VlclwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBdXRob3JpemF0aW9uRW5kcG9pbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJhdXRob3JpemF0aW9uX2VuZHBvaW50XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFVzZXJJbmZvRW5kcG9pbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJ1c2VyaW5mb19lbmRwb2ludFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRUb2tlbkVuZHBvaW50KG9wdGlvbmFsPXRydWUpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0YWRhdGFQcm9wZXJ0eShcInRva2VuX2VuZHBvaW50XCIsIG9wdGlvbmFsKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDaGVja1Nlc3Npb25JZnJhbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJjaGVja19zZXNzaW9uX2lmcmFtZVwiLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRFbmRTZXNzaW9uRW5kcG9pbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJlbmRfc2Vzc2lvbl9lbmRwb2ludFwiLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRSZXZvY2F0aW9uRW5kcG9pbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJyZXZvY2F0aW9uX2VuZHBvaW50XCIsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEtleXNFbmRwb2ludCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0YWRhdGFQcm9wZXJ0eShcImp3a3NfdXJpXCIsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIF9nZXRNZXRhZGF0YVByb3BlcnR5KG5hbWUsIG9wdGlvbmFsPWZhbHNlKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiTWV0YWRhdGFTZXJ2aWNlLmdldE1ldGFkYXRhUHJvcGVydHkgZm9yOiBcIiArIG5hbWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRNZXRhZGF0YSgpLnRoZW4obWV0YWRhdGEgPT4ge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJNZXRhZGF0YVNlcnZpY2UuZ2V0TWV0YWRhdGFQcm9wZXJ0eTogbWV0YWRhdGEgcmVjaWV2ZWRcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAobWV0YWRhdGFbbmFtZV0gPT09IHVuZGVmaW5lZCkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25hbCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy53YXJuKFwiTWV0YWRhdGFTZXJ2aWNlLmdldE1ldGFkYXRhUHJvcGVydHk6IE1ldGFkYXRhIGRvZXMgbm90IGNvbnRhaW4gb3B0aW9uYWwgcHJvcGVydHkgXCIgKyBuYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTWV0YWRhdGFTZXJ2aWNlLmdldE1ldGFkYXRhUHJvcGVydHk6IE1ldGFkYXRhIGRvZXMgbm90IGNvbnRhaW4gcHJvcGVydHkgXCIgKyBuYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRhZGF0YSBkb2VzIG5vdCBjb250YWluIHByb3BlcnR5IFwiICsgbmFtZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YVtuYW1lXTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTaWduaW5nS2V5cygpIHtcclxuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3Muc2lnbmluZ0tleXMpIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiTWV0YWRhdGFTZXJ2aWNlLmdldFNpZ25pbmdLZXlzOiBSZXR1cm5pbmcgc2lnbmluZ0tleXMgZnJvbSBzZXR0aW5nc1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9zZXR0aW5ncy5zaWduaW5nS2V5cyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0YWRhdGFQcm9wZXJ0eShcImp3a3NfdXJpXCIpLnRoZW4oandrc191cmkgPT4ge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJNZXRhZGF0YVNlcnZpY2UuZ2V0U2lnbmluZ0tleXM6IGp3a3NfdXJpIHJlY2VpdmVkXCIsIGp3a3NfdXJpKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9qc29uU2VydmljZS5nZXRKc29uKGp3a3NfdXJpKS50aGVuKGtleVNldCA9PiB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJNZXRhZGF0YVNlcnZpY2UuZ2V0U2lnbmluZ0tleXM6IGtleSBzZXQgcmVjZWl2ZWRcIiwga2V5U2V0KTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWtleVNldC5rZXlzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTWV0YWRhdGFTZXJ2aWNlLmdldFNpZ25pbmdLZXlzOiBNaXNzaW5nIGtleXMgb24ga2V5c2V0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3Npbmcga2V5cyBvbiBrZXlzZXRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3Muc2lnbmluZ0tleXMgPSBrZXlTZXQua2V5cztcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncy5zaWduaW5nS2V5cztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5pbXBvcnQgeyBPaWRjQ2xpZW50U2V0dGluZ3MgfSBmcm9tICcuL09pZGNDbGllbnRTZXR0aW5ncy5qcyc7XHJcbmltcG9ydCB7IEVycm9yUmVzcG9uc2UgfSBmcm9tICcuL0Vycm9yUmVzcG9uc2UuanMnO1xyXG5pbXBvcnQgeyBTaWduaW5SZXF1ZXN0IH0gZnJvbSAnLi9TaWduaW5SZXF1ZXN0LmpzJztcclxuaW1wb3J0IHsgU2lnbmluUmVzcG9uc2UgfSBmcm9tICcuL1NpZ25pblJlc3BvbnNlLmpzJztcclxuaW1wb3J0IHsgU2lnbm91dFJlcXVlc3QgfSBmcm9tICcuL1NpZ25vdXRSZXF1ZXN0LmpzJztcclxuaW1wb3J0IHsgU2lnbm91dFJlc3BvbnNlIH0gZnJvbSAnLi9TaWdub3V0UmVzcG9uc2UuanMnO1xyXG5pbXBvcnQgeyBTaWduaW5TdGF0ZSB9IGZyb20gJy4vU2lnbmluU3RhdGUuanMnO1xyXG5pbXBvcnQgeyBTdGF0ZSB9IGZyb20gJy4vU3RhdGUuanMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIE9pZGNDbGllbnQge1xyXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MgPSB7fSkge1xyXG4gICAgICAgIGlmIChzZXR0aW5ncyBpbnN0YW5jZW9mIE9pZGNDbGllbnRTZXR0aW5ncykge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IHNldHRpbmdzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBuZXcgT2lkY0NsaWVudFNldHRpbmdzKHNldHRpbmdzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IF9zdGF0ZVN0b3JlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnN0YXRlU3RvcmU7XHJcbiAgICB9XHJcbiAgICBnZXQgX3ZhbGlkYXRvcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy52YWxpZGF0b3I7XHJcbiAgICB9XHJcbiAgICBnZXQgX21ldGFkYXRhU2VydmljZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5tZXRhZGF0YVNlcnZpY2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNldHRpbmdzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncztcclxuICAgIH1cclxuICAgIGdldCBtZXRhZGF0YVNlcnZpY2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZTtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVTaWduaW5SZXF1ZXN0KHtcclxuICAgICAgICByZXNwb25zZV90eXBlLCBzY29wZSwgcmVkaXJlY3RfdXJpLFxyXG4gICAgICAgIC8vIGRhdGEgd2FzIG1lYW50IHRvIGJlIHRoZSBwbGFjZSBhIGNhbGxlciBjb3VsZCBpbmRpY2F0ZSB0aGUgZGF0YSB0b1xyXG4gICAgICAgIC8vIGhhdmUgcm91bmQgdHJpcHBlZCwgYnV0IHBlb3BsZSB3ZXJlIGdldHRpbmcgY29uZnVzZWQsIHNvIGkgYWRkZWQgc3RhdGUgKHNpbmNlIHRoYXQgbWF0Y2hlcyB0aGUgc3BlYylcclxuICAgICAgICAvLyBhbmQgc28gbm93IGlmIGRhdGEgaXMgbm90IHBhc3NlZCwgYnV0IHN0YXRlIGlzIHRoZW4gc3RhdGUgd2lsbCBiZSB1c2VkXHJcbiAgICAgICAgZGF0YSwgc3RhdGUsIHByb21wdCwgZGlzcGxheSwgbWF4X2FnZSwgdWlfbG9jYWxlcywgaWRfdG9rZW5faGludCwgbG9naW5faGludCwgYWNyX3ZhbHVlcyxcclxuICAgICAgICByZXNvdXJjZSwgcmVxdWVzdCwgcmVxdWVzdF91cmksIHJlc3BvbnNlX21vZGUsIGV4dHJhUXVlcnlQYXJhbXMsIGV4dHJhVG9rZW5QYXJhbXMsIHJlcXVlc3RfdHlwZSwgc2tpcFVzZXJJbmZvIH0gPSB7fSxcclxuICAgICAgICBzdGF0ZVN0b3JlXHJcbiAgICApIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJPaWRjQ2xpZW50LmNyZWF0ZVNpZ25pblJlcXVlc3RcIik7XHJcblxyXG4gICAgICAgIGxldCBjbGllbnRfaWQgPSB0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQ7XHJcbiAgICAgICAgcmVzcG9uc2VfdHlwZSA9IHJlc3BvbnNlX3R5cGUgfHwgdGhpcy5fc2V0dGluZ3MucmVzcG9uc2VfdHlwZTtcclxuICAgICAgICBzY29wZSA9IHNjb3BlIHx8IHRoaXMuX3NldHRpbmdzLnNjb3BlO1xyXG4gICAgICAgIHJlZGlyZWN0X3VyaSA9IHJlZGlyZWN0X3VyaSB8fCB0aGlzLl9zZXR0aW5ncy5yZWRpcmVjdF91cmk7XHJcblxyXG4gICAgICAgIC8vIGlkX3Rva2VuX2hpbnQsIGxvZ2luX2hpbnQgYXJlbid0IGFsbG93ZWQgb24gX3NldHRpbmdzXHJcbiAgICAgICAgcHJvbXB0ID0gcHJvbXB0IHx8IHRoaXMuX3NldHRpbmdzLnByb21wdDtcclxuICAgICAgICBkaXNwbGF5ID0gZGlzcGxheSB8fCB0aGlzLl9zZXR0aW5ncy5kaXNwbGF5O1xyXG4gICAgICAgIG1heF9hZ2UgPSBtYXhfYWdlIHx8IHRoaXMuX3NldHRpbmdzLm1heF9hZ2U7XHJcbiAgICAgICAgdWlfbG9jYWxlcyA9IHVpX2xvY2FsZXMgfHwgdGhpcy5fc2V0dGluZ3MudWlfbG9jYWxlcztcclxuICAgICAgICBhY3JfdmFsdWVzID0gYWNyX3ZhbHVlcyB8fCB0aGlzLl9zZXR0aW5ncy5hY3JfdmFsdWVzO1xyXG4gICAgICAgIHJlc291cmNlID0gcmVzb3VyY2UgfHwgdGhpcy5fc2V0dGluZ3MucmVzb3VyY2U7XHJcbiAgICAgICAgcmVzcG9uc2VfbW9kZSA9IHJlc3BvbnNlX21vZGUgfHwgdGhpcy5fc2V0dGluZ3MucmVzcG9uc2VfbW9kZTtcclxuICAgICAgICBleHRyYVF1ZXJ5UGFyYW1zID0gZXh0cmFRdWVyeVBhcmFtcyB8fCB0aGlzLl9zZXR0aW5ncy5leHRyYVF1ZXJ5UGFyYW1zO1xyXG4gICAgICAgIGV4dHJhVG9rZW5QYXJhbXMgPSBleHRyYVRva2VuUGFyYW1zIHx8IHRoaXMuX3NldHRpbmdzLmV4dHJhVG9rZW5QYXJhbXM7XHJcblxyXG4gICAgICAgIGxldCBhdXRob3JpdHkgPSB0aGlzLl9zZXR0aW5ncy5hdXRob3JpdHk7XHJcblxyXG4gICAgICAgIGlmIChTaWduaW5SZXF1ZXN0LmlzQ29kZShyZXNwb25zZV90eXBlKSAmJiByZXNwb25zZV90eXBlICE9PSBcImNvZGVcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiT3BlbklEIENvbm5lY3QgaHlicmlkIGZsb3cgaXMgbm90IHN1cHBvcnRlZFwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlLmdldEF1dGhvcml6YXRpb25FbmRwb2ludCgpLnRoZW4odXJsID0+IHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiT2lkY0NsaWVudC5jcmVhdGVTaWduaW5SZXF1ZXN0OiBSZWNlaXZlZCBhdXRob3JpemF0aW9uIGVuZHBvaW50XCIsIHVybCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgc2lnbmluUmVxdWVzdCA9IG5ldyBTaWduaW5SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgIHVybCxcclxuICAgICAgICAgICAgICAgIGNsaWVudF9pZCxcclxuICAgICAgICAgICAgICAgIHJlZGlyZWN0X3VyaSxcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlX3R5cGUsXHJcbiAgICAgICAgICAgICAgICBzY29wZSxcclxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEgfHwgc3RhdGUsXHJcbiAgICAgICAgICAgICAgICBhdXRob3JpdHksXHJcbiAgICAgICAgICAgICAgICBwcm9tcHQsIGRpc3BsYXksIG1heF9hZ2UsIHVpX2xvY2FsZXMsIGlkX3Rva2VuX2hpbnQsIGxvZ2luX2hpbnQsIGFjcl92YWx1ZXMsXHJcbiAgICAgICAgICAgICAgICByZXNvdXJjZSwgcmVxdWVzdCwgcmVxdWVzdF91cmksIGV4dHJhUXVlcnlQYXJhbXMsIGV4dHJhVG9rZW5QYXJhbXMsIHJlcXVlc3RfdHlwZSwgcmVzcG9uc2VfbW9kZSxcclxuICAgICAgICAgICAgICAgIGNsaWVudF9zZWNyZXQ6IHRoaXMuX3NldHRpbmdzLmNsaWVudF9zZWNyZXQsXHJcbiAgICAgICAgICAgICAgICBza2lwVXNlckluZm9cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB2YXIgc2lnbmluU3RhdGUgPSBzaWduaW5SZXF1ZXN0LnN0YXRlO1xyXG4gICAgICAgICAgICBzdGF0ZVN0b3JlID0gc3RhdGVTdG9yZSB8fCB0aGlzLl9zdGF0ZVN0b3JlO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlU3RvcmUuc2V0KHNpZ25pblN0YXRlLmlkLCBzaWduaW5TdGF0ZS50b1N0b3JhZ2VTdHJpbmcoKSkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc2lnbmluUmVxdWVzdDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVhZFNpZ25pblJlc3BvbnNlU3RhdGUodXJsLCBzdGF0ZVN0b3JlLCByZW1vdmVTdGF0ZSA9IGZhbHNlKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiT2lkY0NsaWVudC5yZWFkU2lnbmluUmVzcG9uc2VTdGF0ZVwiKTtcclxuXHJcbiAgICAgICAgbGV0IHVzZVF1ZXJ5ID0gdGhpcy5fc2V0dGluZ3MucmVzcG9uc2VfbW9kZSA9PT0gXCJxdWVyeVwiIHx8IFxyXG4gICAgICAgICAgICAoIXRoaXMuX3NldHRpbmdzLnJlc3BvbnNlX21vZGUgJiYgU2lnbmluUmVxdWVzdC5pc0NvZGUodGhpcy5fc2V0dGluZ3MucmVzcG9uc2VfdHlwZSkpO1xyXG4gICAgICAgIGxldCBkZWxpbWl0ZXIgPSB1c2VRdWVyeSA/IFwiP1wiIDogXCIjXCI7XHJcblxyXG4gICAgICAgIHZhciByZXNwb25zZSA9IG5ldyBTaWduaW5SZXNwb25zZSh1cmwsIGRlbGltaXRlcik7XHJcblxyXG4gICAgICAgIGlmICghcmVzcG9uc2Uuc3RhdGUpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiT2lkY0NsaWVudC5yZWFkU2lnbmluUmVzcG9uc2VTdGF0ZTogTm8gc3RhdGUgaW4gcmVzcG9uc2VcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBzdGF0ZSBpbiByZXNwb25zZVwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdGF0ZVN0b3JlID0gc3RhdGVTdG9yZSB8fCB0aGlzLl9zdGF0ZVN0b3JlO1xyXG5cclxuICAgICAgICB2YXIgc3RhdGVBcGkgPSByZW1vdmVTdGF0ZSA/IHN0YXRlU3RvcmUucmVtb3ZlLmJpbmQoc3RhdGVTdG9yZSkgOiBzdGF0ZVN0b3JlLmdldC5iaW5kKHN0YXRlU3RvcmUpO1xyXG5cclxuICAgICAgICByZXR1cm4gc3RhdGVBcGkocmVzcG9uc2Uuc3RhdGUpLnRoZW4oc3RvcmVkU3RhdGVTdHJpbmcgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXN0b3JlZFN0YXRlU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJPaWRjQ2xpZW50LnJlYWRTaWduaW5SZXNwb25zZVN0YXRlOiBObyBtYXRjaGluZyBzdGF0ZSBmb3VuZCBpbiBzdG9yYWdlXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gbWF0Y2hpbmcgc3RhdGUgZm91bmQgaW4gc3RvcmFnZVwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHN0YXRlID0gU2lnbmluU3RhdGUuZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmVkU3RhdGVTdHJpbmcpO1xyXG4gICAgICAgICAgICByZXR1cm4ge3N0YXRlLCByZXNwb25zZX07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvY2Vzc1NpZ25pblJlc3BvbnNlKHVybCwgc3RhdGVTdG9yZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIk9pZGNDbGllbnQucHJvY2Vzc1NpZ25pblJlc3BvbnNlXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5yZWFkU2lnbmluUmVzcG9uc2VTdGF0ZSh1cmwsIHN0YXRlU3RvcmUsIHRydWUpLnRoZW4oKHtzdGF0ZSwgcmVzcG9uc2V9KSA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIk9pZGNDbGllbnQucHJvY2Vzc1NpZ25pblJlc3BvbnNlOiBSZWNlaXZlZCBzdGF0ZSBmcm9tIHN0b3JhZ2U7IHZhbGlkYXRpbmcgcmVzcG9uc2VcIik7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0b3IudmFsaWRhdGVTaWduaW5SZXNwb25zZShzdGF0ZSwgcmVzcG9uc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVNpZ25vdXRSZXF1ZXN0KHtpZF90b2tlbl9oaW50LCBkYXRhLCBzdGF0ZSwgcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpLCBleHRyYVF1ZXJ5UGFyYW1zLCByZXF1ZXN0X3R5cGUgfSA9IHt9LFxyXG4gICAgICAgIHN0YXRlU3RvcmVcclxuICAgICkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIk9pZGNDbGllbnQuY3JlYXRlU2lnbm91dFJlcXVlc3RcIik7XHJcblxyXG4gICAgICAgIHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSA9IHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSB8fCB0aGlzLl9zZXR0aW5ncy5wb3N0X2xvZ291dF9yZWRpcmVjdF91cmk7XHJcbiAgICAgICAgZXh0cmFRdWVyeVBhcmFtcyA9IGV4dHJhUXVlcnlQYXJhbXMgfHwgdGhpcy5fc2V0dGluZ3MuZXh0cmFRdWVyeVBhcmFtcztcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZS5nZXRFbmRTZXNzaW9uRW5kcG9pbnQoKS50aGVuKHVybCA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdXJsKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJPaWRjQ2xpZW50LmNyZWF0ZVNpZ25vdXRSZXF1ZXN0OiBObyBlbmQgc2Vzc2lvbiBlbmRwb2ludCB1cmwgcmV0dXJuZWRcIik7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJubyBlbmQgc2Vzc2lvbiBlbmRwb2ludFwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiT2lkY0NsaWVudC5jcmVhdGVTaWdub3V0UmVxdWVzdDogUmVjZWl2ZWQgZW5kIHNlc3Npb24gZW5kcG9pbnRcIiwgdXJsKTtcclxuXHJcbiAgICAgICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFNpZ25vdXRSZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgIHVybCxcclxuICAgICAgICAgICAgICAgIGlkX3Rva2VuX2hpbnQsXHJcbiAgICAgICAgICAgICAgICBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmksXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBkYXRhIHx8IHN0YXRlLFxyXG4gICAgICAgICAgICAgICAgZXh0cmFRdWVyeVBhcmFtcyxcclxuICAgICAgICAgICAgICAgIHJlcXVlc3RfdHlwZVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHZhciBzaWdub3V0U3RhdGUgPSByZXF1ZXN0LnN0YXRlO1xyXG4gICAgICAgICAgICBpZiAoc2lnbm91dFN0YXRlKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJPaWRjQ2xpZW50LmNyZWF0ZVNpZ25vdXRSZXF1ZXN0OiBTaWdub3V0IHJlcXVlc3QgaGFzIHN0YXRlIHRvIHBlcnNpc3RcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgc3RhdGVTdG9yZSA9IHN0YXRlU3RvcmUgfHwgdGhpcy5fc3RhdGVTdG9yZTtcclxuICAgICAgICAgICAgICAgIHN0YXRlU3RvcmUuc2V0KHNpZ25vdXRTdGF0ZS5pZCwgc2lnbm91dFN0YXRlLnRvU3RvcmFnZVN0cmluZygpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVhZFNpZ25vdXRSZXNwb25zZVN0YXRlKHVybCwgc3RhdGVTdG9yZSwgcmVtb3ZlU3RhdGUgPSBmYWxzZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIk9pZGNDbGllbnQucmVhZFNpZ25vdXRSZXNwb25zZVN0YXRlXCIpO1xyXG5cclxuICAgICAgICB2YXIgcmVzcG9uc2UgPSBuZXcgU2lnbm91dFJlc3BvbnNlKHVybCk7XHJcbiAgICAgICAgaWYgKCFyZXNwb25zZS5zdGF0ZSkge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJPaWRjQ2xpZW50LnJlYWRTaWdub3V0UmVzcG9uc2VTdGF0ZTogTm8gc3RhdGUgaW4gcmVzcG9uc2VcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIExvZy53YXJuKFwiT2lkY0NsaWVudC5yZWFkU2lnbm91dFJlc3BvbnNlU3RhdGU6IFJlc3BvbnNlIHdhcyBlcnJvcjogXCIsIHJlc3BvbnNlLmVycm9yKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3JSZXNwb25zZShyZXNwb25zZSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtzdGF0ZTogdW5kZWZpbmVkLCByZXNwb25zZX0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHN0YXRlS2V5ID0gcmVzcG9uc2Uuc3RhdGU7XHJcblxyXG4gICAgICAgIHN0YXRlU3RvcmUgPSBzdGF0ZVN0b3JlIHx8IHRoaXMuX3N0YXRlU3RvcmU7XHJcblxyXG4gICAgICAgIHZhciBzdGF0ZUFwaSA9IHJlbW92ZVN0YXRlID8gc3RhdGVTdG9yZS5yZW1vdmUuYmluZChzdGF0ZVN0b3JlKSA6IHN0YXRlU3RvcmUuZ2V0LmJpbmQoc3RhdGVTdG9yZSk7XHJcbiAgICAgICAgcmV0dXJuIHN0YXRlQXBpKHN0YXRlS2V5KS50aGVuKHN0b3JlZFN0YXRlU3RyaW5nID0+IHtcclxuICAgICAgICAgICAgaWYgKCFzdG9yZWRTdGF0ZVN0cmluZykge1xyXG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiT2lkY0NsaWVudC5yZWFkU2lnbm91dFJlc3BvbnNlU3RhdGU6IE5vIG1hdGNoaW5nIHN0YXRlIGZvdW5kIGluIHN0b3JhZ2VcIik7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBtYXRjaGluZyBzdGF0ZSBmb3VuZCBpbiBzdG9yYWdlXCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgc3RhdGUgPSBTdGF0ZS5mcm9tU3RvcmFnZVN0cmluZyhzdG9yZWRTdGF0ZVN0cmluZyk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge3N0YXRlLCByZXNwb25zZX07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvY2Vzc1NpZ25vdXRSZXNwb25zZSh1cmwsIHN0YXRlU3RvcmUpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJPaWRjQ2xpZW50LnByb2Nlc3NTaWdub3V0UmVzcG9uc2VcIik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRTaWdub3V0UmVzcG9uc2VTdGF0ZSh1cmwsIHN0YXRlU3RvcmUsIHRydWUpLnRoZW4oKHtzdGF0ZSwgcmVzcG9uc2V9KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzdGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiT2lkY0NsaWVudC5wcm9jZXNzU2lnbm91dFJlc3BvbnNlOiBSZWNlaXZlZCBzdGF0ZSBmcm9tIHN0b3JhZ2U7IHZhbGlkYXRpbmcgcmVzcG9uc2VcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdG9yLnZhbGlkYXRlU2lnbm91dFJlc3BvbnNlKHN0YXRlLCByZXNwb25zZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJPaWRjQ2xpZW50LnByb2Nlc3NTaWdub3V0UmVzcG9uc2U6IE5vIHN0YXRlIGZyb20gc3RvcmFnZTsgc2tpcHBpbmcgdmFsaWRhdGluZyByZXNwb25zZVwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyU3RhbGVTdGF0ZShzdGF0ZVN0b3JlKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiT2lkY0NsaWVudC5jbGVhclN0YWxlU3RhdGVcIik7XHJcblxyXG4gICAgICAgIHN0YXRlU3RvcmUgPSBzdGF0ZVN0b3JlIHx8IHRoaXMuX3N0YXRlU3RvcmU7XHJcblxyXG4gICAgICAgIHJldHVybiBTdGF0ZS5jbGVhclN0YWxlU3RhdGUoc3RhdGVTdG9yZSwgdGhpcy5zZXR0aW5ncy5zdGFsZVN0YXRlQWdlKTtcclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcbmltcG9ydCB7IENsb2NrU2VydmljZSB9IGZyb20gJy4vQ2xvY2tTZXJ2aWNlLmpzJztcclxuaW1wb3J0IHsgV2ViU3RvcmFnZVN0YXRlU3RvcmUgfSBmcm9tICcuL1dlYlN0b3JhZ2VTdGF0ZVN0b3JlLmpzJztcclxuaW1wb3J0IHsgUmVzcG9uc2VWYWxpZGF0b3IgfSBmcm9tICcuL1Jlc3BvbnNlVmFsaWRhdG9yLmpzJztcclxuaW1wb3J0IHsgTWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi9NZXRhZGF0YVNlcnZpY2UuanMnO1xyXG5cclxuY29uc3QgT2lkY01ldGFkYXRhVXJsUGF0aCA9ICcud2VsbC1rbm93bi9vcGVuaWQtY29uZmlndXJhdGlvbic7XHJcblxyXG5jb25zdCBEZWZhdWx0UmVzcG9uc2VUeXBlID0gXCJpZF90b2tlblwiO1xyXG5jb25zdCBEZWZhdWx0U2NvcGUgPSBcIm9wZW5pZFwiO1xyXG5jb25zdCBEZWZhdWx0Q2xpZW50QXV0aGVudGljYXRpb24gPSBcImNsaWVudF9zZWNyZXRfcG9zdFwiIC8vIFRoZSBkZWZhdWx0IHZhbHVlIG11c3QgYmUgY2xpZW50X3NlY3JldF9iYXNpYywgYXMgZXhwbGFpbmVkIGluIGh0dHBzOi8vb3BlbmlkLm5ldC9zcGVjcy9vcGVuaWQtY29ubmVjdC1jb3JlLTFfMC5odG1sI0NsaWVudEF1dGhlbnRpY2F0aW9uXHJcbmNvbnN0IERlZmF1bHRTdGFsZVN0YXRlQWdlID0gNjAgKiAxNTsgLy8gc2Vjb25kc1xyXG5jb25zdCBEZWZhdWx0Q2xvY2tTa2V3SW5TZWNvbmRzID0gNjAgKiA1O1xyXG5cclxuZXhwb3J0IGNsYXNzIE9pZGNDbGllbnRTZXR0aW5ncyB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7XHJcbiAgICAgICAgLy8gbWV0YWRhdGEgcmVsYXRlZFxyXG4gICAgICAgIGF1dGhvcml0eSwgbWV0YWRhdGFVcmwsIG1ldGFkYXRhLCBzaWduaW5nS2V5cywgbWV0YWRhdGFTZWVkLFxyXG4gICAgICAgIC8vIGNsaWVudCByZWxhdGVkXHJcbiAgICAgICAgY2xpZW50X2lkLCBjbGllbnRfc2VjcmV0LCByZXNwb25zZV90eXBlID0gRGVmYXVsdFJlc3BvbnNlVHlwZSwgc2NvcGUgPSBEZWZhdWx0U2NvcGUsXHJcbiAgICAgICAgcmVkaXJlY3RfdXJpLCBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmksXHJcbiAgICAgICAgY2xpZW50X2F1dGhlbnRpY2F0aW9uID0gRGVmYXVsdENsaWVudEF1dGhlbnRpY2F0aW9uLFxyXG4gICAgICAgIC8vIG9wdGlvbmFsIHByb3RvY29sXHJcbiAgICAgICAgcHJvbXB0LCBkaXNwbGF5LCBtYXhfYWdlLCB1aV9sb2NhbGVzLCBhY3JfdmFsdWVzLCByZXNvdXJjZSwgcmVzcG9uc2VfbW9kZSxcclxuICAgICAgICAvLyBiZWhhdmlvciBmbGFnc1xyXG4gICAgICAgIGZpbHRlclByb3RvY29sQ2xhaW1zID0gdHJ1ZSwgbG9hZFVzZXJJbmZvID0gdHJ1ZSxcclxuICAgICAgICBzdGFsZVN0YXRlQWdlID0gRGVmYXVsdFN0YWxlU3RhdGVBZ2UsIFxyXG4gICAgICAgIGNsb2NrU2tldyA9IERlZmF1bHRDbG9ja1NrZXdJblNlY29uZHMsXHJcbiAgICAgICAgY2xvY2tTZXJ2aWNlID0gbmV3IENsb2NrU2VydmljZSgpLFxyXG4gICAgICAgIHVzZXJJbmZvSnd0SXNzdWVyID0gJ09QJyxcclxuICAgICAgICBtZXJnZUNsYWltcyA9IGZhbHNlLFxyXG4gICAgICAgIC8vIG90aGVyIGJlaGF2aW9yXHJcbiAgICAgICAgc3RhdGVTdG9yZSA9IG5ldyBXZWJTdG9yYWdlU3RhdGVTdG9yZSgpLFxyXG4gICAgICAgIFJlc3BvbnNlVmFsaWRhdG9yQ3RvciA9IFJlc3BvbnNlVmFsaWRhdG9yLFxyXG4gICAgICAgIE1ldGFkYXRhU2VydmljZUN0b3IgPSBNZXRhZGF0YVNlcnZpY2UsXHJcbiAgICAgICAgLy8gZXh0cmEgcXVlcnkgcGFyYW1zXHJcbiAgICAgICAgZXh0cmFRdWVyeVBhcmFtcyA9IHt9LFxyXG4gICAgICAgIGV4dHJhVG9rZW5QYXJhbXMgPSB7fVxyXG4gICAgfSA9IHt9KSB7XHJcblxyXG4gICAgICAgIHRoaXMuX2F1dGhvcml0eSA9IGF1dGhvcml0eTtcclxuICAgICAgICB0aGlzLl9tZXRhZGF0YVVybCA9IG1ldGFkYXRhVXJsO1xyXG4gICAgICAgIHRoaXMuX21ldGFkYXRhID0gbWV0YWRhdGE7XHJcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFTZWVkID0gbWV0YWRhdGFTZWVkO1xyXG4gICAgICAgIHRoaXMuX3NpZ25pbmdLZXlzID0gc2lnbmluZ0tleXM7XHJcblxyXG4gICAgICAgIHRoaXMuX2NsaWVudF9pZCA9IGNsaWVudF9pZDtcclxuICAgICAgICB0aGlzLl9jbGllbnRfc2VjcmV0ID0gY2xpZW50X3NlY3JldDtcclxuICAgICAgICB0aGlzLl9yZXNwb25zZV90eXBlID0gcmVzcG9uc2VfdHlwZTtcclxuICAgICAgICB0aGlzLl9zY29wZSA9IHNjb3BlO1xyXG4gICAgICAgIHRoaXMuX3JlZGlyZWN0X3VyaSA9IHJlZGlyZWN0X3VyaTtcclxuICAgICAgICB0aGlzLl9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgPSBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmk7XHJcbiAgICAgICAgdGhpcy5fY2xpZW50X2F1dGhlbnRpY2F0aW9uID0gY2xpZW50X2F1dGhlbnRpY2F0aW9uO1xyXG5cclxuICAgICAgICB0aGlzLl9wcm9tcHQgPSBwcm9tcHQ7XHJcbiAgICAgICAgdGhpcy5fZGlzcGxheSA9IGRpc3BsYXk7XHJcbiAgICAgICAgdGhpcy5fbWF4X2FnZSA9IG1heF9hZ2U7XHJcbiAgICAgICAgdGhpcy5fdWlfbG9jYWxlcyA9IHVpX2xvY2FsZXM7XHJcbiAgICAgICAgdGhpcy5fYWNyX3ZhbHVlcyA9IGFjcl92YWx1ZXM7XHJcbiAgICAgICAgdGhpcy5fcmVzb3VyY2UgPSByZXNvdXJjZTtcclxuICAgICAgICB0aGlzLl9yZXNwb25zZV9tb2RlID0gcmVzcG9uc2VfbW9kZTtcclxuXHJcbiAgICAgICAgdGhpcy5fZmlsdGVyUHJvdG9jb2xDbGFpbXMgPSAhIWZpbHRlclByb3RvY29sQ2xhaW1zO1xyXG4gICAgICAgIHRoaXMuX2xvYWRVc2VySW5mbyA9ICEhbG9hZFVzZXJJbmZvO1xyXG4gICAgICAgIHRoaXMuX3N0YWxlU3RhdGVBZ2UgPSBzdGFsZVN0YXRlQWdlO1xyXG4gICAgICAgIHRoaXMuX2Nsb2NrU2tldyA9IGNsb2NrU2tldztcclxuICAgICAgICB0aGlzLl9jbG9ja1NlcnZpY2UgPSBjbG9ja1NlcnZpY2U7XHJcbiAgICAgICAgdGhpcy5fdXNlckluZm9Kd3RJc3N1ZXIgPSB1c2VySW5mb0p3dElzc3VlcjtcclxuICAgICAgICB0aGlzLl9tZXJnZUNsYWltcyA9ICEhbWVyZ2VDbGFpbXM7XHJcblxyXG4gICAgICAgIHRoaXMuX3N0YXRlU3RvcmUgPSBzdGF0ZVN0b3JlO1xyXG4gICAgICAgIHRoaXMuX3ZhbGlkYXRvciA9IG5ldyBSZXNwb25zZVZhbGlkYXRvckN0b3IodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFTZXJ2aWNlID0gbmV3IE1ldGFkYXRhU2VydmljZUN0b3IodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuX2V4dHJhUXVlcnlQYXJhbXMgPSB0eXBlb2YgZXh0cmFRdWVyeVBhcmFtcyA9PT0gJ29iamVjdCcgPyBleHRyYVF1ZXJ5UGFyYW1zIDoge307XHJcbiAgICAgICAgdGhpcy5fZXh0cmFUb2tlblBhcmFtcyA9IHR5cGVvZiBleHRyYVRva2VuUGFyYW1zID09PSAnb2JqZWN0JyA/IGV4dHJhVG9rZW5QYXJhbXMgOiB7fTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjbGllbnQgY29uZmlnXHJcbiAgICBnZXQgY2xpZW50X2lkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jbGllbnRfaWQ7XHJcbiAgICB9XHJcbiAgICBzZXQgY2xpZW50X2lkKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jbGllbnRfaWQpIHtcclxuICAgICAgICAgICAgLy8gb25lLXRpbWUgc2V0IG9ubHlcclxuICAgICAgICAgICAgdGhpcy5fY2xpZW50X2lkID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJPaWRjQ2xpZW50U2V0dGluZ3Muc2V0X2NsaWVudF9pZDogY2xpZW50X2lkIGhhcyBhbHJlYWR5IGJlZW4gYXNzaWduZWQuXCIpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNsaWVudF9pZCBoYXMgYWxyZWFkeSBiZWVuIGFzc2lnbmVkLlwiKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldCBjbGllbnRfc2VjcmV0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jbGllbnRfc2VjcmV0O1xyXG4gICAgfVxyXG4gICAgZ2V0IHJlc3BvbnNlX3R5cGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlX3R5cGU7XHJcbiAgICB9XHJcbiAgICBnZXQgc2NvcGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Njb3BlO1xyXG4gICAgfVxyXG4gICAgZ2V0IHJlZGlyZWN0X3VyaSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVkaXJlY3RfdXJpO1xyXG4gICAgfVxyXG4gICAgZ2V0IHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGNsaWVudF9hdXRoZW50aWNhdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2xpZW50X2F1dGhlbnRpY2F0aW9uO1xyXG4gICAgfVxyXG4gICAgXHJcblxyXG4gICAgLy8gb3B0aW9uYWwgcHJvdG9jb2wgcGFyYW1zXHJcbiAgICBnZXQgcHJvbXB0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9tcHQ7XHJcbiAgICB9XHJcbiAgICBnZXQgZGlzcGxheSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGlzcGxheTtcclxuICAgIH1cclxuICAgIGdldCBtYXhfYWdlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tYXhfYWdlO1xyXG4gICAgfVxyXG4gICAgZ2V0IHVpX2xvY2FsZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VpX2xvY2FsZXM7XHJcbiAgICB9XHJcbiAgICBnZXQgYWNyX3ZhbHVlcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYWNyX3ZhbHVlcztcclxuICAgIH1cclxuICAgIGdldCByZXNvdXJjZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2U7XHJcbiAgICB9XHJcbiAgICBnZXQgcmVzcG9uc2VfbW9kZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVzcG9uc2VfbW9kZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gbWV0YWRhdGFcclxuICAgIGdldCBhdXRob3JpdHkoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dGhvcml0eTtcclxuICAgIH1cclxuICAgIHNldCBhdXRob3JpdHkodmFsdWUpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2F1dGhvcml0eSkge1xyXG4gICAgICAgICAgICAvLyBvbmUtdGltZSBzZXQgb25seVxyXG4gICAgICAgICAgICB0aGlzLl9hdXRob3JpdHkgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk9pZGNDbGllbnRTZXR0aW5ncy5zZXRfYXV0aG9yaXR5OiBhdXRob3JpdHkgaGFzIGFscmVhZHkgYmVlbiBhc3NpZ25lZC5cIilcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXV0aG9yaXR5IGhhcyBhbHJlYWR5IGJlZW4gYXNzaWduZWQuXCIpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IG1ldGFkYXRhVXJsKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fbWV0YWRhdGFVcmwpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGFVcmwgPSB0aGlzLmF1dGhvcml0eTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9tZXRhZGF0YVVybCAmJiB0aGlzLl9tZXRhZGF0YVVybC5pbmRleE9mKE9pZGNNZXRhZGF0YVVybFBhdGgpIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21ldGFkYXRhVXJsW3RoaXMuX21ldGFkYXRhVXJsLmxlbmd0aCAtIDFdICE9PSAnLycpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVVybCArPSAnLyc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVVybCArPSBPaWRjTWV0YWRhdGFVcmxQYXRoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFVcmw7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2V0dGFibGUvY2FjaGFibGUgbWV0YWRhdGEgdmFsdWVzXHJcbiAgICBnZXQgbWV0YWRhdGEoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhO1xyXG4gICAgfVxyXG4gICAgc2V0IG1ldGFkYXRhKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5fbWV0YWRhdGEgPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIGdldCBtZXRhZGF0YVNlZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VlZDtcclxuICAgIH1cclxuICAgIHNldCBtZXRhZGF0YVNlZWQodmFsdWUpIHtcclxuICAgICAgICB0aGlzLl9tZXRhZGF0YVNlZWQgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2lnbmluZ0tleXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pbmdLZXlzO1xyXG4gICAgfVxyXG4gICAgc2V0IHNpZ25pbmdLZXlzKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5fc2lnbmluZ0tleXMgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBiZWhhdmlvciBmbGFnc1xyXG4gICAgZ2V0IGZpbHRlclByb3RvY29sQ2xhaW1zKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJQcm90b2NvbENsYWltcztcclxuICAgIH1cclxuICAgIGdldCBsb2FkVXNlckluZm8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRVc2VySW5mbztcclxuICAgIH1cclxuICAgIGdldCBzdGFsZVN0YXRlQWdlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdGFsZVN0YXRlQWdlO1xyXG4gICAgfVxyXG4gICAgZ2V0IGNsb2NrU2tldygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2xvY2tTa2V3O1xyXG4gICAgfVxyXG4gICAgZ2V0IHVzZXJJbmZvSnd0SXNzdWVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91c2VySW5mb0p3dElzc3VlcjtcclxuICAgIH1cclxuICAgIGdldCBtZXJnZUNsYWltcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbWVyZ2VDbGFpbXM7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGdldCBzdGF0ZVN0b3JlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZVN0b3JlO1xyXG4gICAgfVxyXG4gICAgZ2V0IHZhbGlkYXRvcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdG9yO1xyXG4gICAgfVxyXG4gICAgZ2V0IG1ldGFkYXRhU2VydmljZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGV4dHJhIHF1ZXJ5IHBhcmFtc1xyXG4gICAgZ2V0IGV4dHJhUXVlcnlQYXJhbXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4dHJhUXVlcnlQYXJhbXM7XHJcbiAgICB9XHJcbiAgICBzZXQgZXh0cmFRdWVyeVBhcmFtcyh2YWx1ZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKXtcclxuICAgICAgICAgICAgdGhpcy5fZXh0cmFRdWVyeVBhcmFtcyA9IHZhbHVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2V4dHJhUXVlcnlQYXJhbXMgPSB7fTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXh0cmEgdG9rZW4gcGFyYW1zXHJcbiAgICBnZXQgZXh0cmFUb2tlblBhcmFtcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZXh0cmFUb2tlblBhcmFtcztcclxuICAgIH1cclxuICAgIHNldCBleHRyYVRva2VuUGFyYW1zKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpe1xyXG4gICAgICAgICAgICB0aGlzLl9leHRyYVRva2VuUGFyYW1zID0gdmFsdWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZXh0cmFUb2tlblBhcmFtcyA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBnZXQgdGhlIHRpbWVcclxuICAgIGdldEVwb2NoVGltZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2xvY2tTZXJ2aWNlLmdldEVwb2NoVGltZSgpO1xyXG4gICAgfVxyXG59XHJcbiIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCB7IExvZyB9IGZyb20gJy4vTG9nLmpzJztcclxuaW1wb3J0IHsgUG9wdXBXaW5kb3cgfSBmcm9tICcuL1BvcHVwV2luZG93LmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBQb3B1cE5hdmlnYXRvciB7XHJcblxyXG4gICAgcHJlcGFyZShwYXJhbXMpIHtcclxuICAgICAgICBsZXQgcG9wdXAgPSBuZXcgUG9wdXBXaW5kb3cocGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBvcHVwKTtcclxuICAgIH1cclxuXHJcbiAgICBjYWxsYmFjayh1cmwsIGtlZXBPcGVuLCBkZWxpbWl0ZXIpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJQb3B1cE5hdmlnYXRvci5jYWxsYmFja1wiKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgUG9wdXBXaW5kb3cubm90aWZ5T3BlbmVyKHVybCwga2VlcE9wZW4sIGRlbGltaXRlcik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcbmltcG9ydCB7IFVybFV0aWxpdHkgfSBmcm9tICcuL1VybFV0aWxpdHkuanMnO1xyXG5cclxuY29uc3QgQ2hlY2tGb3JQb3B1cENsb3NlZEludGVydmFsID0gNTAwO1xyXG5jb25zdCBEZWZhdWx0UG9wdXBGZWF0dXJlcyA9ICdsb2NhdGlvbj1ubyx0b29sYmFyPW5vLHdpZHRoPTUwMCxoZWlnaHQ9NTAwLGxlZnQ9MTAwLHRvcD0xMDA7JztcclxuLy9jb25zdCBEZWZhdWx0UG9wdXBGZWF0dXJlcyA9ICdsb2NhdGlvbj1ubyx0b29sYmFyPW5vLHdpZHRoPTUwMCxoZWlnaHQ9NTAwLGxlZnQ9MTAwLHRvcD0xMDA7cmVzaXphYmxlPXllcyc7XHJcblxyXG5jb25zdCBEZWZhdWx0UG9wdXBUYXJnZXQgPSBcIl9ibGFua1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFBvcHVwV2luZG93IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcclxuICAgICAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9yZXNvbHZlID0gcmVzb2x2ZTtcclxuICAgICAgICAgICAgdGhpcy5fcmVqZWN0ID0gcmVqZWN0O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgdGFyZ2V0ID0gcGFyYW1zLnBvcHVwV2luZG93VGFyZ2V0IHx8IERlZmF1bHRQb3B1cFRhcmdldDtcclxuICAgICAgICBsZXQgZmVhdHVyZXMgPSBwYXJhbXMucG9wdXBXaW5kb3dGZWF0dXJlcyB8fCBEZWZhdWx0UG9wdXBGZWF0dXJlcztcclxuXHJcbiAgICAgICAgdGhpcy5fcG9wdXAgPSB3aW5kb3cub3BlbignJywgdGFyZ2V0LCBmZWF0dXJlcyk7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwKSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlBvcHVwV2luZG93LmN0b3I6IHBvcHVwIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXCIpO1xyXG4gICAgICAgICAgICB0aGlzLl9jaGVja0ZvclBvcHVwQ2xvc2VkVGltZXIgPSB3aW5kb3cuc2V0SW50ZXJ2YWwodGhpcy5fY2hlY2tGb3JQb3B1cENsb3NlZC5iaW5kKHRoaXMpLCBDaGVja0ZvclBvcHVwQ2xvc2VkSW50ZXJ2YWwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgcHJvbWlzZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBuYXZpZ2F0ZShwYXJhbXMpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX3BvcHVwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiUG9wdXBXaW5kb3cubmF2aWdhdGU6IEVycm9yIG9wZW5pbmcgcG9wdXAgd2luZG93XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghcGFyYW1zIHx8ICFwYXJhbXMudXJsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiUG9wdXBXaW5kb3cubmF2aWdhdGU6IG5vIHVybCBwcm92aWRlZFwiKTtcclxuICAgICAgICAgICAgdGhpcy5fZXJyb3IoXCJObyB1cmwgcHJvdmlkZWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJQb3B1cFdpbmRvdy5uYXZpZ2F0ZTogU2V0dGluZyBVUkwgaW4gcG9wdXBcIik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9pZCA9IHBhcmFtcy5pZDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2lkKSB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3dbXCJwb3B1cENhbGxiYWNrX1wiICsgcGFyYW1zLmlkXSA9IHRoaXMuX2NhbGxiYWNrLmJpbmQodGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLndpbmRvdy5sb2NhdGlvbiA9IHBhcmFtcy51cmw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIF9zdWNjZXNzKGRhdGEpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJQb3B1cFdpbmRvdy5jYWxsYmFjazogU3VjY2Vzc2Z1bCByZXNwb25zZSBmcm9tIHBvcHVwIHdpbmRvd1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fY2xlYW51cCgpO1xyXG4gICAgICAgIHRoaXMuX3Jlc29sdmUoZGF0YSk7XHJcbiAgICB9XHJcbiAgICBfZXJyb3IobWVzc2FnZSkge1xyXG4gICAgICAgIExvZy5lcnJvcihcIlBvcHVwV2luZG93LmVycm9yOiBcIiwgbWVzc2FnZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5fY2xlYW51cCgpO1xyXG4gICAgICAgIHRoaXMuX3JlamVjdChuZXcgRXJyb3IobWVzc2FnZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlKCkge1xyXG4gICAgICAgIHRoaXMuX2NsZWFudXAoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIF9jbGVhbnVwKGtlZXBPcGVuKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiUG9wdXBXaW5kb3cuY2xlYW51cFwiKTtcclxuXHJcbiAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fY2hlY2tGb3JQb3B1cENsb3NlZFRpbWVyKTtcclxuICAgICAgICB0aGlzLl9jaGVja0ZvclBvcHVwQ2xvc2VkVGltZXIgPSBudWxsO1xyXG5cclxuICAgICAgICBkZWxldGUgd2luZG93W1wicG9wdXBDYWxsYmFja19cIiArIHRoaXMuX2lkXTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwICYmICFrZWVwT3Blbikge1xyXG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9wb3B1cCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgX2NoZWNrRm9yUG9wdXBDbG9zZWQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9wb3B1cCB8fCB0aGlzLl9wb3B1cC5jbG9zZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fZXJyb3IoXCJQb3B1cCB3aW5kb3cgY2xvc2VkXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfY2FsbGJhY2sodXJsLCBrZWVwT3Blbikge1xyXG4gICAgICAgIHRoaXMuX2NsZWFudXAoa2VlcE9wZW4pO1xyXG5cclxuICAgICAgICBpZiAodXJsKSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlBvcHVwV2luZG93LmNhbGxiYWNrIHN1Y2Nlc3NcIik7XHJcbiAgICAgICAgICAgIHRoaXMuX3N1Y2Nlc3MoeyB1cmw6IHVybCB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlBvcHVwV2luZG93LmNhbGxiYWNrOiBJbnZhbGlkIHJlc3BvbnNlIGZyb20gcG9wdXBcIik7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiSW52YWxpZCByZXNwb25zZSBmcm9tIHBvcHVwXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbm90aWZ5T3BlbmVyKHVybCwga2VlcE9wZW4sIGRlbGltaXRlcikge1xyXG4gICAgICAgIGlmICh3aW5kb3cub3BlbmVyKSB7XHJcbiAgICAgICAgICAgIHVybCA9IHVybCB8fCB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgICAgICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBVcmxVdGlsaXR5LnBhcnNlVXJsRnJhZ21lbnQodXJsLCBkZWxpbWl0ZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLnN0YXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBcInBvcHVwQ2FsbGJhY2tfXCIgKyBkYXRhLnN0YXRlO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IHdpbmRvdy5vcGVuZXJbbmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlBvcHVwV2luZG93Lm5vdGlmeU9wZW5lcjogcGFzc2luZyB1cmwgbWVzc2FnZSB0byBvcGVuZXJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHVybCwga2VlcE9wZW4pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLndhcm4oXCJQb3B1cFdpbmRvdy5ub3RpZnlPcGVuZXI6IG5vIG1hdGNoaW5nIGNhbGxiYWNrIGZvdW5kIG9uIG9wZW5lclwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cud2FybihcIlBvcHVwV2luZG93Lm5vdGlmeU9wZW5lcjogbm8gc3RhdGUgZm91bmQgaW4gcmVzcG9uc2UgdXJsXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBMb2cud2FybihcIlBvcHVwV2luZG93Lm5vdGlmeU9wZW5lcjogbm8gd2luZG93Lm9wZW5lci4gQ2FuJ3QgY29tcGxldGUgbm90aWZpY2F0aW9uLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFJlZGlyZWN0TmF2aWdhdG9yIHtcclxuXHJcbiAgICBwcmVwYXJlKCkge1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgbmF2aWdhdGUocGFyYW1zKSB7XHJcbiAgICAgICAgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy51cmwpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiUmVkaXJlY3ROYXZpZ2F0b3IubmF2aWdhdGU6IE5vIHVybCBwcm92aWRlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIHVybCBwcm92aWRlZFwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocGFyYW1zLnVzZVJlcGxhY2VUb05hdmlnYXRlKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHBhcmFtcy51cmwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gcGFyYW1zLnVybDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgdXJsKCkge1xyXG4gICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcbmltcG9ydCB7IE1ldGFkYXRhU2VydmljZSB9IGZyb20gJy4vTWV0YWRhdGFTZXJ2aWNlLmpzJztcclxuaW1wb3J0IHsgVXNlckluZm9TZXJ2aWNlIH0gZnJvbSAnLi9Vc2VySW5mb1NlcnZpY2UuanMnO1xyXG5pbXBvcnQgeyBUb2tlbkNsaWVudCB9IGZyb20gJy4vVG9rZW5DbGllbnQuanMnO1xyXG5pbXBvcnQgeyBFcnJvclJlc3BvbnNlIH0gZnJvbSAnLi9FcnJvclJlc3BvbnNlLmpzJztcclxuaW1wb3J0IHsgSm9zZVV0aWwgfSBmcm9tICcuL0pvc2VVdGlsLmpzJztcclxuXHJcbmNvbnN0IFByb3RvY29sQ2xhaW1zID0gW1wibm9uY2VcIiwgXCJhdF9oYXNoXCIsIFwiaWF0XCIsIFwibmJmXCIsIFwiZXhwXCIsIFwiYXVkXCIsIFwiaXNzXCIsIFwiY19oYXNoXCJdO1xyXG5cclxuZXhwb3J0IGNsYXNzIFJlc3BvbnNlVmFsaWRhdG9yIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncywgXHJcbiAgICAgICAgTWV0YWRhdGFTZXJ2aWNlQ3RvciA9IE1ldGFkYXRhU2VydmljZSxcclxuICAgICAgICBVc2VySW5mb1NlcnZpY2VDdG9yID0gVXNlckluZm9TZXJ2aWNlLCBcclxuICAgICAgICBqb3NlVXRpbCA9IEpvc2VVdGlsLFxyXG4gICAgICAgIFRva2VuQ2xpZW50Q3RvciA9IFRva2VuQ2xpZW50KSB7XHJcbiAgICAgICAgaWYgKCFzZXR0aW5ncykge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJSZXNwb25zZVZhbGlkYXRvci5jdG9yOiBObyBzZXR0aW5ncyBwYXNzZWQgdG8gUmVzcG9uc2VWYWxpZGF0b3JcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNldHRpbmdzXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBzZXR0aW5ncztcclxuICAgICAgICB0aGlzLl9tZXRhZGF0YVNlcnZpY2UgPSBuZXcgTWV0YWRhdGFTZXJ2aWNlQ3Rvcih0aGlzLl9zZXR0aW5ncyk7XHJcbiAgICAgICAgdGhpcy5fdXNlckluZm9TZXJ2aWNlID0gbmV3IFVzZXJJbmZvU2VydmljZUN0b3IodGhpcy5fc2V0dGluZ3MpO1xyXG4gICAgICAgIHRoaXMuX2pvc2VVdGlsID0gam9zZVV0aWw7XHJcbiAgICAgICAgdGhpcy5fdG9rZW5DbGllbnQgPSBuZXcgVG9rZW5DbGllbnRDdG9yKHRoaXMuX3NldHRpbmdzKTtcclxuICAgIH1cclxuXHJcbiAgICB2YWxpZGF0ZVNpZ25pblJlc3BvbnNlKHN0YXRlLCByZXNwb25zZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLnZhbGlkYXRlU2lnbmluUmVzcG9uc2VcIik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzU2lnbmluUGFyYW1zKHN0YXRlLCByZXNwb25zZSkudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLnZhbGlkYXRlU2lnbmluUmVzcG9uc2U6IHN0YXRlIHByb2Nlc3NlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlVG9rZW5zKHN0YXRlLCByZXNwb25zZSkudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci52YWxpZGF0ZVNpZ25pblJlc3BvbnNlOiB0b2tlbnMgdmFsaWRhdGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NDbGFpbXMoc3RhdGUsIHJlc3BvbnNlKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci52YWxpZGF0ZVNpZ25pblJlc3BvbnNlOiBjbGFpbXMgcHJvY2Vzc2VkXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB2YWxpZGF0ZVNpZ25vdXRSZXNwb25zZShzdGF0ZSwgcmVzcG9uc2UpIHtcclxuICAgICAgICBpZiAoc3RhdGUuaWQgIT09IHJlc3BvbnNlLnN0YXRlKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlJlc3BvbnNlVmFsaWRhdG9yLnZhbGlkYXRlU2lnbm91dFJlc3BvbnNlOiBTdGF0ZSBkb2VzIG5vdCBtYXRjaFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlN0YXRlIGRvZXMgbm90IG1hdGNoXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIG5vdyB0aGF0IHdlIGtub3cgdGhlIHN0YXRlIG1hdGNoZXMsIHRha2UgdGhlIHN0b3JlZCBkYXRhXHJcbiAgICAgICAgLy8gYW5kIHNldCBpdCBpbnRvIHRoZSByZXNwb25zZSBzbyBjYWxsZXJzIGNhbiBnZXQgdGhlaXIgc3RhdGVcclxuICAgICAgICAvLyB0aGlzIGlzIGltcG9ydGFudCBmb3IgYm90aCBzdWNjZXNzICYgZXJyb3Igb3V0Y29tZXNcclxuICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci52YWxpZGF0ZVNpZ25vdXRSZXNwb25zZTogc3RhdGUgdmFsaWRhdGVkXCIpO1xyXG4gICAgICAgIHJlc3BvbnNlLnN0YXRlID0gc3RhdGUuZGF0YTtcclxuXHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XHJcbiAgICAgICAgICAgIExvZy53YXJuKFwiUmVzcG9uc2VWYWxpZGF0b3IudmFsaWRhdGVTaWdub3V0UmVzcG9uc2U6IFJlc3BvbnNlIHdhcyBlcnJvclwiLCByZXNwb25zZS5lcnJvcik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3JSZXNwb25zZShyZXNwb25zZSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XHJcbiAgICB9XHJcblxyXG4gICAgX3Byb2Nlc3NTaWduaW5QYXJhbXMoc3RhdGUsIHJlc3BvbnNlKSB7XHJcbiAgICAgICAgaWYgKHN0YXRlLmlkICE9PSByZXNwb25zZS5zdGF0ZSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJSZXNwb25zZVZhbGlkYXRvci5fcHJvY2Vzc1NpZ25pblBhcmFtczogU3RhdGUgZG9lcyBub3QgbWF0Y2hcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJTdGF0ZSBkb2VzIG5vdCBtYXRjaFwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXN0YXRlLmNsaWVudF9pZCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJSZXNwb25zZVZhbGlkYXRvci5fcHJvY2Vzc1NpZ25pblBhcmFtczogTm8gY2xpZW50X2lkIG9uIHN0YXRlXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gY2xpZW50X2lkIG9uIHN0YXRlXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc3RhdGUuYXV0aG9yaXR5KSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlJlc3BvbnNlVmFsaWRhdG9yLl9wcm9jZXNzU2lnbmluUGFyYW1zOiBObyBhdXRob3JpdHkgb24gc3RhdGVcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBhdXRob3JpdHkgb24gc3RhdGVcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gdGhpcyBhbGxvd3MgdGhlIGF1dGhvcml0eSB0byBiZSBsb2FkZWQgZnJvbSB0aGUgc2lnbmluIHN0YXRlXHJcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5ncy5hdXRob3JpdHkpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3MuYXV0aG9yaXR5ID0gc3RhdGUuYXV0aG9yaXR5O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBlbnN1cmUgd2UncmUgdXNpbmcgdGhlIGNvcnJlY3QgYXV0aG9yaXR5IGlmIHRoZSBhdXRob3JpdHkgaXMgbm90IGxvYWRlZCBmcm9tIHNpZ25pbiBzdGF0ZVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX3NldHRpbmdzLmF1dGhvcml0eSAmJiB0aGlzLl9zZXR0aW5ncy5hdXRob3JpdHkgIT09IHN0YXRlLmF1dGhvcml0eSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJSZXNwb25zZVZhbGlkYXRvci5fcHJvY2Vzc1NpZ25pblBhcmFtczogYXV0aG9yaXR5IG1pc21hdGNoIG9uIHNldHRpbmdzIHZzLiBzaWduaW4gc3RhdGVcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJhdXRob3JpdHkgbWlzbWF0Y2ggb24gc2V0dGluZ3MgdnMuIHNpZ25pbiBzdGF0ZVwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMgYWxsb3dzIHRoZSBjbGllbnRfaWQgdG8gYmUgbG9hZGVkIGZyb20gdGhlIHNpZ25pbiBzdGF0ZVxyXG4gICAgICAgIGlmICghdGhpcy5fc2V0dGluZ3MuY2xpZW50X2lkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzLmNsaWVudF9pZCA9IHN0YXRlLmNsaWVudF9pZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZW5zdXJlIHdlJ3JlIHVzaW5nIHRoZSBjb3JyZWN0IGNsaWVudF9pZCBpZiB0aGUgY2xpZW50X2lkIGlzIG5vdCBsb2FkZWQgZnJvbSBzaWduaW4gc3RhdGVcclxuICAgICAgICBlbHNlIGlmICh0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQgJiYgdGhpcy5fc2V0dGluZ3MuY2xpZW50X2lkICE9PSBzdGF0ZS5jbGllbnRfaWQpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3Byb2Nlc3NTaWduaW5QYXJhbXM6IGNsaWVudF9pZCBtaXNtYXRjaCBvbiBzZXR0aW5ncyB2cy4gc2lnbmluIHN0YXRlXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiY2xpZW50X2lkIG1pc21hdGNoIG9uIHNldHRpbmdzIHZzLiBzaWduaW4gc3RhdGVcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbm93IHRoYXQgd2Uga25vdyB0aGUgc3RhdGUgbWF0Y2hlcywgdGFrZSB0aGUgc3RvcmVkIGRhdGFcclxuICAgICAgICAvLyBhbmQgc2V0IGl0IGludG8gdGhlIHJlc3BvbnNlIHNvIGNhbGxlcnMgY2FuIGdldCB0aGVpciBzdGF0ZVxyXG4gICAgICAgIC8vIHRoaXMgaXMgaW1wb3J0YW50IGZvciBib3RoIHN1Y2Nlc3MgJiBlcnJvciBvdXRjb21lc1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl9wcm9jZXNzU2lnbmluUGFyYW1zOiBzdGF0ZSB2YWxpZGF0ZWRcIik7XHJcbiAgICAgICAgcmVzcG9uc2Uuc3RhdGUgPSBzdGF0ZS5kYXRhO1xyXG5cclxuICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IpIHtcclxuICAgICAgICAgICAgTG9nLndhcm4oXCJSZXNwb25zZVZhbGlkYXRvci5fcHJvY2Vzc1NpZ25pblBhcmFtczogUmVzcG9uc2Ugd2FzIGVycm9yXCIsIHJlc3BvbnNlLmVycm9yKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3RhdGUubm9uY2UgJiYgIXJlc3BvbnNlLmlkX3Rva2VuKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlJlc3BvbnNlVmFsaWRhdG9yLl9wcm9jZXNzU2lnbmluUGFyYW1zOiBFeHBlY3RpbmcgaWRfdG9rZW4gaW4gcmVzcG9uc2VcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBpZF90b2tlbiBpbiByZXNwb25zZVwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXN0YXRlLm5vbmNlICYmIHJlc3BvbnNlLmlkX3Rva2VuKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlJlc3BvbnNlVmFsaWRhdG9yLl9wcm9jZXNzU2lnbmluUGFyYW1zOiBOb3QgZXhwZWN0aW5nIGlkX3Rva2VuIGluIHJlc3BvbnNlXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVW5leHBlY3RlZCBpZF90b2tlbiBpbiByZXNwb25zZVwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3RhdGUuY29kZV92ZXJpZmllciAmJiAhcmVzcG9uc2UuY29kZSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJSZXNwb25zZVZhbGlkYXRvci5fcHJvY2Vzc1NpZ25pblBhcmFtczogRXhwZWN0aW5nIGNvZGUgaW4gcmVzcG9uc2VcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBjb2RlIGluIHJlc3BvbnNlXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc3RhdGUuY29kZV92ZXJpZmllciAmJiByZXNwb25zZS5jb2RlKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlJlc3BvbnNlVmFsaWRhdG9yLl9wcm9jZXNzU2lnbmluUGFyYW1zOiBOb3QgZXhwZWN0aW5nIGNvZGUgaW4gcmVzcG9uc2VcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGNvZGUgaW4gcmVzcG9uc2VcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFyZXNwb25zZS5zY29wZSkge1xyXG4gICAgICAgICAgICAvLyBpZiB0aGVyZSdzIG5vIHNjb3BlIG9uIHRoZSByZXNwb25zZSwgdGhlbiBhc3N1bWUgYWxsIHNjb3BlcyBncmFudGVkIChwZXItc3BlYykgYW5kIGNvcHkgb3ZlciBzY29wZXMgZnJvbSBvcmlnaW5hbCByZXF1ZXN0XHJcbiAgICAgICAgICAgIHJlc3BvbnNlLnNjb3BlID0gc3RhdGUuc2NvcGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcclxuICAgIH1cclxuXHJcbiAgICBfcHJvY2Vzc0NsYWltcyhzdGF0ZSwgcmVzcG9uc2UpIHtcclxuICAgICAgICBpZiAocmVzcG9uc2UuaXNPcGVuSWRDb25uZWN0KSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl9wcm9jZXNzQ2xhaW1zOiByZXNwb25zZSBpcyBPSURDLCBwcm9jZXNzaW5nIGNsYWltc1wiKTtcclxuXHJcbiAgICAgICAgICAgIHJlc3BvbnNlLnByb2ZpbGUgPSB0aGlzLl9maWx0ZXJQcm90b2NvbENsYWltcyhyZXNwb25zZS5wcm9maWxlKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzdGF0ZS5za2lwVXNlckluZm8gIT09IHRydWUgJiYgdGhpcy5fc2V0dGluZ3MubG9hZFVzZXJJbmZvICYmIHJlc3BvbnNlLmFjY2Vzc190b2tlbikge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3Byb2Nlc3NDbGFpbXM6IGxvYWRpbmcgdXNlciBpbmZvXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl91c2VySW5mb1NlcnZpY2UuZ2V0Q2xhaW1zKHJlc3BvbnNlLmFjY2Vzc190b2tlbikudGhlbihjbGFpbXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl9wcm9jZXNzQ2xhaW1zOiB1c2VyIGluZm8gY2xhaW1zIHJlY2VpdmVkIGZyb20gdXNlciBpbmZvIGVuZHBvaW50XCIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2xhaW1zLnN1YiAhPT0gcmVzcG9uc2UucHJvZmlsZS5zdWIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3Byb2Nlc3NDbGFpbXM6IHN1YiBmcm9tIHVzZXIgaW5mbyBlbmRwb2ludCBkb2VzIG5vdCBtYXRjaCBzdWIgaW4gaWRfdG9rZW5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJzdWIgZnJvbSB1c2VyIGluZm8gZW5kcG9pbnQgZG9lcyBub3QgbWF0Y2ggc3ViIGluIGlkX3Rva2VuXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnByb2ZpbGUgPSB0aGlzLl9tZXJnZUNsYWltcyhyZXNwb25zZS5wcm9maWxlLCBjbGFpbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl9wcm9jZXNzQ2xhaW1zOiB1c2VyIGluZm8gY2xhaW1zIHJlY2VpdmVkLCB1cGRhdGVkIHByb2ZpbGU6XCIsIHJlc3BvbnNlLnByb2ZpbGUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl9wcm9jZXNzQ2xhaW1zOiBub3QgbG9hZGluZyB1c2VyIGluZm9cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl9wcm9jZXNzQ2xhaW1zOiByZXNwb25zZSBpcyBub3QgT0lEQywgbm90IHByb2Nlc3NpbmcgY2xhaW1zXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XHJcbiAgICB9XHJcblxyXG4gICAgX21lcmdlQ2xhaW1zKGNsYWltczEsIGNsYWltczIpIHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgY2xhaW1zMSk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gY2xhaW1zMikge1xyXG4gICAgICAgICAgICB2YXIgdmFsdWVzID0gY2xhaW1zMltuYW1lXTtcclxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcclxuICAgICAgICAgICAgICAgIHZhbHVlcyA9IFt2YWx1ZXNdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdmFsdWVzW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRbbmFtZV0pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHRbbmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0W25hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRbbmFtZV0uaW5kZXhPZih2YWx1ZSkgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtuYW1lXS5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHRbbmFtZV0gIT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdGhpcy5fc2V0dGluZ3MubWVyZ2VDbGFpbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gdGhpcy5fbWVyZ2VDbGFpbXMocmVzdWx0W25hbWVdLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbbmFtZV0gPSBbcmVzdWx0W25hbWVdLCB2YWx1ZV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIF9maWx0ZXJQcm90b2NvbENsYWltcyhjbGFpbXMpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fZmlsdGVyUHJvdG9jb2xDbGFpbXMsIGluY29taW5nIGNsYWltczpcIiwgY2xhaW1zKTtcclxuXHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIGNsYWltcyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5fZmlsdGVyUHJvdG9jb2xDbGFpbXMpIHtcclxuICAgICAgICAgICAgUHJvdG9jb2xDbGFpbXMuZm9yRWFjaCh0eXBlID0+IHtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHRbdHlwZV07XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IuX2ZpbHRlclByb3RvY29sQ2xhaW1zOiBwcm90b2NvbCBjbGFpbXMgZmlsdGVyZWRcIiwgcmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl9maWx0ZXJQcm90b2NvbENsYWltczogcHJvdG9jb2wgY2xhaW1zIG5vdCBmaWx0ZXJlZFwiKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBfdmFsaWRhdGVUb2tlbnMoc3RhdGUsIHJlc3BvbnNlKSB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLmNvZGUpIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlVG9rZW5zOiBWYWxpZGF0aW5nIGNvZGVcIik7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzQ29kZShzdGF0ZSwgcmVzcG9uc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLmlkX3Rva2VuKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5hY2Nlc3NfdG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZVRva2VuczogVmFsaWRhdGluZyBpZF90b2tlbiBhbmQgYWNjZXNzX3Rva2VuXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlSWRUb2tlbkFuZEFjY2Vzc1Rva2VuKHN0YXRlLCByZXNwb25zZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZVRva2VuczogVmFsaWRhdGluZyBpZF90b2tlblwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlSWRUb2tlbihzdGF0ZSwgcmVzcG9uc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlVG9rZW5zOiBObyBjb2RlIHRvIHByb2Nlc3Mgb3IgaWRfdG9rZW4gdG8gdmFsaWRhdGVcIik7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XHJcbiAgICB9XHJcblxyXG4gICAgX3Byb2Nlc3NDb2RlKHN0YXRlLCByZXNwb25zZSkge1xyXG4gICAgICAgIHZhciByZXF1ZXN0ID0ge1xyXG4gICAgICAgICAgICBjbGllbnRfaWQ6IHN0YXRlLmNsaWVudF9pZCxcclxuICAgICAgICAgICAgY2xpZW50X3NlY3JldDogc3RhdGUuY2xpZW50X3NlY3JldCxcclxuICAgICAgICAgICAgY29kZSA6IHJlc3BvbnNlLmNvZGUsXHJcbiAgICAgICAgICAgIHJlZGlyZWN0X3VyaTogc3RhdGUucmVkaXJlY3RfdXJpLFxyXG4gICAgICAgICAgICBjb2RlX3ZlcmlmaWVyOiBzdGF0ZS5jb2RlX3ZlcmlmaWVyXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHN0YXRlLmV4dHJhVG9rZW5QYXJhbXMgJiYgdHlwZW9mKHN0YXRlLmV4dHJhVG9rZW5QYXJhbXMpID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHJlcXVlc3QsIHN0YXRlLmV4dHJhVG9rZW5QYXJhbXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW5DbGllbnQuZXhjaGFuZ2VDb2RlKHJlcXVlc3QpLnRoZW4odG9rZW5SZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBmb3IodmFyIGtleSBpbiB0b2tlblJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZVtrZXldID0gdG9rZW5SZXNwb25zZVtrZXldO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuaWRfdG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl9wcm9jZXNzQ29kZTogdG9rZW4gcmVzcG9uc2Ugc3VjY2Vzc2Z1bCwgcHJvY2Vzc2luZyBpZF90b2tlblwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZUlkVG9rZW5BdHRyaWJ1dGVzKHN0YXRlLCByZXNwb25zZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fcHJvY2Vzc0NvZGU6IHRva2VuIHJlc3BvbnNlIHN1Y2Nlc3NmdWwsIHJldHVybmluZyByZXNwb25zZVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF92YWxpZGF0ZUlkVG9rZW5BdHRyaWJ1dGVzKHN0YXRlLCByZXNwb25zZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0SXNzdWVyKCkudGhlbihpc3N1ZXIgPT4ge1xyXG5cclxuICAgICAgICAgICAgbGV0IGF1ZGllbmNlID0gc3RhdGUuY2xpZW50X2lkO1xyXG4gICAgICAgICAgICBsZXQgY2xvY2tTa2V3SW5TZWNvbmRzID0gdGhpcy5fc2V0dGluZ3MuY2xvY2tTa2V3O1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVJZFRva2VuQXR0cmlidXRlczogVmFsaWRhaW5nIEpXVCBhdHRyaWJ1dGVzOyB1c2luZyBjbG9jayBza2V3IChpbiBzZWNvbmRzKSBvZjogXCIsIGNsb2NrU2tld0luU2Vjb25kcyk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3MuZ2V0RXBvY2hUaW1lKCkudGhlbihub3cgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2pvc2VVdGlsLnZhbGlkYXRlSnd0QXR0cmlidXRlcyhyZXNwb25zZS5pZF90b2tlbiwgaXNzdWVyLCBhdWRpZW5jZSwgY2xvY2tTa2V3SW5TZWNvbmRzLCBub3cpLnRoZW4ocGF5bG9hZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUubm9uY2UgJiYgc3RhdGUubm9uY2UgIT09IHBheWxvYWQubm9uY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlSWRUb2tlbkF0dHJpYnV0ZXM6IEludmFsaWQgbm9uY2UgaW4gaWRfdG9rZW5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJJbnZhbGlkIG5vbmNlIGluIGlkX3Rva2VuXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXBheWxvYWQuc3ViKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUlkVG9rZW5BdHRyaWJ1dGVzOiBObyBzdWIgcHJlc2VudCBpbiBpZF90b2tlblwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIHN1YiBwcmVzZW50IGluIGlkX3Rva2VuXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5wcm9maWxlID0gcGF5bG9hZDtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX3ZhbGlkYXRlSWRUb2tlbkFuZEFjY2Vzc1Rva2VuKHN0YXRlLCByZXNwb25zZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZUlkVG9rZW4oc3RhdGUsIHJlc3BvbnNlKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlQWNjZXNzVG9rZW4ocmVzcG9uc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9nZXRTaWduaW5nS2V5Rm9ySnd0KGp3dCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0U2lnbmluZ0tleXMoKS50aGVuKGtleXMgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBraWQgPSBqd3QuaGVhZGVyLmtpZDtcclxuICAgICAgICAgICAgaWYgKCFrZXlzKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVJZFRva2VuOiBObyBzaWduaW5nIGtleXMgZnJvbSBtZXRhZGF0YVwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBzaWduaW5nIGtleXMgZnJvbSBtZXRhZGF0YVwiKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUlkVG9rZW46IFJlY2VpdmVkIHNpZ25pbmcga2V5c1wiKTtcclxuICAgICAgICAgICAgbGV0IGtleTtcclxuICAgICAgICAgICAgaWYgKCFraWQpIHtcclxuICAgICAgICAgICAgICAgIGtleXMgPSB0aGlzLl9maWx0ZXJCeUFsZyhrZXlzLCBqd3QuaGVhZGVyLmFsZyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGtleXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUlkVG9rZW46IE5vIGtpZCBmb3VuZCBpbiBpZF90b2tlbiBhbmQgbW9yZSB0aGFuIG9uZSBrZXkgZm91bmQgaW4gbWV0YWRhdGFcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGtpZCBmb3VuZCBpbiBpZF90b2tlbiBhbmQgbW9yZSB0aGFuIG9uZSBrZXkgZm91bmQgaW4gbWV0YWRhdGFcIikpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBraWQgaXMgbWFuZGF0b3J5IG9ubHkgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUga2V5cyBpbiB0aGUgcmVmZXJlbmNlZCBKV0sgU2V0IGRvY3VtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGh0dHA6Ly9vcGVuaWQubmV0L3NwZWNzL29wZW5pZC1jb25uZWN0LWNvcmUtMV8wLmh0bWwjU2lnbmluZ1xyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9IGtleXNbMF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLmZpbHRlcihrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXkua2lkID09PSBraWQ7XHJcbiAgICAgICAgICAgICAgICB9KVswXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGtleSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2dldFNpZ25pbmdLZXlGb3JKd3RXaXRoU2luZ2xlUmV0cnkoand0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNpZ25pbmdLZXlGb3JKd3Qoand0KS50aGVuKGtleSA9PiB7XHJcbiAgICAgICAgICAgIC8vIFJlZnJlc2hpbmcgc2lnbmluZ0tleXMgaWYgbm8gc3VpdGFibGUgdmVyaWZpY2F0aW9uIGtleSBpcyBwcmVzZW50IGZvciBnaXZlbiBqd3QgaGVhZGVyLlxyXG4gICAgICAgICAgICBpZiAoIWtleSkge1xyXG4gICAgICAgICAgICAgICAgLy8gc2V0IHRvIHVuZGVmaW5lZCwgdG8gdHJpZ2dlciBuZXR3b3JrIGNhbGwgdG8gandrc191cmkuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVNlcnZpY2UucmVzZXRTaWduaW5nS2V5cygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNpZ25pbmdLZXlGb3JKd3Qoand0KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoa2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF92YWxpZGF0ZUlkVG9rZW4oc3RhdGUsIHJlc3BvbnNlKSB7XHJcbiAgICAgICAgaWYgKCFzdGF0ZS5ub25jZSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVJZFRva2VuOiBObyBub25jZSBvbiBzdGF0ZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIG5vbmNlIG9uIHN0YXRlXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBqd3QgPSB0aGlzLl9qb3NlVXRpbC5wYXJzZUp3dChyZXNwb25zZS5pZF90b2tlbik7XHJcbiAgICAgICAgaWYgKCFqd3QgfHwgIWp3dC5oZWFkZXIgfHwgIWp3dC5wYXlsb2FkKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUlkVG9rZW46IEZhaWxlZCB0byBwYXJzZSBpZF90b2tlblwiLCBqd3QpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRmFpbGVkIHRvIHBhcnNlIGlkX3Rva2VuXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzdGF0ZS5ub25jZSAhPT0gand0LnBheWxvYWQubm9uY2UpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlSWRUb2tlbjogSW52YWxpZCBub25jZSBpbiBpZF90b2tlblwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgbm9uY2UgaW4gaWRfdG9rZW5cIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZS5nZXRJc3N1ZXIoKS50aGVuKGlzc3VlciA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUlkVG9rZW46IFJlY2VpdmVkIGlzc3VlclwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNpZ25pbmdLZXlGb3JKd3RXaXRoU2luZ2xlUmV0cnkoand0KS50aGVuKGtleSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUlkVG9rZW46IE5vIGtleSBtYXRjaGluZyBraWQgb3IgYWxnIGZvdW5kIGluIHNpZ25pbmcga2V5c1wiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8ga2V5IG1hdGNoaW5nIGtpZCBvciBhbGcgZm91bmQgaW4gc2lnbmluZyBrZXlzXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgYXVkaWVuY2UgPSBzdGF0ZS5jbGllbnRfaWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGNsb2NrU2tld0luU2Vjb25kcyA9IHRoaXMuX3NldHRpbmdzLmNsb2NrU2tldztcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUlkVG9rZW46IFZhbGlkYWluZyBKV1Q7IHVzaW5nIGNsb2NrIHNrZXcgKGluIHNlY29uZHMpIG9mOiBcIiwgY2xvY2tTa2V3SW5TZWNvbmRzKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fam9zZVV0aWwudmFsaWRhdGVKd3QocmVzcG9uc2UuaWRfdG9rZW4sIGtleSwgaXNzdWVyLCBhdWRpZW5jZSwgY2xvY2tTa2V3SW5TZWNvbmRzKS50aGVuKCgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlSWRUb2tlbjogSldUIHZhbGlkYXRpb24gc3VjY2Vzc2Z1bFwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFqd3QucGF5bG9hZC5zdWIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlSWRUb2tlbjogTm8gc3ViIHByZXNlbnQgaW4gaWRfdG9rZW5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBzdWIgcHJlc2VudCBpbiBpZF90b2tlblwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5wcm9maWxlID0gand0LnBheWxvYWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBfZmlsdGVyQnlBbGcoa2V5cywgYWxnKXtcclxuICAgICAgICB2YXIga3R5ID0gbnVsbDtcclxuICAgICAgICBpZiAoYWxnLnN0YXJ0c1dpdGgoXCJSU1wiKSkge1xyXG4gICAgICAgICAgICBrdHkgPSBcIlJTQVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChhbGcuc3RhcnRzV2l0aChcIlBTXCIpKSB7XHJcbiAgICAgICAgICAgIGt0eSA9IFwiUFNcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYWxnLnN0YXJ0c1dpdGgoXCJFU1wiKSkge1xyXG4gICAgICAgICAgICBrdHkgPSBcIkVDXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fZmlsdGVyQnlBbGc6IGFsZyBub3Qgc3VwcG9ydGVkOiBcIiwgYWxnKTtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IuX2ZpbHRlckJ5QWxnOiBMb29raW5nIGZvciBrZXlzIHRoYXQgbWF0Y2gga3R5OiBcIiwga3R5KTtcclxuXHJcbiAgICAgICAga2V5cyA9IGtleXMuZmlsdGVyKGtleSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBrZXkua3R5ID09PSBrdHk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl9maWx0ZXJCeUFsZzogTnVtYmVyIG9mIGtleXMgdGhhdCBtYXRjaCBrdHk6IFwiLCBrdHksIGtleXMubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGtleXM7XHJcbiAgICB9XHJcblxyXG4gICAgX3ZhbGlkYXRlQWNjZXNzVG9rZW4ocmVzcG9uc2UpIHtcclxuICAgICAgICBpZiAoIXJlc3BvbnNlLnByb2ZpbGUpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlQWNjZXNzVG9rZW46IE5vIHByb2ZpbGUgbG9hZGVkIGZyb20gaWRfdG9rZW5cIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBwcm9maWxlIGxvYWRlZCBmcm9tIGlkX3Rva2VuXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghcmVzcG9uc2UucHJvZmlsZS5hdF9oYXNoKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUFjY2Vzc1Rva2VuOiBObyBhdF9oYXNoIGluIGlkX3Rva2VuXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gYXRfaGFzaCBpbiBpZF90b2tlblwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXJlc3BvbnNlLmlkX3Rva2VuKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUFjY2Vzc1Rva2VuOiBObyBpZF90b2tlblwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGlkX3Rva2VuXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBqd3QgPSB0aGlzLl9qb3NlVXRpbC5wYXJzZUp3dChyZXNwb25zZS5pZF90b2tlbik7XHJcbiAgICAgICAgaWYgKCFqd3QgfHwgIWp3dC5oZWFkZXIpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlQWNjZXNzVG9rZW46IEZhaWxlZCB0byBwYXJzZSBpZF90b2tlblwiLCBqd3QpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRmFpbGVkIHRvIHBhcnNlIGlkX3Rva2VuXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBoYXNoQWxnID0gand0LmhlYWRlci5hbGc7XHJcbiAgICAgICAgaWYgKCFoYXNoQWxnIHx8IGhhc2hBbGcubGVuZ3RoICE9PSA1KSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUFjY2Vzc1Rva2VuOiBVbnN1cHBvcnRlZCBhbGc6XCIsIGhhc2hBbGcpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgYWxnOiBcIiArIGhhc2hBbGcpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBoYXNoQml0cyA9IGhhc2hBbGcuc3Vic3RyKDIsIDMpO1xyXG4gICAgICAgIGlmICghaGFzaEJpdHMpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlQWNjZXNzVG9rZW46IFVuc3VwcG9ydGVkIGFsZzpcIiwgaGFzaEFsZywgaGFzaEJpdHMpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgYWxnOiBcIiArIGhhc2hBbGcpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGhhc2hCaXRzID0gcGFyc2VJbnQoaGFzaEJpdHMpO1xyXG4gICAgICAgIGlmIChoYXNoQml0cyAhPT0gMjU2ICYmIGhhc2hCaXRzICE9PSAzODQgJiYgaGFzaEJpdHMgIT09IDUxMikge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVBY2Nlc3NUb2tlbjogVW5zdXBwb3J0ZWQgYWxnOlwiLCBoYXNoQWxnLCBoYXNoQml0cyk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBhbGc6IFwiICsgaGFzaEFsZykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHNoYSA9IFwic2hhXCIgKyBoYXNoQml0cztcclxuICAgICAgICB2YXIgaGFzaCA9IHRoaXMuX2pvc2VVdGlsLmhhc2hTdHJpbmcocmVzcG9uc2UuYWNjZXNzX3Rva2VuLCBzaGEpO1xyXG4gICAgICAgIGlmICghaGFzaCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVBY2Nlc3NUb2tlbjogYWNjZXNzX3Rva2VuIGhhc2ggZmFpbGVkOlwiLCBzaGEpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRmFpbGVkIHRvIHZhbGlkYXRlIGF0X2hhc2hcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGxlZnQgPSBoYXNoLnN1YnN0cigwLCBoYXNoLmxlbmd0aCAvIDIpO1xyXG4gICAgICAgIHZhciBsZWZ0X2I2NHUgPSB0aGlzLl9qb3NlVXRpbC5oZXhUb0Jhc2U2NFVybChsZWZ0KTtcclxuICAgICAgICBpZiAobGVmdF9iNjR1ICE9PSByZXNwb25zZS5wcm9maWxlLmF0X2hhc2gpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlQWNjZXNzVG9rZW46IEZhaWxlZCB0byB2YWxpZGF0ZSBhdF9oYXNoXCIsIGxlZnRfYjY0dSwgcmVzcG9uc2UucHJvZmlsZS5hdF9oYXNoKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkZhaWxlZCB0byB2YWxpZGF0ZSBhdF9oYXNoXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUFjY2Vzc1Rva2VuOiBzdWNjZXNzXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcbmltcG9ydCB7IENoZWNrU2Vzc2lvbklGcmFtZSB9IGZyb20gJy4vQ2hlY2tTZXNzaW9uSUZyYW1lLmpzJztcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSAnLi9HbG9iYWwuanMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNlc3Npb25Nb25pdG9yIHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih1c2VyTWFuYWdlciwgQ2hlY2tTZXNzaW9uSUZyYW1lQ3RvciA9IENoZWNrU2Vzc2lvbklGcmFtZSwgdGltZXIgPSBHbG9iYWwudGltZXIpIHtcclxuICAgICAgICBpZiAoIXVzZXJNYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlNlc3Npb25Nb25pdG9yLmN0b3I6IE5vIHVzZXIgbWFuYWdlciBwYXNzZWQgdG8gU2Vzc2lvbk1vbml0b3JcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVzZXJNYW5hZ2VyXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIgPSB1c2VyTWFuYWdlcjtcclxuICAgICAgICB0aGlzLl9DaGVja1Nlc3Npb25JRnJhbWVDdG9yID0gQ2hlY2tTZXNzaW9uSUZyYW1lQ3RvcjtcclxuICAgICAgICB0aGlzLl90aW1lciA9IHRpbWVyO1xyXG5cclxuICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5ldmVudHMuYWRkVXNlckxvYWRlZCh0aGlzLl9zdGFydC5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5ldmVudHMuYWRkVXNlclVubG9hZGVkKHRoaXMuX3N0b3AuYmluZCh0aGlzKSk7XHJcblxyXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh0aGlzLl91c2VyTWFuYWdlci5nZXRVc2VyKCkudGhlbih1c2VyID0+IHtcclxuICAgICAgICAgICAgLy8gZG9pbmcgdGhpcyBtYW51YWxseSBoZXJlIHNpbmNlIGNhbGxpbmcgZ2V0VXNlciBcclxuICAgICAgICAgICAgLy8gZG9lc24ndCB0cmlnZ2VyIGxvYWQgZXZlbnQuXHJcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydCh1c2VyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9zZXR0aW5ncy5tb25pdG9yQW5vbnltb3VzU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIucXVlcnlTZXNzaW9uU3RhdHVzKCkudGhlbihzZXNzaW9uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdG1wVXNlciA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbl9zdGF0ZSA6IHNlc3Npb24uc2Vzc2lvbl9zdGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24uc3ViICYmIHNlc3Npb24uc2lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcFVzZXIucHJvZmlsZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yjogc2Vzc2lvbi5zdWIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWQ6IHNlc3Npb24uc2lkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0KHRtcFVzZXIpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNhdGNoIHRvIHN1cHByZXNzIGVycm9ycyBzaW5jZSB3ZSdyZSBpbiBhIGN0b3JcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJTZXNzaW9uTW9uaXRvciBjdG9yOiBlcnJvciBmcm9tIHF1ZXJ5U2Vzc2lvblN0YXR1czpcIiwgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAvLyBjYXRjaCB0byBzdXBwcmVzcyBlcnJvcnMgc2luY2Ugd2UncmUgaW4gYSBjdG9yXHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlNlc3Npb25Nb25pdG9yIGN0b3I6IGVycm9yIGZyb20gZ2V0VXNlcjpcIiwgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgX3NldHRpbmdzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91c2VyTWFuYWdlci5zZXR0aW5ncztcclxuICAgIH1cclxuICAgIGdldCBfbWV0YWRhdGFTZXJ2aWNlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91c2VyTWFuYWdlci5tZXRhZGF0YVNlcnZpY2U7XHJcbiAgICB9XHJcbiAgICBnZXQgX2NsaWVudF9pZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3MuY2xpZW50X2lkO1xyXG4gICAgfVxyXG4gICAgZ2V0IF9jaGVja1Nlc3Npb25JbnRlcnZhbCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3MuY2hlY2tTZXNzaW9uSW50ZXJ2YWw7XHJcbiAgICB9XHJcbiAgICBnZXQgX3N0b3BDaGVja1Nlc3Npb25PbkVycm9yKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncy5zdG9wQ2hlY2tTZXNzaW9uT25FcnJvcjtcclxuICAgIH1cclxuXHJcbiAgICBfc3RhcnQodXNlcikge1xyXG4gICAgICAgIGxldCBzZXNzaW9uX3N0YXRlID0gdXNlci5zZXNzaW9uX3N0YXRlO1xyXG5cclxuICAgICAgICBpZiAoc2Vzc2lvbl9zdGF0ZSkge1xyXG4gICAgICAgICAgICBpZiAodXNlci5wcm9maWxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdWIgPSB1c2VyLnByb2ZpbGUuc3ViO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2lkID0gdXNlci5wcm9maWxlLnNpZDtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNlc3Npb25Nb25pdG9yLl9zdGFydDogc2Vzc2lvbl9zdGF0ZTpcIiwgc2Vzc2lvbl9zdGF0ZSwgXCIsIHN1YjpcIiwgdGhpcy5fc3ViKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N1YiA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NpZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNlc3Npb25Nb25pdG9yLl9zdGFydDogc2Vzc2lvbl9zdGF0ZTpcIiwgc2Vzc2lvbl9zdGF0ZSwgXCIsIGFub255bW91cyB1c2VyXCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2NoZWNrU2Vzc2lvbklGcmFtZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGFTZXJ2aWNlLmdldENoZWNrU2Vzc2lvbklmcmFtZSgpLnRoZW4odXJsID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNlc3Npb25Nb25pdG9yLl9zdGFydDogSW5pdGlhbGl6aW5nIGNoZWNrIHNlc3Npb24gaWZyYW1lXCIpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2xpZW50X2lkID0gdGhpcy5fY2xpZW50X2lkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW50ZXJ2YWwgPSB0aGlzLl9jaGVja1Nlc3Npb25JbnRlcnZhbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0b3BPbkVycm9yID0gdGhpcy5fc3RvcENoZWNrU2Vzc2lvbk9uRXJyb3I7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUgPSBuZXcgdGhpcy5fQ2hlY2tTZXNzaW9uSUZyYW1lQ3Rvcih0aGlzLl9jYWxsYmFjay5iaW5kKHRoaXMpLCBjbGllbnRfaWQsIHVybCwgaW50ZXJ2YWwsIHN0b3BPbkVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tTZXNzaW9uSUZyYW1lLmxvYWQoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrU2Vzc2lvbklGcmFtZS5zdGFydChzZXNzaW9uX3N0YXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cud2FybihcIlNlc3Npb25Nb25pdG9yLl9zdGFydDogTm8gY2hlY2sgc2Vzc2lvbiBpZnJhbWUgZm91bmQgaW4gdGhlIG1ldGFkYXRhXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2F0Y2ggdG8gc3VwcHJlc3MgZXJyb3JzIHNpbmNlIHdlJ3JlIGluIG5vbi1wcm9taXNlIGNhbGxiYWNrXHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiU2Vzc2lvbk1vbml0b3IuX3N0YXJ0OiBFcnJvciBmcm9tIGdldENoZWNrU2Vzc2lvbklmcmFtZTpcIiwgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUuc3RhcnQoc2Vzc2lvbl9zdGF0ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX3N0b3AoKSB7XHJcbiAgICAgICAgdGhpcy5fc3ViID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuX3NpZCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NoZWNrU2Vzc2lvbklGcmFtZSkge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJTZXNzaW9uTW9uaXRvci5fc3RvcFwiKTtcclxuICAgICAgICAgICAgdGhpcy5fY2hlY2tTZXNzaW9uSUZyYW1lLnN0b3AoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5tb25pdG9yQW5vbnltb3VzU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAvLyB1c2luZyBhIHRpbWVyIHRvIGRlbGF5IHJlLWluaXRpYWxpemF0aW9uIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucyBkdXJpbmcgc2lnbm91dFxyXG4gICAgICAgICAgICBsZXQgdGltZXJIYW5kbGUgPSB0aGlzLl90aW1lci5zZXRJbnRlcnZhbCgoKT0+e1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdGltZXIuY2xlYXJJbnRlcnZhbCh0aW1lckhhbmRsZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIucXVlcnlTZXNzaW9uU3RhdHVzKCkudGhlbihzZXNzaW9uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdG1wVXNlciA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbl9zdGF0ZSA6IHNlc3Npb24uc2Vzc2lvbl9zdGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24uc3ViICYmIHNlc3Npb24uc2lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcFVzZXIucHJvZmlsZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yjogc2Vzc2lvbi5zdWIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWQ6IHNlc3Npb24uc2lkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0KHRtcFVzZXIpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNhdGNoIHRvIHN1cHByZXNzIGVycm9ycyBzaW5jZSB3ZSdyZSBpbiBhIGNhbGxiYWNrXHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiU2Vzc2lvbk1vbml0b3I6IGVycm9yIGZyb20gcXVlcnlTZXNzaW9uU3RhdHVzOlwiLCBlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIH0sIDEwMDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfY2FsbGJhY2soKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIucXVlcnlTZXNzaW9uU3RhdHVzKCkudGhlbihzZXNzaW9uID0+IHtcclxuICAgICAgICAgICAgdmFyIHJhaXNlRXZlbnQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uLnN1YiA9PT0gdGhpcy5fc3ViKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFpc2VFdmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrU2Vzc2lvbklGcmFtZS5zdGFydChzZXNzaW9uLnNlc3Npb25fc3RhdGUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbi5zaWQgPT09IHRoaXMuX3NpZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJTZXNzaW9uTW9uaXRvci5fY2FsbGJhY2s6IFNhbWUgc3ViIHN0aWxsIGxvZ2dlZCBpbiBhdCBPUCwgcmVzdGFydGluZyBjaGVjayBzZXNzaW9uIGlmcmFtZTsgc2Vzc2lvbl9zdGF0ZTpcIiwgc2Vzc2lvbi5zZXNzaW9uX3N0YXRlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNlc3Npb25Nb25pdG9yLl9jYWxsYmFjazogU2FtZSBzdWIgc3RpbGwgbG9nZ2VkIGluIGF0IE9QLCBzZXNzaW9uIHN0YXRlIGhhcyBjaGFuZ2VkLCByZXN0YXJ0aW5nIGNoZWNrIHNlc3Npb24gaWZyYW1lOyBzZXNzaW9uX3N0YXRlOlwiLCBzZXNzaW9uLnNlc3Npb25fc3RhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5ldmVudHMuX3JhaXNlVXNlclNlc3Npb25DaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiU2Vzc2lvbk1vbml0b3IuX2NhbGxiYWNrOiBEaWZmZXJlbnQgc3ViamVjdCBzaWduZWQgaW50byBPUDpcIiwgc2Vzc2lvbi5zdWIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiU2Vzc2lvbk1vbml0b3IuX2NhbGxiYWNrOiBTdWJqZWN0IG5vIGxvbmdlciBzaWduZWQgaW50byBPUFwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHJhaXNlRXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdWIpIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJTZXNzaW9uTW9uaXRvci5fY2FsbGJhY2s6IFNlc3Npb25Nb25pdG9yLl9jYWxsYmFjazsgcmFpc2luZyBzaWduZWQgb3V0IGV2ZW50XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLmV2ZW50cy5fcmFpc2VVc2VyU2lnbmVkT3V0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJTZXNzaW9uTW9uaXRvci5fY2FsbGJhY2s6IFNlc3Npb25Nb25pdG9yLl9jYWxsYmFjazsgcmFpc2luZyBzaWduZWQgaW4gZXZlbnRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZXZlbnRzLl9yYWlzZVVzZXJTaWduZWRJbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3N1Yikge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiU2Vzc2lvbk1vbml0b3IuX2NhbGxiYWNrOiBFcnJvciBjYWxsaW5nIHF1ZXJ5Q3VycmVudFNpZ25pblNlc3Npb247IHJhaXNpbmcgc2lnbmVkIG91dCBldmVudFwiLCBlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5ldmVudHMuX3JhaXNlVXNlclNpZ25lZE91dCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5pbXBvcnQgeyBVcmxVdGlsaXR5IH0gZnJvbSAnLi9VcmxVdGlsaXR5LmpzJztcclxuaW1wb3J0IHsgU2lnbmluU3RhdGUgfSBmcm9tICcuL1NpZ25pblN0YXRlLmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBTaWduaW5SZXF1ZXN0IHtcclxuICAgIGNvbnN0cnVjdG9yKHtcclxuICAgICAgICAvLyBtYW5kYXRvcnlcclxuICAgICAgICB1cmwsIGNsaWVudF9pZCwgcmVkaXJlY3RfdXJpLCByZXNwb25zZV90eXBlLCBzY29wZSwgYXV0aG9yaXR5LFxyXG4gICAgICAgIC8vIG9wdGlvbmFsXHJcbiAgICAgICAgZGF0YSwgcHJvbXB0LCBkaXNwbGF5LCBtYXhfYWdlLCB1aV9sb2NhbGVzLCBpZF90b2tlbl9oaW50LCBsb2dpbl9oaW50LCBhY3JfdmFsdWVzLCByZXNvdXJjZSwgcmVzcG9uc2VfbW9kZSxcclxuICAgICAgICByZXF1ZXN0LCByZXF1ZXN0X3VyaSwgZXh0cmFRdWVyeVBhcmFtcywgcmVxdWVzdF90eXBlLCBjbGllbnRfc2VjcmV0LCBleHRyYVRva2VuUGFyYW1zLCBza2lwVXNlckluZm9cclxuICAgIH0pIHtcclxuICAgICAgICBpZiAoIXVybCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJTaWduaW5SZXF1ZXN0LmN0b3I6IE5vIHVybCBwYXNzZWRcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVybFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjbGllbnRfaWQpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiU2lnbmluUmVxdWVzdC5jdG9yOiBObyBjbGllbnRfaWQgcGFzc2VkXCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjbGllbnRfaWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghcmVkaXJlY3RfdXJpKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlNpZ25pblJlcXVlc3QuY3RvcjogTm8gcmVkaXJlY3RfdXJpIHBhc3NlZFwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVkaXJlY3RfdXJpXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXJlc3BvbnNlX3R5cGUpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiU2lnbmluUmVxdWVzdC5jdG9yOiBObyByZXNwb25zZV90eXBlIHBhc3NlZFwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVzcG9uc2VfdHlwZVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFzY29wZSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJTaWduaW5SZXF1ZXN0LmN0b3I6IE5vIHNjb3BlIHBhc3NlZFwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2NvcGVcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghYXV0aG9yaXR5KSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlNpZ25pblJlcXVlc3QuY3RvcjogTm8gYXV0aG9yaXR5IHBhc3NlZFwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXV0aG9yaXR5XCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG9pZGMgPSBTaWduaW5SZXF1ZXN0LmlzT2lkYyhyZXNwb25zZV90eXBlKTtcclxuICAgICAgICBsZXQgY29kZSA9IFNpZ25pblJlcXVlc3QuaXNDb2RlKHJlc3BvbnNlX3R5cGUpO1xyXG5cclxuICAgICAgICBpZiAoIXJlc3BvbnNlX21vZGUpIHtcclxuICAgICAgICAgICAgcmVzcG9uc2VfbW9kZSA9IFNpZ25pblJlcXVlc3QuaXNDb2RlKHJlc3BvbnNlX3R5cGUpID8gXCJxdWVyeVwiIDogbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBuZXcgU2lnbmluU3RhdGUoeyBub25jZTogb2lkYywgXHJcbiAgICAgICAgICAgIGRhdGEsIGNsaWVudF9pZCwgYXV0aG9yaXR5LCByZWRpcmVjdF91cmksIFxyXG4gICAgICAgICAgICBjb2RlX3ZlcmlmaWVyOiBjb2RlLCBcclxuICAgICAgICAgICAgcmVxdWVzdF90eXBlLCByZXNwb25zZV9tb2RlLFxyXG4gICAgICAgICAgICBjbGllbnRfc2VjcmV0LCBzY29wZSwgZXh0cmFUb2tlblBhcmFtcywgc2tpcFVzZXJJbmZvIH0pO1xyXG5cclxuICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcImNsaWVudF9pZFwiLCBjbGllbnRfaWQpO1xyXG4gICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwicmVkaXJlY3RfdXJpXCIsIHJlZGlyZWN0X3VyaSk7XHJcbiAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJyZXNwb25zZV90eXBlXCIsIHJlc3BvbnNlX3R5cGUpO1xyXG4gICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwic2NvcGVcIiwgc2NvcGUpO1xyXG5cclxuICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcInN0YXRlXCIsIHRoaXMuc3RhdGUuaWQpO1xyXG4gICAgICAgIGlmIChvaWRjKSB7XHJcbiAgICAgICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwibm9uY2VcIiwgdGhpcy5zdGF0ZS5ub25jZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb2RlKSB7XHJcbiAgICAgICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwiY29kZV9jaGFsbGVuZ2VcIiwgdGhpcy5zdGF0ZS5jb2RlX2NoYWxsZW5nZSk7XHJcbiAgICAgICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kXCIsIFwiUzI1NlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBvcHRpb25hbCA9IHsgcHJvbXB0LCBkaXNwbGF5LCBtYXhfYWdlLCB1aV9sb2NhbGVzLCBpZF90b2tlbl9oaW50LCBsb2dpbl9oaW50LCBhY3JfdmFsdWVzLCByZXNvdXJjZSwgcmVxdWVzdCwgcmVxdWVzdF91cmksIHJlc3BvbnNlX21vZGUgfTtcclxuICAgICAgICBmb3IobGV0IGtleSBpbiBvcHRpb25hbCl7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25hbFtrZXldKSB7XHJcbiAgICAgICAgICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBrZXksIG9wdGlvbmFsW2tleV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IobGV0IGtleSBpbiBleHRyYVF1ZXJ5UGFyYW1zKXtcclxuICAgICAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwga2V5LCBleHRyYVF1ZXJ5UGFyYW1zW2tleV0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVybCA9IHVybDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNPaWRjKHJlc3BvbnNlX3R5cGUpIHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gcmVzcG9uc2VfdHlwZS5zcGxpdCgvXFxzKy9nKS5maWx0ZXIoZnVuY3Rpb24oaXRlbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbSA9PT0gXCJpZF90b2tlblwiO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiAhIShyZXN1bHRbMF0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc09BdXRoKHJlc3BvbnNlX3R5cGUpIHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gcmVzcG9uc2VfdHlwZS5zcGxpdCgvXFxzKy9nKS5maWx0ZXIoZnVuY3Rpb24oaXRlbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbSA9PT0gXCJ0b2tlblwiO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiAhIShyZXN1bHRbMF0pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBzdGF0aWMgaXNDb2RlKHJlc3BvbnNlX3R5cGUpIHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gcmVzcG9uc2VfdHlwZS5zcGxpdCgvXFxzKy9nKS5maWx0ZXIoZnVuY3Rpb24oaXRlbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbSA9PT0gXCJjb2RlXCI7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuICEhKHJlc3VsdFswXSk7XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgVXJsVXRpbGl0eSB9IGZyb20gJy4vVXJsVXRpbGl0eS5qcyc7XHJcblxyXG5jb25zdCBPaWRjU2NvcGUgPSBcIm9wZW5pZFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNpZ25pblJlc3BvbnNlIHtcclxuICAgIGNvbnN0cnVjdG9yKHVybCwgZGVsaW1pdGVyID0gXCIjXCIpIHtcclxuXHJcbiAgICAgICAgdmFyIHZhbHVlcyA9IFVybFV0aWxpdHkucGFyc2VVcmxGcmFnbWVudCh1cmwsIGRlbGltaXRlcik7XHJcblxyXG4gICAgICAgIHRoaXMuZXJyb3IgPSB2YWx1ZXMuZXJyb3I7XHJcbiAgICAgICAgdGhpcy5lcnJvcl9kZXNjcmlwdGlvbiA9IHZhbHVlcy5lcnJvcl9kZXNjcmlwdGlvbjtcclxuICAgICAgICB0aGlzLmVycm9yX3VyaSA9IHZhbHVlcy5lcnJvcl91cmk7XHJcblxyXG4gICAgICAgIHRoaXMuY29kZSA9IHZhbHVlcy5jb2RlO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB2YWx1ZXMuc3RhdGU7XHJcbiAgICAgICAgdGhpcy5pZF90b2tlbiA9IHZhbHVlcy5pZF90b2tlbjtcclxuICAgICAgICB0aGlzLnNlc3Npb25fc3RhdGUgPSB2YWx1ZXMuc2Vzc2lvbl9zdGF0ZTtcclxuICAgICAgICB0aGlzLmFjY2Vzc190b2tlbiA9IHZhbHVlcy5hY2Nlc3NfdG9rZW47XHJcbiAgICAgICAgdGhpcy50b2tlbl90eXBlID0gdmFsdWVzLnRva2VuX3R5cGU7XHJcbiAgICAgICAgdGhpcy5zY29wZSA9IHZhbHVlcy5zY29wZTtcclxuICAgICAgICB0aGlzLnByb2ZpbGUgPSB1bmRlZmluZWQ7IC8vIHdpbGwgYmUgc2V0IGZyb20gUmVzcG9uc2VWYWxpZGF0b3JcclxuXHJcbiAgICAgICAgdGhpcy5leHBpcmVzX2luID0gdmFsdWVzLmV4cGlyZXNfaW47XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGV4cGlyZXNfaW4oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZXhwaXJlc19hdCkge1xyXG4gICAgICAgICAgICBsZXQgbm93ID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDApO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leHBpcmVzX2F0IC0gbm93O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgc2V0IGV4cGlyZXNfaW4odmFsdWUpe1xyXG4gICAgICAgIGxldCBleHBpcmVzX2luID0gcGFyc2VJbnQodmFsdWUpO1xyXG4gICAgICAgIGlmICh0eXBlb2YgZXhwaXJlc19pbiA9PT0gJ251bWJlcicgJiYgZXhwaXJlc19pbiA+IDApIHtcclxuICAgICAgICAgICAgbGV0IG5vdyA9IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwKTtcclxuICAgICAgICAgICAgdGhpcy5leHBpcmVzX2F0ID0gbm93ICsgZXhwaXJlc19pbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGV4cGlyZWQoKSB7XHJcbiAgICAgICAgbGV0IGV4cGlyZXNfaW4gPSB0aGlzLmV4cGlyZXNfaW47XHJcbiAgICAgICAgaWYgKGV4cGlyZXNfaW4gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZXhwaXJlc19pbiA8PSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzY29wZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnNjb3BlIHx8IFwiXCIpLnNwbGl0KFwiIFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXNPcGVuSWRDb25uZWN0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNjb3Blcy5pbmRleE9mKE9pZGNTY29wZSkgPj0gMCB8fCAhIXRoaXMuaWRfdG9rZW47XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5pbXBvcnQgeyBTdGF0ZSB9IGZyb20gJy4vU3RhdGUuanMnO1xyXG5pbXBvcnQgeyBKb3NlVXRpbCB9IGZyb20gJy4vSm9zZVV0aWwuanMnO1xyXG5pbXBvcnQgcmFuZG9tIGZyb20gJy4vcmFuZG9tLmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBTaWduaW5TdGF0ZSBleHRlbmRzIFN0YXRlIHtcclxuICAgIGNvbnN0cnVjdG9yKHtub25jZSwgYXV0aG9yaXR5LCBjbGllbnRfaWQsIHJlZGlyZWN0X3VyaSwgY29kZV92ZXJpZmllciwgcmVzcG9uc2VfbW9kZSwgY2xpZW50X3NlY3JldCwgc2NvcGUsIGV4dHJhVG9rZW5QYXJhbXMsIHNraXBVc2VySW5mb30gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKGFyZ3VtZW50c1swXSk7XHJcblxyXG4gICAgICAgIGlmIChub25jZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9ub25jZSA9IHJhbmRvbSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChub25jZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9ub25jZSA9IG5vbmNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvZGVfdmVyaWZpZXIgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgLy8gcmFuZG9tKCkgcHJvZHVjZXMgMzIgbGVuZ3RoXHJcbiAgICAgICAgICAgIHRoaXMuX2NvZGVfdmVyaWZpZXIgPSByYW5kb20oKSArIHJhbmRvbSgpICsgcmFuZG9tKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNvZGVfdmVyaWZpZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fY29kZV92ZXJpZmllciA9IGNvZGVfdmVyaWZpZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0aGlzLmNvZGVfdmVyaWZpZXIpIHtcclxuICAgICAgICAgICAgbGV0IGhhc2ggPSBKb3NlVXRpbC5oYXNoU3RyaW5nKHRoaXMuY29kZV92ZXJpZmllciwgXCJTSEEyNTZcIik7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvZGVfY2hhbGxlbmdlID0gSm9zZVV0aWwuaGV4VG9CYXNlNjRVcmwoaGFzaCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9yZWRpcmVjdF91cmkgPSByZWRpcmVjdF91cmk7XHJcbiAgICAgICAgdGhpcy5fYXV0aG9yaXR5ID0gYXV0aG9yaXR5O1xyXG4gICAgICAgIHRoaXMuX2NsaWVudF9pZCA9IGNsaWVudF9pZDtcclxuICAgICAgICB0aGlzLl9yZXNwb25zZV9tb2RlID0gcmVzcG9uc2VfbW9kZTtcclxuICAgICAgICB0aGlzLl9jbGllbnRfc2VjcmV0ID0gY2xpZW50X3NlY3JldDtcclxuICAgICAgICB0aGlzLl9zY29wZSA9IHNjb3BlO1xyXG4gICAgICAgIHRoaXMuX2V4dHJhVG9rZW5QYXJhbXMgPSBleHRyYVRva2VuUGFyYW1zO1xyXG4gICAgICAgIHRoaXMuX3NraXBVc2VySW5mbyA9IHNraXBVc2VySW5mbztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbm9uY2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vbmNlO1xyXG4gICAgfVxyXG4gICAgZ2V0IGF1dGhvcml0eSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYXV0aG9yaXR5O1xyXG4gICAgfVxyXG4gICAgZ2V0IGNsaWVudF9pZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2xpZW50X2lkO1xyXG4gICAgfVxyXG4gICAgZ2V0IHJlZGlyZWN0X3VyaSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVkaXJlY3RfdXJpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGNvZGVfdmVyaWZpZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvZGVfdmVyaWZpZXI7XHJcbiAgICB9XHJcbiAgICBnZXQgY29kZV9jaGFsbGVuZ2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvZGVfY2hhbGxlbmdlO1xyXG4gICAgfVxyXG4gICAgZ2V0IHJlc3BvbnNlX21vZGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlX21vZGU7XHJcbiAgICB9XHJcbiAgICBnZXQgY2xpZW50X3NlY3JldCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2xpZW50X3NlY3JldDtcclxuICAgIH1cclxuICAgIGdldCBzY29wZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2NvcGU7XHJcbiAgICB9XHJcbiAgICBnZXQgZXh0cmFUb2tlblBhcmFtcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZXh0cmFUb2tlblBhcmFtcztcclxuICAgIH1cclxuICAgIGdldCBza2lwVXNlckluZm8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NraXBVc2VySW5mbztcclxuICAgIH1cclxuICAgIFxyXG4gICAgdG9TdG9yYWdlU3RyaW5nKCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlNpZ25pblN0YXRlLnRvU3RvcmFnZVN0cmluZ1wiKTtcclxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcclxuICAgICAgICAgICAgZGF0YTogdGhpcy5kYXRhLFxyXG4gICAgICAgICAgICBjcmVhdGVkOiB0aGlzLmNyZWF0ZWQsXHJcbiAgICAgICAgICAgIHJlcXVlc3RfdHlwZTogdGhpcy5yZXF1ZXN0X3R5cGUsXHJcbiAgICAgICAgICAgIG5vbmNlOiB0aGlzLm5vbmNlLFxyXG4gICAgICAgICAgICBjb2RlX3ZlcmlmaWVyOiB0aGlzLmNvZGVfdmVyaWZpZXIsXHJcbiAgICAgICAgICAgIHJlZGlyZWN0X3VyaTogdGhpcy5yZWRpcmVjdF91cmksXHJcbiAgICAgICAgICAgIGF1dGhvcml0eTogdGhpcy5hdXRob3JpdHksXHJcbiAgICAgICAgICAgIGNsaWVudF9pZDogdGhpcy5jbGllbnRfaWQsXHJcbiAgICAgICAgICAgIHJlc3BvbnNlX21vZGU6IHRoaXMucmVzcG9uc2VfbW9kZSxcclxuICAgICAgICAgICAgY2xpZW50X3NlY3JldDogdGhpcy5jbGllbnRfc2VjcmV0LFxyXG4gICAgICAgICAgICBzY29wZTogdGhpcy5zY29wZSxcclxuICAgICAgICAgICAgZXh0cmFUb2tlblBhcmFtcyA6IHRoaXMuZXh0cmFUb2tlblBhcmFtcyxcclxuICAgICAgICAgICAgc2tpcFVzZXJJbmZvOiB0aGlzLnNraXBVc2VySW5mb1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBmcm9tU3RvcmFnZVN0cmluZyhzdG9yYWdlU3RyaW5nKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiU2lnbmluU3RhdGUuZnJvbVN0b3JhZ2VTdHJpbmdcIik7XHJcbiAgICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKHN0b3JhZ2VTdHJpbmcpO1xyXG4gICAgICAgIHJldHVybiBuZXcgU2lnbmluU3RhdGUoZGF0YSk7XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5pbXBvcnQgeyBVcmxVdGlsaXR5IH0gZnJvbSAnLi9VcmxVdGlsaXR5LmpzJztcclxuaW1wb3J0IHsgU3RhdGUgfSBmcm9tICcuL1N0YXRlLmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBTaWdub3V0UmVxdWVzdCB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7dXJsLCBpZF90b2tlbl9oaW50LCBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmksIGRhdGEsIGV4dHJhUXVlcnlQYXJhbXMsIHJlcXVlc3RfdHlwZX0pIHtcclxuICAgICAgICBpZiAoIXVybCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJTaWdub3V0UmVxdWVzdC5jdG9yOiBObyB1cmwgcGFzc2VkXCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1cmxcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWRfdG9rZW5faGludCkge1xyXG4gICAgICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcImlkX3Rva2VuX2hpbnRcIiwgaWRfdG9rZW5faGludCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpKSB7XHJcbiAgICAgICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwicG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpXCIsIHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IG5ldyBTdGF0ZSh7IGRhdGEsIHJlcXVlc3RfdHlwZSB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcInN0YXRlXCIsIHRoaXMuc3RhdGUuaWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IobGV0IGtleSBpbiBleHRyYVF1ZXJ5UGFyYW1zKXtcclxuICAgICAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwga2V5LCBleHRyYVF1ZXJ5UGFyYW1zW2tleV0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVybCA9IHVybDtcclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBVcmxVdGlsaXR5IH0gZnJvbSAnLi9VcmxVdGlsaXR5LmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBTaWdub3V0UmVzcG9uc2Uge1xyXG4gICAgY29uc3RydWN0b3IodXJsKSB7XHJcblxyXG4gICAgICAgIHZhciB2YWx1ZXMgPSBVcmxVdGlsaXR5LnBhcnNlVXJsRnJhZ21lbnQodXJsLCBcIj9cIik7XHJcblxyXG4gICAgICAgIHRoaXMuZXJyb3IgPSB2YWx1ZXMuZXJyb3I7XHJcbiAgICAgICAgdGhpcy5lcnJvcl9kZXNjcmlwdGlvbiA9IHZhbHVlcy5lcnJvcl9kZXNjcmlwdGlvbjtcclxuICAgICAgICB0aGlzLmVycm9yX3VyaSA9IHZhbHVlcy5lcnJvcl91cmk7XHJcblxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB2YWx1ZXMuc3RhdGU7XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNpbGVudFJlbmV3U2VydmljZSB7XHJcblxyXG4gICAgY29uc3RydWN0b3IodXNlck1hbmFnZXIpIHtcclxuICAgICAgICB0aGlzLl91c2VyTWFuYWdlciA9IHVzZXJNYW5hZ2VyO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSB0aGlzLl90b2tlbkV4cGlyaW5nLmJpbmQodGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLmV2ZW50cy5hZGRBY2Nlc3NUb2tlbkV4cGlyaW5nKHRoaXMuX2NhbGxiYWNrKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHRoaXMgd2lsbCB0cmlnZ2VyIGxvYWRpbmcgb2YgdGhlIHVzZXIgc28gdGhlIGV4cGlyaW5nIGV2ZW50cyBjYW4gYmUgaW5pdGlhbGl6ZWRcclxuICAgICAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZ2V0VXNlcigpLnRoZW4odXNlcj0+e1xyXG4gICAgICAgICAgICAgICAgLy8gZGVsaWJlcmF0ZSBub3BcclxuICAgICAgICAgICAgfSkuY2F0Y2goZXJyPT57XHJcbiAgICAgICAgICAgICAgICAvLyBjYXRjaCB0byBzdXBwcmVzcyBlcnJvcnMgc2luY2Ugd2UncmUgaW4gYSBjdG9yXHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJTaWxlbnRSZW5ld1NlcnZpY2Uuc3RhcnQ6IEVycm9yIGZyb20gZ2V0VXNlcjpcIiwgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RvcCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZXZlbnRzLnJlbW92ZUFjY2Vzc1Rva2VuRXhwaXJpbmcodGhpcy5fY2FsbGJhY2spO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fY2FsbGJhY2s7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF90b2tlbkV4cGlyaW5nKCkge1xyXG4gICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLnNpZ25pblNpbGVudCgpLnRoZW4odXNlciA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNpbGVudFJlbmV3U2VydmljZS5fdG9rZW5FeHBpcmluZzogU2lsZW50IHRva2VuIHJlbmV3YWwgc3VjY2Vzc2Z1bFwiKTtcclxuICAgICAgICB9LCBlcnIgPT4ge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJTaWxlbnRSZW5ld1NlcnZpY2UuX3Rva2VuRXhwaXJpbmc6IEVycm9yIGZyb20gc2lnbmluU2lsZW50OlwiLCBlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLmV2ZW50cy5fcmFpc2VTaWxlbnRSZW5ld0Vycm9yKGVycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5pbXBvcnQgcmFuZG9tIGZyb20gJy4vcmFuZG9tLmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBTdGF0ZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7aWQsIGRhdGEsIGNyZWF0ZWQsIHJlcXVlc3RfdHlwZX0gPSB7fSkge1xyXG4gICAgICAgIHRoaXMuX2lkID0gaWQgfHwgcmFuZG9tKCk7XHJcbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgY3JlYXRlZCA9PT0gJ251bWJlcicgJiYgY3JlYXRlZCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5fY3JlYXRlZCA9IGNyZWF0ZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVkID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9yZXF1ZXN0X3R5cGUgPSAgcmVxdWVzdF90eXBlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faWQ7XHJcbiAgICB9XHJcbiAgICBnZXQgZGF0YSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcclxuICAgIH1cclxuICAgIGdldCBjcmVhdGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVkO1xyXG4gICAgfVxyXG4gICAgZ2V0IHJlcXVlc3RfdHlwZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdF90eXBlO1xyXG4gICAgfVxyXG5cclxuICAgIHRvU3RvcmFnZVN0cmluZygpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJTdGF0ZS50b1N0b3JhZ2VTdHJpbmdcIik7XHJcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXHJcbiAgICAgICAgICAgIGRhdGE6IHRoaXMuZGF0YSxcclxuICAgICAgICAgICAgY3JlYXRlZDogdGhpcy5jcmVhdGVkLFxyXG4gICAgICAgICAgICByZXF1ZXN0X3R5cGU6IHRoaXMucmVxdWVzdF90eXBlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGZyb21TdG9yYWdlU3RyaW5nKHN0b3JhZ2VTdHJpbmcpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJTdGF0ZS5mcm9tU3RvcmFnZVN0cmluZ1wiKTtcclxuICAgICAgICByZXR1cm4gbmV3IFN0YXRlKEpTT04ucGFyc2Uoc3RvcmFnZVN0cmluZykpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjbGVhclN0YWxlU3RhdGUoc3RvcmFnZSwgYWdlKSB7XHJcblxyXG4gICAgICAgIHZhciBjdXRvZmYgPSBEYXRlLm5vdygpIC8gMTAwMCAtIGFnZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHN0b3JhZ2UuZ2V0QWxsS2V5cygpLnRoZW4oa2V5cyA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlN0YXRlLmNsZWFyU3RhbGVTdGF0ZTogZ290IGtleXNcIiwga2V5cyk7XHJcblxyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0ga2V5c1tpXTtcclxuICAgICAgICAgICAgICAgIHZhciBwID0gc3RvcmFnZS5nZXQoa2V5KS50aGVuKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZW1vdmUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGF0ZSA9IFN0YXRlLmZyb21TdG9yYWdlU3RyaW5nKGl0ZW0pXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiU3RhdGUuY2xlYXJTdGFsZVN0YXRlOiBnb3QgaXRlbSBmcm9tIGtleTogXCIsIGtleSwgc3RhdGUuY3JlYXRlZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmNyZWF0ZWQgPD0gY3V0b2ZmKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiU3RhdGUuY2xlYXJTdGFsZVN0YXRlOiBFcnJvciBwYXJzaW5nIHN0YXRlIGZvciBrZXlcIiwga2V5LCBlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiU3RhdGUuY2xlYXJTdGFsZVN0YXRlOiBubyBpdGVtIGluIHN0b3JhZ2UgZm9yIGtleTogXCIsIGtleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3ZlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlN0YXRlLmNsZWFyU3RhbGVTdGF0ZTogcmVtb3ZlZCBpdGVtIGZvciBrZXk6IFwiLCBrZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmFnZS5yZW1vdmUoa2V5KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJTdGF0ZS5jbGVhclN0YWxlU3RhdGU6IHdhaXRpbmcgb24gcHJvbWlzZSBjb3VudDpcIiwgcHJvbWlzZXMubGVuZ3RoKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gJy4vR2xvYmFsLmpzJztcclxuaW1wb3J0IHsgRXZlbnQgfSBmcm9tICcuL0V2ZW50LmpzJztcclxuXHJcbmNvbnN0IFRpbWVyRHVyYXRpb24gPSA1OyAvLyBzZWNvbmRzXHJcblxyXG5leHBvcnQgY2xhc3MgVGltZXIgZXh0ZW5kcyBFdmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IobmFtZSwgdGltZXIgPSBHbG9iYWwudGltZXIsIG5vd0Z1bmMgPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBzdXBlcihuYW1lKTtcclxuICAgICAgICB0aGlzLl90aW1lciA9IHRpbWVyO1xyXG5cclxuICAgICAgICBpZiAobm93RnVuYykge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3dGdW5jID0gbm93RnVuYztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vd0Z1bmMgPSAoKSA9PiBEYXRlLm5vdygpIC8gMTAwMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG5vdygpIHtcclxuICAgICAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5fbm93RnVuYygpKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KGR1cmF0aW9uKSB7XHJcbiAgICAgICAgaWYgKGR1cmF0aW9uIDw9IDApIHtcclxuICAgICAgICAgICAgZHVyYXRpb24gPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkdXJhdGlvbiA9IHBhcnNlSW50KGR1cmF0aW9uKTtcclxuXHJcbiAgICAgICAgdmFyIGV4cGlyYXRpb24gPSB0aGlzLm5vdyArIGR1cmF0aW9uO1xyXG4gICAgICAgIGlmICh0aGlzLmV4cGlyYXRpb24gPT09IGV4cGlyYXRpb24gJiYgdGhpcy5fdGltZXJIYW5kbGUpIHtcclxuICAgICAgICAgICAgLy8gbm8gbmVlZCB0byByZWluaXRpYWxpemUgdG8gc2FtZSBleHBpcmF0aW9uLCBzbyBiYWlsIG91dFxyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJUaW1lci5pbml0IHRpbWVyIFwiICsgdGhpcy5fbmFtZSArIFwiIHNraXBwaW5nIGluaXRpYWxpemF0aW9uIHNpbmNlIGFscmVhZHkgaW5pdGlhbGl6ZWQgZm9yIGV4cGlyYXRpb246XCIsIHRoaXMuZXhwaXJhdGlvbik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2FuY2VsKCk7XHJcblxyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlRpbWVyLmluaXQgdGltZXIgXCIgKyB0aGlzLl9uYW1lICsgXCIgZm9yIGR1cmF0aW9uOlwiLCBkdXJhdGlvbik7XHJcbiAgICAgICAgdGhpcy5fZXhwaXJhdGlvbiA9IGV4cGlyYXRpb247XHJcblxyXG4gICAgICAgIC8vIHdlJ3JlIHVzaW5nIGEgZmFpcmx5IHNob3J0IHRpbWVyIGFuZCB0aGVuIGNoZWNraW5nIHRoZSBleHBpcmF0aW9uIGluIHRoZVxyXG4gICAgICAgIC8vIGNhbGxiYWNrIHRvIGhhbmRsZSBzY2VuYXJpb3Mgd2hlcmUgdGhlIGJyb3dzZXIgZGV2aWNlIHNsZWVwcywgYW5kIHRoZW5cclxuICAgICAgICAvLyB0aGUgdGltZXJzIGVuZCB1cCBnZXR0aW5nIGRlbGF5ZWQuXHJcbiAgICAgICAgdmFyIHRpbWVyRHVyYXRpb24gPSBUaW1lckR1cmF0aW9uO1xyXG4gICAgICAgIGlmIChkdXJhdGlvbiA8IHRpbWVyRHVyYXRpb24pIHtcclxuICAgICAgICAgICAgdGltZXJEdXJhdGlvbiA9IGR1cmF0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl90aW1lckhhbmRsZSA9IHRoaXMuX3RpbWVyLnNldEludGVydmFsKHRoaXMuX2NhbGxiYWNrLmJpbmQodGhpcyksIHRpbWVyRHVyYXRpb24gKiAxMDAwKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgZ2V0IGV4cGlyYXRpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cGlyYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgY2FuY2VsKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl90aW1lckhhbmRsZSkge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJUaW1lci5jYW5jZWw6IFwiLCB0aGlzLl9uYW1lKTtcclxuICAgICAgICAgICAgdGhpcy5fdGltZXIuY2xlYXJJbnRlcnZhbCh0aGlzLl90aW1lckhhbmRsZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpbWVySGFuZGxlID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX2NhbGxiYWNrKCkge1xyXG4gICAgICAgIHZhciBkaWZmID0gdGhpcy5fZXhwaXJhdGlvbiAtIHRoaXMubm93O1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlRpbWVyLmNhbGxiYWNrOyBcIiArIHRoaXMuX25hbWUgKyBcIiB0aW1lciBleHBpcmVzIGluOlwiLCBkaWZmKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2V4cGlyYXRpb24gPD0gdGhpcy5ub3cpIHtcclxuICAgICAgICAgICAgdGhpcy5jYW5jZWwoKTtcclxuICAgICAgICAgICAgc3VwZXIucmFpc2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgSnNvblNlcnZpY2UgfSBmcm9tICcuL0pzb25TZXJ2aWNlLmpzJztcclxuaW1wb3J0IHsgTWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi9NZXRhZGF0YVNlcnZpY2UuanMnO1xyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgVG9rZW5DbGllbnQge1xyXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MsIEpzb25TZXJ2aWNlQ3RvciA9IEpzb25TZXJ2aWNlLCBNZXRhZGF0YVNlcnZpY2VDdG9yID0gTWV0YWRhdGFTZXJ2aWNlKSB7XHJcbiAgICAgICAgaWYgKCFzZXR0aW5ncykge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJUb2tlbkNsaWVudC5jdG9yOiBObyBzZXR0aW5ncyBwYXNzZWRcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNldHRpbmdzXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBzZXR0aW5ncztcclxuICAgICAgICB0aGlzLl9qc29uU2VydmljZSA9IG5ldyBKc29uU2VydmljZUN0b3IoKTtcclxuICAgICAgICB0aGlzLl9tZXRhZGF0YVNlcnZpY2UgPSBuZXcgTWV0YWRhdGFTZXJ2aWNlQ3Rvcih0aGlzLl9zZXR0aW5ncyk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhjaGFuZ2VDb2RlKGFyZ3MgPSB7fSkge1xyXG4gICAgICAgIGFyZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBhcmdzKTtcclxuXHJcbiAgICAgICAgYXJncy5ncmFudF90eXBlID0gYXJncy5ncmFudF90eXBlIHx8IFwiYXV0aG9yaXphdGlvbl9jb2RlXCI7XHJcbiAgICAgICAgYXJncy5jbGllbnRfaWQgPSBhcmdzLmNsaWVudF9pZCB8fCB0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQ7XHJcbiAgICAgICAgYXJncy5jbGllbnRfc2VjcmV0ID0gYXJncy5jbGllbnRfc2VjcmV0IHx8IHRoaXMuX3NldHRpbmdzLmNsaWVudF9zZWNyZXQ7XHJcbiAgICAgICAgYXJncy5yZWRpcmVjdF91cmkgPSBhcmdzLnJlZGlyZWN0X3VyaSB8fCB0aGlzLl9zZXR0aW5ncy5yZWRpcmVjdF91cmk7XHJcblxyXG4gICAgICAgIHZhciBiYXNpY0F1dGggPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdmFyIGNsaWVudF9hdXRoZW50aWNhdGlvbiA9IGFyZ3MuX2NsaWVudF9hdXRoZW50aWNhdGlvbiB8fCB0aGlzLl9zZXR0aW5ncy5fY2xpZW50X2F1dGhlbnRpY2F0aW9uO1xyXG4gICAgICAgIGRlbGV0ZSBhcmdzLl9jbGllbnRfYXV0aGVudGljYXRpb247XHJcblxyXG4gICAgICAgIGlmICghYXJncy5jb2RlKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlRva2VuQ2xpZW50LmV4Y2hhbmdlQ29kZTogTm8gY29kZSBwYXNzZWRcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJBIGNvZGUgaXMgcmVxdWlyZWRcIikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWFyZ3MucmVkaXJlY3RfdXJpKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlRva2VuQ2xpZW50LmV4Y2hhbmdlQ29kZTogTm8gcmVkaXJlY3RfdXJpIHBhc3NlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkEgcmVkaXJlY3RfdXJpIGlzIHJlcXVpcmVkXCIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFhcmdzLmNvZGVfdmVyaWZpZXIpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiVG9rZW5DbGllbnQuZXhjaGFuZ2VDb2RlOiBObyBjb2RlX3ZlcmlmaWVyIHBhc3NlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkEgY29kZV92ZXJpZmllciBpcyByZXF1aXJlZFwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghYXJncy5jbGllbnRfaWQpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiVG9rZW5DbGllbnQuZXhjaGFuZ2VDb2RlOiBObyBjbGllbnRfaWQgcGFzc2VkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQSBjbGllbnRfaWQgaXMgcmVxdWlyZWRcIikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWFyZ3MuY2xpZW50X3NlY3JldCAmJiBjbGllbnRfYXV0aGVudGljYXRpb24gPT0gXCJjbGllbnRfc2VjcmV0X2Jhc2ljXCIpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiVG9rZW5DbGllbnQuZXhjaGFuZ2VDb2RlOiBObyBjbGllbnRfc2VjcmV0IHBhc3NlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkEgY2xpZW50X3NlY3JldCBpcyByZXF1aXJlZFwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZW5kaW5nIHRoZSBjbGllbnQgY3JlZGVudGlhbHMgdXNpbmcgdGhlIEJhc2ljIEF1dGggbWV0aG9kXHJcbiAgICAgICAgaWYoY2xpZW50X2F1dGhlbnRpY2F0aW9uID09IFwiY2xpZW50X3NlY3JldF9iYXNpY1wiKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYmFzaWNBdXRoID0gYXJncy5jbGllbnRfaWQgKyAnOicgKyBhcmdzLmNsaWVudF9zZWNyZXQ7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBhcmdzLmNsaWVudF9pZDtcclxuICAgICAgICAgICAgZGVsZXRlIGFyZ3MuY2xpZW50X3NlY3JldDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0VG9rZW5FbmRwb2ludChmYWxzZSkudGhlbih1cmwgPT4ge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJUb2tlbkNsaWVudC5leGNoYW5nZUNvZGU6IFJlY2VpdmVkIHRva2VuIGVuZHBvaW50XCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fanNvblNlcnZpY2UucG9zdEZvcm0odXJsLCBhcmdzLCBiYXNpY0F1dGgpLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiVG9rZW5DbGllbnQuZXhjaGFuZ2VDb2RlOiByZXNwb25zZSByZWNlaXZlZFwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhjaGFuZ2VSZWZyZXNoVG9rZW4oYXJncyA9IHt9KSB7XHJcbiAgICAgICAgYXJncyA9IE9iamVjdC5hc3NpZ24oe30sIGFyZ3MpO1xyXG5cclxuICAgICAgICBhcmdzLmdyYW50X3R5cGUgPSBhcmdzLmdyYW50X3R5cGUgfHwgXCJyZWZyZXNoX3Rva2VuXCI7XHJcbiAgICAgICAgYXJncy5jbGllbnRfaWQgPSBhcmdzLmNsaWVudF9pZCB8fCB0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQ7XHJcbiAgICAgICAgYXJncy5jbGllbnRfc2VjcmV0ID0gYXJncy5jbGllbnRfc2VjcmV0IHx8IHRoaXMuX3NldHRpbmdzLmNsaWVudF9zZWNyZXQ7XHJcblxyXG4gICAgICAgIHZhciBiYXNpY0F1dGggPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdmFyIGNsaWVudF9hdXRoZW50aWNhdGlvbiA9IGFyZ3MuX2NsaWVudF9hdXRoZW50aWNhdGlvbiB8fCB0aGlzLl9zZXR0aW5ncy5fY2xpZW50X2F1dGhlbnRpY2F0aW9uO1xyXG4gICAgICAgIGRlbGV0ZSBhcmdzLl9jbGllbnRfYXV0aGVudGljYXRpb247XHJcblxyXG4gICAgICAgIGlmICghYXJncy5yZWZyZXNoX3Rva2VuKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlRva2VuQ2xpZW50LmV4Y2hhbmdlUmVmcmVzaFRva2VuOiBObyByZWZyZXNoX3Rva2VuIHBhc3NlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkEgcmVmcmVzaF90b2tlbiBpcyByZXF1aXJlZFwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghYXJncy5jbGllbnRfaWQpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiVG9rZW5DbGllbnQuZXhjaGFuZ2VSZWZyZXNoVG9rZW46IE5vIGNsaWVudF9pZCBwYXNzZWRcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJBIGNsaWVudF9pZCBpcyByZXF1aXJlZFwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZW5kaW5nIHRoZSBjbGllbnQgY3JlZGVudGlhbHMgdXNpbmcgdGhlIEJhc2ljIEF1dGggbWV0aG9kXHJcbiAgICAgICAgaWYoY2xpZW50X2F1dGhlbnRpY2F0aW9uID09IFwiY2xpZW50X3NlY3JldF9iYXNpY1wiKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYmFzaWNBdXRoID0gYXJncy5jbGllbnRfaWQgKyAnOicgKyBhcmdzLmNsaWVudF9zZWNyZXQ7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBhcmdzLmNsaWVudF9pZDtcclxuICAgICAgICAgICAgZGVsZXRlIGFyZ3MuY2xpZW50X3NlY3JldDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0VG9rZW5FbmRwb2ludChmYWxzZSkudGhlbih1cmwgPT4ge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJUb2tlbkNsaWVudC5leGNoYW5nZVJlZnJlc2hUb2tlbjogUmVjZWl2ZWQgdG9rZW4gZW5kcG9pbnRcIik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fanNvblNlcnZpY2UucG9zdEZvcm0odXJsLCBhcmdzLCBiYXNpY0F1dGgpLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiVG9rZW5DbGllbnQuZXhjaGFuZ2VSZWZyZXNoVG9rZW46IHJlc3BvbnNlIHJlY2VpdmVkXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcbmltcG9ydCB7IE1ldGFkYXRhU2VydmljZSB9IGZyb20gJy4vTWV0YWRhdGFTZXJ2aWNlLmpzJztcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSAnLi9HbG9iYWwuanMnO1xyXG5cclxuY29uc3QgQWNjZXNzVG9rZW5UeXBlSGludCA9IFwiYWNjZXNzX3Rva2VuXCI7XHJcbmNvbnN0IFJlZnJlc2hUb2tlblR5cGVIaW50ID0gXCJyZWZyZXNoX3Rva2VuXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVG9rZW5SZXZvY2F0aW9uQ2xpZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzLCBYTUxIdHRwUmVxdWVzdEN0b3IgPSBHbG9iYWwuWE1MSHR0cFJlcXVlc3QsIE1ldGFkYXRhU2VydmljZUN0b3IgPSBNZXRhZGF0YVNlcnZpY2UpIHtcclxuICAgICAgICBpZiAoIXNldHRpbmdzKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlRva2VuUmV2b2NhdGlvbkNsaWVudC5jdG9yOiBObyBzZXR0aW5ncyBwcm92aWRlZFwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gc2V0dGluZ3MgcHJvdmlkZWQuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBzZXR0aW5ncztcclxuICAgICAgICB0aGlzLl9YTUxIdHRwUmVxdWVzdEN0b3IgPSBYTUxIdHRwUmVxdWVzdEN0b3I7XHJcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFTZXJ2aWNlID0gbmV3IE1ldGFkYXRhU2VydmljZUN0b3IodGhpcy5fc2V0dGluZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldm9rZSh0b2tlbiwgcmVxdWlyZWQsIHR5cGUgPSBcImFjY2Vzc190b2tlblwiKSB7XHJcbiAgICAgICAgaWYgKCF0b2tlbikge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJUb2tlblJldm9jYXRpb25DbGllbnQucmV2b2tlOiBObyB0b2tlbiBwcm92aWRlZFwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gdG9rZW4gcHJvdmlkZWQuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHR5cGUgIT09IEFjY2Vzc1Rva2VuVHlwZUhpbnQgJiYgdHlwZSAhPSBSZWZyZXNoVG9rZW5UeXBlSGludCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJUb2tlblJldm9jYXRpb25DbGllbnQucmV2b2tlOiBJbnZhbGlkIHRva2VuIHR5cGVcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdG9rZW4gdHlwZS5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlLmdldFJldm9jYXRpb25FbmRwb2ludCgpLnRoZW4odXJsID0+IHtcclxuICAgICAgICAgICAgaWYgKCF1cmwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIlRva2VuUmV2b2NhdGlvbkNsaWVudC5yZXZva2U6IFJldm9jYXRpb24gbm90IHN1cHBvcnRlZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXZvY2F0aW9uIG5vdCBzdXBwb3J0ZWRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gbm90IHJlcXVpcmVkLCBzbyBkb24ndCBlcnJvciBhbmQganVzdCByZXR1cm5cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiVG9rZW5SZXZvY2F0aW9uQ2xpZW50LnJldm9rZTogUmV2b2tpbmcgXCIgKyB0eXBlKTtcclxuICAgICAgICAgICAgdmFyIGNsaWVudF9pZCA9IHRoaXMuX3NldHRpbmdzLmNsaWVudF9pZDtcclxuICAgICAgICAgICAgdmFyIGNsaWVudF9zZWNyZXQgPSB0aGlzLl9zZXR0aW5ncy5jbGllbnRfc2VjcmV0O1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV2b2tlKHVybCwgY2xpZW50X2lkLCBjbGllbnRfc2VjcmV0LCB0b2tlbiwgdHlwZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX3Jldm9rZSh1cmwsIGNsaWVudF9pZCwgY2xpZW50X3NlY3JldCwgdG9rZW4sIHR5cGUpIHtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgdGhpcy5fWE1MSHR0cFJlcXVlc3RDdG9yKCk7XHJcbiAgICAgICAgICAgIHhoci5vcGVuKFwiUE9TVFwiLCB1cmwpO1xyXG5cclxuICAgICAgICAgICAgeGhyLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlRva2VuUmV2b2NhdGlvbkNsaWVudC5yZXZva2U6IEhUVFAgcmVzcG9uc2UgcmVjZWl2ZWQsIHN0YXR1c1wiLCB4aHIuc3RhdHVzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KEVycm9yKHhoci5zdGF0dXNUZXh0ICsgXCIgKFwiICsgeGhyLnN0YXR1cyArIFwiKVwiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4geyBcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlRva2VuUmV2b2NhdGlvbkNsaWVudC5yZXZva2U6IE5ldHdvcmsgRXJyb3IuXCIpXHJcbiAgICAgICAgICAgICAgICByZWplY3QoXCJOZXR3b3JrIEVycm9yXCIpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdmFyIGJvZHkgPSBcImNsaWVudF9pZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChjbGllbnRfaWQpO1xyXG4gICAgICAgICAgICBpZiAoY2xpZW50X3NlY3JldCkge1xyXG4gICAgICAgICAgICAgICAgYm9keSArPSBcIiZjbGllbnRfc2VjcmV0PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGNsaWVudF9zZWNyZXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJvZHkgKz0gXCImdG9rZW5fdHlwZV9oaW50PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHR5cGUpO1xyXG4gICAgICAgICAgICBib2R5ICs9IFwiJnRva2VuPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xyXG4gICAgICAgICAgICB4aHIuc2VuZChib2R5KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gJy4vR2xvYmFsLmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBVcmxVdGlsaXR5IHtcclxuICAgIHN0YXRpYyBhZGRRdWVyeVBhcmFtKHVybCwgbmFtZSwgdmFsdWUpIHtcclxuICAgICAgICBpZiAodXJsLmluZGV4T2YoJz8nKSA8IDApIHtcclxuICAgICAgICAgICAgdXJsICs9IFwiP1wiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHVybFt1cmwubGVuZ3RoIC0gMV0gIT09IFwiP1wiKSB7XHJcbiAgICAgICAgICAgIHVybCArPSBcIiZcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHVybCArPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSk7XHJcbiAgICAgICAgdXJsICs9IFwiPVwiO1xyXG4gICAgICAgIHVybCArPSBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdXJsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBwYXJzZVVybEZyYWdtZW50KHZhbHVlLCBkZWxpbWl0ZXIgPSBcIiNcIiwgZ2xvYmFsID0gR2xvYmFsKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpe1xyXG4gICAgICAgICAgICB2YWx1ZSA9IGdsb2JhbC5sb2NhdGlvbi5ocmVmO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGlkeCA9IHZhbHVlLmxhc3RJbmRleE9mKGRlbGltaXRlcik7XHJcbiAgICAgICAgaWYgKGlkeCA+PSAwKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyKGlkeCArIDEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGRlbGltaXRlciA9PT0gXCI/XCIpIHtcclxuICAgICAgICAgICAgLy8gaWYgd2UncmUgZG9pbmcgcXVlcnksIHRoZW4gc3RyaXAgb2ZmIGhhc2ggZnJhZ21lbnQgYmVmb3JlIHdlIHBhcnNlXHJcbiAgICAgICAgICAgIGlkeCA9IHZhbHVlLmluZGV4T2YoJyMnKTtcclxuICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cigwLCBpZHgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgcGFyYW1zID0ge30sXHJcbiAgICAgICAgICAgIHJlZ2V4ID0gLyhbXiY9XSspPShbXiZdKikvZyxcclxuICAgICAgICAgICAgbTtcclxuXHJcbiAgICAgICAgdmFyIGNvdW50ZXIgPSAwO1xyXG4gICAgICAgIHdoaWxlIChtID0gcmVnZXguZXhlYyh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgcGFyYW1zW2RlY29kZVVSSUNvbXBvbmVudChtWzFdKV0gPSBkZWNvZGVVUklDb21wb25lbnQobVsyXS5yZXBsYWNlKC9cXCsvZywgJyAnKSk7XHJcbiAgICAgICAgICAgIGlmIChjb3VudGVyKysgPiA1MCkge1xyXG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiVXJsVXRpbGl0eS5wYXJzZVVybEZyYWdtZW50OiByZXNwb25zZSBleGNlZWRlZCBleHBlY3RlZCBudW1iZXIgb2YgcGFyYW1ldGVyc1wiLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBcIlJlc3BvbnNlIGV4Y2VlZGVkIGV4cGVjdGVkIG51bWJlciBvZiBwYXJhbWV0ZXJzXCJcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAodmFyIHByb3AgaW4gcGFyYW1zKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwYXJhbXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFVzZXIge1xyXG4gICAgY29uc3RydWN0b3Ioe2lkX3Rva2VuLCBzZXNzaW9uX3N0YXRlLCBhY2Nlc3NfdG9rZW4sIHJlZnJlc2hfdG9rZW4sIHRva2VuX3R5cGUsIHNjb3BlLCBwcm9maWxlLCBleHBpcmVzX2F0LCBzdGF0ZX0pIHtcclxuICAgICAgICB0aGlzLmlkX3Rva2VuID0gaWRfdG9rZW47XHJcbiAgICAgICAgdGhpcy5zZXNzaW9uX3N0YXRlID0gc2Vzc2lvbl9zdGF0ZTtcclxuICAgICAgICB0aGlzLmFjY2Vzc190b2tlbiA9IGFjY2Vzc190b2tlbjtcclxuICAgICAgICB0aGlzLnJlZnJlc2hfdG9rZW4gPSByZWZyZXNoX3Rva2VuO1xyXG4gICAgICAgIHRoaXMudG9rZW5fdHlwZSA9IHRva2VuX3R5cGU7XHJcbiAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlO1xyXG4gICAgICAgIHRoaXMucHJvZmlsZSA9IHByb2ZpbGU7XHJcbiAgICAgICAgdGhpcy5leHBpcmVzX2F0ID0gZXhwaXJlc19hdDtcclxuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGV4cGlyZXNfaW4oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZXhwaXJlc19hdCkge1xyXG4gICAgICAgICAgICBsZXQgbm93ID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDApO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leHBpcmVzX2F0IC0gbm93O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgc2V0IGV4cGlyZXNfaW4odmFsdWUpIHtcclxuICAgICAgICBsZXQgZXhwaXJlc19pbiA9IHBhcnNlSW50KHZhbHVlKTtcclxuICAgICAgICBpZiAodHlwZW9mIGV4cGlyZXNfaW4gPT09ICdudW1iZXInICYmIGV4cGlyZXNfaW4gPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBub3cgPSBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCk7XHJcbiAgICAgICAgICAgIHRoaXMuZXhwaXJlc19hdCA9IG5vdyArIGV4cGlyZXNfaW47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBleHBpcmVkKCkge1xyXG4gICAgICAgIGxldCBleHBpcmVzX2luID0gdGhpcy5leHBpcmVzX2luO1xyXG4gICAgICAgIGlmIChleHBpcmVzX2luICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGV4cGlyZXNfaW4gPD0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2NvcGVzKCkge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5zY29wZSB8fCBcIlwiKS5zcGxpdChcIiBcIik7XHJcbiAgICB9XHJcblxyXG4gICAgdG9TdG9yYWdlU3RyaW5nKCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXIudG9TdG9yYWdlU3RyaW5nXCIpO1xyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgIGlkX3Rva2VuOiB0aGlzLmlkX3Rva2VuLFxyXG4gICAgICAgICAgICBzZXNzaW9uX3N0YXRlOiB0aGlzLnNlc3Npb25fc3RhdGUsXHJcbiAgICAgICAgICAgIGFjY2Vzc190b2tlbjogdGhpcy5hY2Nlc3NfdG9rZW4sXHJcbiAgICAgICAgICAgIHJlZnJlc2hfdG9rZW46IHRoaXMucmVmcmVzaF90b2tlbixcclxuICAgICAgICAgICAgdG9rZW5fdHlwZTogdGhpcy50b2tlbl90eXBlLFxyXG4gICAgICAgICAgICBzY29wZTogdGhpcy5zY29wZSxcclxuICAgICAgICAgICAgcHJvZmlsZTogdGhpcy5wcm9maWxlLFxyXG4gICAgICAgICAgICBleHBpcmVzX2F0OiB0aGlzLmV4cGlyZXNfYXRcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmFnZVN0cmluZykge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXIuZnJvbVN0b3JhZ2VTdHJpbmdcIik7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBVc2VyKEpTT04ucGFyc2Uoc3RvcmFnZVN0cmluZykpO1xyXG4gICAgfVxyXG59XHJcbiIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCB7IEpzb25TZXJ2aWNlIH0gZnJvbSAnLi9Kc29uU2VydmljZS5qcyc7XHJcbmltcG9ydCB7IE1ldGFkYXRhU2VydmljZSB9IGZyb20gJy4vTWV0YWRhdGFTZXJ2aWNlLmpzJztcclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5pbXBvcnQgeyBKb3NlVXRpbCB9IGZyb20gJy4vSm9zZVV0aWwuanMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFVzZXJJbmZvU2VydmljZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBzZXR0aW5ncywgXHJcbiAgICAgICAgSnNvblNlcnZpY2VDdG9yID0gSnNvblNlcnZpY2UsIFxyXG4gICAgICAgIE1ldGFkYXRhU2VydmljZUN0b3IgPSBNZXRhZGF0YVNlcnZpY2UsIFxyXG4gICAgICAgIGpvc2VVdGlsID0gSm9zZVV0aWxcclxuICAgICkge1xyXG4gICAgICAgIGlmICghc2V0dGluZ3MpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiVXNlckluZm9TZXJ2aWNlLmN0b3I6IE5vIHNldHRpbmdzIHBhc3NlZFwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2V0dGluZ3NcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IHNldHRpbmdzO1xyXG4gICAgICAgIHRoaXMuX2pzb25TZXJ2aWNlID0gbmV3IEpzb25TZXJ2aWNlQ3Rvcih1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGhpcy5fZ2V0Q2xhaW1zRnJvbUp3dC5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLl9tZXRhZGF0YVNlcnZpY2UgPSBuZXcgTWV0YWRhdGFTZXJ2aWNlQ3Rvcih0aGlzLl9zZXR0aW5ncyk7XHJcbiAgICAgICAgdGhpcy5fam9zZVV0aWwgPSBqb3NlVXRpbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDbGFpbXModG9rZW4pIHtcclxuICAgICAgICBpZiAoIXRva2VuKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlVzZXJJbmZvU2VydmljZS5nZXRDbGFpbXM6IE5vIHRva2VuIHBhc3NlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkEgdG9rZW4gaXMgcmVxdWlyZWRcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZS5nZXRVc2VySW5mb0VuZHBvaW50KCkudGhlbih1cmwgPT4ge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJVc2VySW5mb1NlcnZpY2UuZ2V0Q2xhaW1zOiByZWNlaXZlZCB1c2VyaW5mbyB1cmxcIiwgdXJsKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9qc29uU2VydmljZS5nZXRKc29uKHVybCwgdG9rZW4pLnRoZW4oY2xhaW1zID0+IHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJJbmZvU2VydmljZS5nZXRDbGFpbXM6IGNsYWltcyByZWNlaXZlZFwiLCBjbGFpbXMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsYWltcztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2dldENsYWltc0Zyb21Kd3QocmVxKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IGp3dCA9IHRoaXMuX2pvc2VVdGlsLnBhcnNlSnd0KHJlcS5yZXNwb25zZVRleHQpO1xyXG4gICAgICAgICAgICBpZiAoIWp3dCB8fCAhand0LmhlYWRlciB8fCAhand0LnBheWxvYWQpIHtcclxuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIlVzZXJJbmZvU2VydmljZS5fZ2V0Q2xhaW1zRnJvbUp3dDogRmFpbGVkIHRvIHBhcnNlIEpXVFwiLCBqd3QpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkZhaWxlZCB0byBwYXJzZSBpZF90b2tlblwiKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBraWQgPSBqd3QuaGVhZGVyLmtpZDtcclxuXHJcbiAgICAgICAgICAgIGxldCBpc3N1ZXJQcm9taXNlO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuX3NldHRpbmdzLnVzZXJJbmZvSnd0SXNzdWVyKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdPUCc6XHJcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVyUHJvbWlzZSA9IHRoaXMuX21ldGFkYXRhU2VydmljZS5nZXRJc3N1ZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0FOWSc6XHJcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVyUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShqd3QucGF5bG9hZC5pc3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpc3N1ZXJQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX3NldHRpbmdzLnVzZXJJbmZvSnd0SXNzdWVyKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGlzc3VlclByb21pc2UudGhlbihpc3N1ZXIgPT4ge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiVXNlckluZm9TZXJ2aWNlLl9nZXRDbGFpbXNGcm9tSnd0OiBSZWNlaXZlZCBpc3N1ZXI6XCIgKyBpc3N1ZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0U2lnbmluZ0tleXMoKS50aGVuKGtleXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgha2V5cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJVc2VySW5mb1NlcnZpY2UuX2dldENsYWltc0Zyb21Kd3Q6IE5vIHNpZ25pbmcga2V5cyBmcm9tIG1ldGFkYXRhXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gc2lnbmluZyBrZXlzIGZyb20gbWV0YWRhdGFcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiVXNlckluZm9TZXJ2aWNlLl9nZXRDbGFpbXNGcm9tSnd0OiBSZWNlaXZlZCBzaWduaW5nIGtleXNcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGtleTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWtpZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzID0gdGhpcy5fZmlsdGVyQnlBbGcoa2V5cywgand0LmhlYWRlci5hbGcpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiVXNlckluZm9TZXJ2aWNlLl9nZXRDbGFpbXNGcm9tSnd0OiBObyBraWQgZm91bmQgaW4gaWRfdG9rZW4gYW5kIG1vcmUgdGhhbiBvbmUga2V5IGZvdW5kIGluIG1ldGFkYXRhXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGtpZCBmb3VuZCBpbiBpZF90b2tlbiBhbmQgbW9yZSB0aGFuIG9uZSBrZXkgZm91bmQgaW4gbWV0YWRhdGFcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2lkIGlzIG1hbmRhdG9yeSBvbmx5IHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGtleXMgaW4gdGhlIHJlZmVyZW5jZWQgSldLIFNldCBkb2N1bWVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGh0dHA6Ly9vcGVuaWQubmV0L3NwZWNzL29wZW5pZC1jb25uZWN0LWNvcmUtMV8wLmh0bWwjU2lnbmluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0ga2V5c1swXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0ga2V5cy5maWx0ZXIoa2V5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXkua2lkID09PSBraWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFrZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiVXNlckluZm9TZXJ2aWNlLl9nZXRDbGFpbXNGcm9tSnd0OiBObyBrZXkgbWF0Y2hpbmcga2lkIG9yIGFsZyBmb3VuZCBpbiBzaWduaW5nIGtleXNcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBrZXkgbWF0Y2hpbmcga2lkIG9yIGFsZyBmb3VuZCBpbiBzaWduaW5nIGtleXNcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGF1ZGllbmNlID0gdGhpcy5fc2V0dGluZ3MuY2xpZW50X2lkO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2xvY2tTa2V3SW5TZWNvbmRzID0gdGhpcy5fc2V0dGluZ3MuY2xvY2tTa2V3O1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJJbmZvU2VydmljZS5fZ2V0Q2xhaW1zRnJvbUp3dDogVmFsaWRhaW5nIEpXVDsgdXNpbmcgY2xvY2sgc2tldyAoaW4gc2Vjb25kcykgb2Y6IFwiLCBjbG9ja1NrZXdJblNlY29uZHMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fam9zZVV0aWwudmFsaWRhdGVKd3QocmVxLnJlc3BvbnNlVGV4dCwga2V5LCBpc3N1ZXIsIGF1ZGllbmNlLCBjbG9ja1NrZXdJblNlY29uZHMsIHVuZGVmaW5lZCwgdHJ1ZSkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJJbmZvU2VydmljZS5fZ2V0Q2xhaW1zRnJvbUp3dDogSldUIHZhbGlkYXRpb24gc3VjY2Vzc2Z1bFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGp3dC5wYXlsb2FkO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlVzZXJJbmZvU2VydmljZS5fZ2V0Q2xhaW1zRnJvbUp3dDogRXJyb3IgcGFyc2luZyBKV1QgcmVzcG9uc2VcIiwgZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgcmVqZWN0KGUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9maWx0ZXJCeUFsZyhrZXlzLCBhbGcpIHtcclxuICAgICAgICB2YXIga3R5ID0gbnVsbDtcclxuICAgICAgICBpZiAoYWxnLnN0YXJ0c1dpdGgoXCJSU1wiKSkge1xyXG4gICAgICAgICAgICBrdHkgPSBcIlJTQVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChhbGcuc3RhcnRzV2l0aChcIlBTXCIpKSB7XHJcbiAgICAgICAgICAgIGt0eSA9IFwiUFNcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYWxnLnN0YXJ0c1dpdGgoXCJFU1wiKSkge1xyXG4gICAgICAgICAgICBrdHkgPSBcIkVDXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJVc2VySW5mb1NlcnZpY2UuX2ZpbHRlckJ5QWxnOiBhbGcgbm90IHN1cHBvcnRlZDogXCIsIGFsZyk7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJJbmZvU2VydmljZS5fZmlsdGVyQnlBbGc6IExvb2tpbmcgZm9yIGtleXMgdGhhdCBtYXRjaCBrdHk6IFwiLCBrdHkpO1xyXG5cclxuICAgICAgICBrZXlzID0ga2V5cy5maWx0ZXIoa2V5ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGtleS5rdHkgPT09IGt0eTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlckluZm9TZXJ2aWNlLl9maWx0ZXJCeUFsZzogTnVtYmVyIG9mIGtleXMgdGhhdCBtYXRjaCBrdHk6IFwiLCBrdHksIGtleXMubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGtleXM7XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5pbXBvcnQgeyBPaWRjQ2xpZW50IH0gZnJvbSAnLi9PaWRjQ2xpZW50LmpzJztcclxuaW1wb3J0IHsgVXNlck1hbmFnZXJTZXR0aW5ncyB9IGZyb20gJy4vVXNlck1hbmFnZXJTZXR0aW5ncy5qcyc7XHJcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuL1VzZXIuanMnO1xyXG5pbXBvcnQgeyBVc2VyTWFuYWdlckV2ZW50cyB9IGZyb20gJy4vVXNlck1hbmFnZXJFdmVudHMuanMnO1xyXG5pbXBvcnQgeyBTaWxlbnRSZW5ld1NlcnZpY2UgfSBmcm9tICcuL1NpbGVudFJlbmV3U2VydmljZS5qcyc7XHJcbmltcG9ydCB7IFNlc3Npb25Nb25pdG9yIH0gZnJvbSAnLi9TZXNzaW9uTW9uaXRvci5qcyc7XHJcbmltcG9ydCB7IFNpZ25pblJlcXVlc3QgfSBmcm9tIFwiLi9TaWduaW5SZXF1ZXN0XCI7XHJcbmltcG9ydCB7IFRva2VuUmV2b2NhdGlvbkNsaWVudCB9IGZyb20gJy4vVG9rZW5SZXZvY2F0aW9uQ2xpZW50LmpzJztcclxuaW1wb3J0IHsgVG9rZW5DbGllbnQgfSBmcm9tICcuL1Rva2VuQ2xpZW50LmpzJztcclxuaW1wb3J0IHsgSm9zZVV0aWwgfSBmcm9tICcuL0pvc2VVdGlsLmpzJztcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgVXNlck1hbmFnZXIgZXh0ZW5kcyBPaWRjQ2xpZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzID0ge30sXHJcbiAgICAgICAgU2lsZW50UmVuZXdTZXJ2aWNlQ3RvciA9IFNpbGVudFJlbmV3U2VydmljZSxcclxuICAgICAgICBTZXNzaW9uTW9uaXRvckN0b3IgPSBTZXNzaW9uTW9uaXRvcixcclxuICAgICAgICBUb2tlblJldm9jYXRpb25DbGllbnRDdG9yID0gVG9rZW5SZXZvY2F0aW9uQ2xpZW50LFxyXG4gICAgICAgIFRva2VuQ2xpZW50Q3RvciA9IFRva2VuQ2xpZW50LFxyXG4gICAgICAgIGpvc2VVdGlsID0gSm9zZVV0aWxcclxuICAgICkge1xyXG5cclxuICAgICAgICBpZiAoIShzZXR0aW5ncyBpbnN0YW5jZW9mIFVzZXJNYW5hZ2VyU2V0dGluZ3MpKSB7XHJcbiAgICAgICAgICAgIHNldHRpbmdzID0gbmV3IFVzZXJNYW5hZ2VyU2V0dGluZ3Moc2V0dGluZ3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdXBlcihzZXR0aW5ncyk7XHJcblxyXG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBVc2VyTWFuYWdlckV2ZW50cyhzZXR0aW5ncyk7XHJcbiAgICAgICAgdGhpcy5fc2lsZW50UmVuZXdTZXJ2aWNlID0gbmV3IFNpbGVudFJlbmV3U2VydmljZUN0b3IodGhpcyk7XHJcblxyXG4gICAgICAgIC8vIG9yZGVyIGlzIGltcG9ydGFudCBmb3IgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOyB0aGVzZSBzZXJ2aWNlcyBkZXBlbmQgdXBvbiB0aGUgZXZlbnRzLlxyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmF1dG9tYXRpY1NpbGVudFJlbmV3KSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLmN0b3I6IGF1dG9tYXRpY1NpbGVudFJlbmV3IGlzIGNvbmZpZ3VyZWQsIHNldHRpbmcgdXAgc2lsZW50IHJlbmV3XCIpO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0U2lsZW50UmVuZXcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLm1vbml0b3JTZXNzaW9uKSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLmN0b3I6IG1vbml0b3JTZXNzaW9uIGlzIGNvbmZpZ3VyZWQsIHNldHRpbmcgdXAgc2Vzc2lvbiBtb25pdG9yXCIpO1xyXG4gICAgICAgICAgICB0aGlzLl9zZXNzaW9uTW9uaXRvciA9IG5ldyBTZXNzaW9uTW9uaXRvckN0b3IodGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl90b2tlblJldm9jYXRpb25DbGllbnQgPSBuZXcgVG9rZW5SZXZvY2F0aW9uQ2xpZW50Q3Rvcih0aGlzLl9zZXR0aW5ncyk7XHJcbiAgICAgICAgdGhpcy5fdG9rZW5DbGllbnQgPSBuZXcgVG9rZW5DbGllbnRDdG9yKHRoaXMuX3NldHRpbmdzKTtcclxuICAgICAgICB0aGlzLl9qb3NlVXRpbCA9IGpvc2VVdGlsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBfcmVkaXJlY3ROYXZpZ2F0b3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MucmVkaXJlY3ROYXZpZ2F0b3I7XHJcbiAgICB9XHJcbiAgICBnZXQgX3BvcHVwTmF2aWdhdG9yKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnBvcHVwTmF2aWdhdG9yO1xyXG4gICAgfVxyXG4gICAgZ2V0IF9pZnJhbWVOYXZpZ2F0b3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MuaWZyYW1lTmF2aWdhdG9yO1xyXG4gICAgfVxyXG4gICAgZ2V0IF91c2VyU3RvcmUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MudXNlclN0b3JlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBldmVudHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50cztcclxuICAgIH1cclxuXHJcbiAgICBnZXRVc2VyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkVXNlcigpLnRoZW4odXNlciA9PiB7XHJcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLmdldFVzZXI6IHVzZXIgbG9hZGVkXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cy5sb2FkKHVzZXIsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdXNlcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuZ2V0VXNlcjogdXNlciBub3QgZm91bmQgaW4gc3RvcmFnZVwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlVXNlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZVVzZXIobnVsbCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIucmVtb3ZlVXNlcjogdXNlciByZW1vdmVkIGZyb20gc3RvcmFnZVwiKTtcclxuICAgICAgICAgICAgdGhpcy5fZXZlbnRzLnVubG9hZCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNpZ25pblJlZGlyZWN0KGFyZ3MgPSB7fSkge1xyXG4gICAgICAgIGFyZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBhcmdzKTtcclxuXHJcbiAgICAgICAgYXJncy5yZXF1ZXN0X3R5cGUgPSBcInNpOnJcIjtcclxuICAgICAgICBsZXQgbmF2UGFyYW1zID0ge1xyXG4gICAgICAgICAgICB1c2VSZXBsYWNlVG9OYXZpZ2F0ZSA6IGFyZ3MudXNlUmVwbGFjZVRvTmF2aWdhdGVcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduaW5TdGFydChhcmdzLCB0aGlzLl9yZWRpcmVjdE5hdmlnYXRvciwgbmF2UGFyYW1zKS50aGVuKCgpPT57XHJcbiAgICAgICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuc2lnbmluUmVkaXJlY3Q6IHN1Y2Nlc3NmdWxcIik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBzaWduaW5SZWRpcmVjdENhbGxiYWNrKHVybCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduaW5FbmQodXJsIHx8IHRoaXMuX3JlZGlyZWN0TmF2aWdhdG9yLnVybCkudGhlbih1c2VyID0+IHtcclxuICAgICAgICAgICAgaWYgKHVzZXIucHJvZmlsZSAmJiB1c2VyLnByb2ZpbGUuc3ViKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLnNpZ25pblJlZGlyZWN0Q2FsbGJhY2s6IHN1Y2Nlc3NmdWwsIHNpZ25lZCBpbiBzdWI6IFwiLCB1c2VyLnByb2ZpbGUuc3ViKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuc2lnbmluUmVkaXJlY3RDYWxsYmFjazogbm8gc3ViXCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdXNlcjtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzaWduaW5Qb3B1cChhcmdzID0ge30pIHtcclxuICAgICAgICBhcmdzID0gT2JqZWN0LmFzc2lnbih7fSwgYXJncyk7XHJcblxyXG4gICAgICAgIGFyZ3MucmVxdWVzdF90eXBlID0gXCJzaTpwXCI7XHJcbiAgICAgICAgbGV0IHVybCA9IGFyZ3MucmVkaXJlY3RfdXJpIHx8IHRoaXMuc2V0dGluZ3MucG9wdXBfcmVkaXJlY3RfdXJpIHx8IHRoaXMuc2V0dGluZ3MucmVkaXJlY3RfdXJpO1xyXG4gICAgICAgIGlmICghdXJsKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlVzZXJNYW5hZ2VyLnNpZ25pblBvcHVwOiBObyBwb3B1cF9yZWRpcmVjdF91cmkgb3IgcmVkaXJlY3RfdXJpIGNvbmZpZ3VyZWRcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBwb3B1cF9yZWRpcmVjdF91cmkgb3IgcmVkaXJlY3RfdXJpIGNvbmZpZ3VyZWRcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXJncy5yZWRpcmVjdF91cmkgPSB1cmw7XHJcbiAgICAgICAgYXJncy5kaXNwbGF5ID0gXCJwb3B1cFwiO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluKGFyZ3MsIHRoaXMuX3BvcHVwTmF2aWdhdG9yLCB7XHJcbiAgICAgICAgICAgIHN0YXJ0VXJsOiB1cmwsXHJcbiAgICAgICAgICAgIHBvcHVwV2luZG93RmVhdHVyZXM6IGFyZ3MucG9wdXBXaW5kb3dGZWF0dXJlcyB8fCB0aGlzLnNldHRpbmdzLnBvcHVwV2luZG93RmVhdHVyZXMsXHJcbiAgICAgICAgICAgIHBvcHVwV2luZG93VGFyZ2V0OiBhcmdzLnBvcHVwV2luZG93VGFyZ2V0IHx8IHRoaXMuc2V0dGluZ3MucG9wdXBXaW5kb3dUYXJnZXRcclxuICAgICAgICB9KS50aGVuKHVzZXIgPT4ge1xyXG4gICAgICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXIucHJvZmlsZSAmJiB1c2VyLnByb2ZpbGUuc3ViKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlci5zaWduaW5Qb3B1cDogc2lnbmluUG9wdXAgc3VjY2Vzc2Z1bCwgc2lnbmVkIGluIHN1YjogXCIsIHVzZXIucHJvZmlsZS5zdWIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlci5zaWduaW5Qb3B1cDogbm8gc3ViXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdXNlcjtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHNpZ25pblBvcHVwQ2FsbGJhY2sodXJsKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pbkNhbGxiYWNrKHVybCwgdGhpcy5fcG9wdXBOYXZpZ2F0b3IpLnRoZW4odXNlciA9PiB7XHJcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXNlci5wcm9maWxlICYmIHVzZXIucHJvZmlsZS5zdWIpIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLnNpZ25pblBvcHVwQ2FsbGJhY2s6IHN1Y2Nlc3NmdWwsIHNpZ25lZCBpbiBzdWI6IFwiLCB1c2VyLnByb2ZpbGUuc3ViKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuc2lnbmluUG9wdXBDYWxsYmFjazogbm8gc3ViXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdXNlcjtcclxuICAgICAgICB9KS5jYXRjaChlcnI9PntcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiVXNlck1hbmFnZXIuc2lnbmluUG9wdXBDYWxsYmFjayBlcnJvcjogXCIgKyBlcnIgJiYgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNpZ25pblNpbGVudChhcmdzID0ge30pIHtcclxuICAgICAgICBhcmdzID0gT2JqZWN0LmFzc2lnbih7fSwgYXJncyk7XHJcblxyXG4gICAgICAgIC8vIGZpcnN0IGRldGVybWluZSBpZiB3ZSBoYXZlIGEgcmVmcmVzaCB0b2tlbiwgb3IgbmVlZCB0byB1c2UgaWZyYW1lXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRVc2VyKCkudGhlbih1c2VyID0+IHtcclxuICAgICAgICAgICAgaWYgKHVzZXIgJiYgdXNlci5yZWZyZXNoX3Rva2VuKSB7XHJcbiAgICAgICAgICAgICAgICBhcmdzLnJlZnJlc2hfdG9rZW4gPSB1c2VyLnJlZnJlc2hfdG9rZW47XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdXNlUmVmcmVzaFRva2VuKGFyZ3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXJncy5yZXF1ZXN0X3R5cGUgPSBcInNpOnNcIjtcclxuICAgICAgICAgICAgICAgIGFyZ3MuaWRfdG9rZW5faGludCA9IGFyZ3MuaWRfdG9rZW5faGludCB8fCAodGhpcy5zZXR0aW5ncy5pbmNsdWRlSWRUb2tlbkluU2lsZW50UmVuZXcgJiYgdXNlciAmJiB1c2VyLmlkX3Rva2VuKTtcclxuICAgICAgICAgICAgICAgIGlmICh1c2VyICYmIHRoaXMuX3NldHRpbmdzLnZhbGlkYXRlU3ViT25TaWxlbnRSZW5ldykge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLnNpZ25pblNpbGVudCwgc3ViamVjdCBwcmlvciB0byBzaWxlbnQgcmVuZXc6IFwiLCB1c2VyLnByb2ZpbGUuc3ViKTtcclxuICAgICAgICAgICAgICAgICAgICBhcmdzLmN1cnJlbnRfc3ViID0gdXNlci5wcm9maWxlLnN1YjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zaWduaW5TaWxlbnRJZnJhbWUoYXJncyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBfdXNlUmVmcmVzaFRva2VuKGFyZ3MgPSB7fSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl90b2tlbkNsaWVudC5leGNoYW5nZVJlZnJlc2hUb2tlbihhcmdzKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJVc2VyTWFuYWdlci5fdXNlUmVmcmVzaFRva2VuOiBObyByZXNwb25zZSByZXR1cm5lZCBmcm9tIHRva2VuIGVuZHBvaW50XCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFwiTm8gcmVzcG9uc2UgcmV0dXJuZWQgZnJvbSB0b2tlbiBlbmRwb2ludFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXJlc3VsdC5hY2Nlc3NfdG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIlVzZXJNYW5hZ2VyLl91c2VSZWZyZXNoVG9rZW46IE5vIGFjY2VzcyB0b2tlbiByZXR1cm5lZCBmcm9tIHRva2VuIGVuZHBvaW50XCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFwiTm8gYWNjZXNzIHRva2VuIHJldHVybmVkIGZyb20gdG9rZW4gZW5kcG9pbnRcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2FkVXNlcigpLnRoZW4odXNlciA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpZFRva2VuVmFsaWRhdGlvbiA9IFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaWRfdG9rZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWRUb2tlblZhbGlkYXRpb24gPSB0aGlzLl92YWxpZGF0ZUlkVG9rZW5Gcm9tVG9rZW5SZWZyZXNoVG9rZW4odXNlci5wcm9maWxlLCByZXN1bHQuaWRfdG9rZW4pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlkVG9rZW5WYWxpZGF0aW9uLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5fdXNlUmVmcmVzaFRva2VuOiByZWZyZXNoIHRva2VuIHJlc3BvbnNlIHN1Y2Nlc3NcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuaWRfdG9rZW4gPSByZXN1bHQuaWRfdG9rZW4gfHwgdXNlci5pZF90b2tlbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5hY2Nlc3NfdG9rZW4gPSByZXN1bHQuYWNjZXNzX3Rva2VuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnJlZnJlc2hfdG9rZW4gPSByZXN1bHQucmVmcmVzaF90b2tlbiB8fCB1c2VyLnJlZnJlc2hfdG9rZW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuZXhwaXJlc19pbiA9IHJlc3VsdC5leHBpcmVzX2luO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmVVc2VyKHVzZXIpLnRoZW4oKCk9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cy5sb2FkKHVzZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF92YWxpZGF0ZUlkVG9rZW5Gcm9tVG9rZW5SZWZyZXNoVG9rZW4ocHJvZmlsZSwgaWRfdG9rZW4pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlLmdldElzc3VlcigpLnRoZW4oaXNzdWVyID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MuZ2V0RXBvY2hUaW1lKCkudGhlbihub3cgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2pvc2VVdGlsLnZhbGlkYXRlSnd0QXR0cmlidXRlcyhpZF90b2tlbiwgaXNzdWVyLCB0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQsIHRoaXMuX3NldHRpbmdzLmNsb2NrU2tldywgbm93KS50aGVuKHBheWxvYWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcGF5bG9hZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJVc2VyTWFuYWdlci5fdmFsaWRhdGVJZFRva2VuRnJvbVRva2VuUmVmcmVzaFRva2VuOiBGYWlsZWQgdG8gdmFsaWRhdGUgaWRfdG9rZW5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJGYWlsZWQgdG8gdmFsaWRhdGUgaWRfdG9rZW5cIikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAocGF5bG9hZC5zdWIgIT09IHByb2ZpbGUuc3ViKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIlVzZXJNYW5hZ2VyLl92YWxpZGF0ZUlkVG9rZW5Gcm9tVG9rZW5SZWZyZXNoVG9rZW46IHN1YiBpbiBpZF90b2tlbiBkb2VzIG5vdCBtYXRjaCBjdXJyZW50IHN1YlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcInN1YiBpbiBpZF90b2tlbiBkb2VzIG5vdCBtYXRjaCBjdXJyZW50IHN1YlwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkLmF1dGhfdGltZSAmJiBwYXlsb2FkLmF1dGhfdGltZSAhPT0gcHJvZmlsZS5hdXRoX3RpbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiVXNlck1hbmFnZXIuX3ZhbGlkYXRlSWRUb2tlbkZyb21Ub2tlblJlZnJlc2hUb2tlbjogYXV0aF90aW1lIGluIGlkX3Rva2VuIGRvZXMgbm90IG1hdGNoIG9yaWdpbmFsIGF1dGhfdGltZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImF1dGhfdGltZSBpbiBpZF90b2tlbiBkb2VzIG5vdCBtYXRjaCBvcmlnaW5hbCBhdXRoX3RpbWVcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAocGF5bG9hZC5henAgJiYgcGF5bG9hZC5henAgIT09IHByb2ZpbGUuYXpwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIlVzZXJNYW5hZ2VyLl92YWxpZGF0ZUlkVG9rZW5Gcm9tVG9rZW5SZWZyZXNoVG9rZW46IGF6cCBpbiBpZF90b2tlbiBkb2VzIG5vdCBtYXRjaCBvcmlnaW5hbCBhenBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJhenAgaW4gaWRfdG9rZW4gZG9lcyBub3QgbWF0Y2ggb3JpZ2luYWwgYXpwXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXlsb2FkLmF6cCAmJiBwcm9maWxlLmF6cCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJVc2VyTWFuYWdlci5fdmFsaWRhdGVJZFRva2VuRnJvbVRva2VuUmVmcmVzaFRva2VuOiBhenAgbm90IGluIGlkX3Rva2VuLCBidXQgcHJlc2VudCBpbiBvcmlnaW5hbCBpZF90b2tlblwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImF6cCBub3QgaW4gaWRfdG9rZW4sIGJ1dCBwcmVzZW50IGluIG9yaWdpbmFsIGlkX3Rva2VuXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIF9zaWduaW5TaWxlbnRJZnJhbWUoYXJncyA9IHt9KSB7XHJcbiAgICAgICAgbGV0IHVybCA9IGFyZ3MucmVkaXJlY3RfdXJpIHx8IHRoaXMuc2V0dGluZ3Muc2lsZW50X3JlZGlyZWN0X3VyaSB8fCB0aGlzLnNldHRpbmdzLnJlZGlyZWN0X3VyaTtcclxuICAgICAgICBpZiAoIXVybCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJVc2VyTWFuYWdlci5zaWduaW5TaWxlbnQ6IE5vIHNpbGVudF9yZWRpcmVjdF91cmkgY29uZmlndXJlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIHNpbGVudF9yZWRpcmVjdF91cmkgY29uZmlndXJlZFwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhcmdzLnJlZGlyZWN0X3VyaSA9IHVybDtcclxuICAgICAgICBhcmdzLnByb21wdCA9IGFyZ3MucHJvbXB0IHx8IFwibm9uZVwiO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluKGFyZ3MsIHRoaXMuX2lmcmFtZU5hdmlnYXRvciwge1xyXG4gICAgICAgICAgICBzdGFydFVybDogdXJsLFxyXG4gICAgICAgICAgICBzaWxlbnRSZXF1ZXN0VGltZW91dDogYXJncy5zaWxlbnRSZXF1ZXN0VGltZW91dCB8fCB0aGlzLnNldHRpbmdzLnNpbGVudFJlcXVlc3RUaW1lb3V0XHJcbiAgICAgICAgfSkudGhlbih1c2VyID0+IHtcclxuICAgICAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgICAgIGlmICh1c2VyLnByb2ZpbGUgJiYgdXNlci5wcm9maWxlLnN1Yikge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuc2lnbmluU2lsZW50OiBzdWNjZXNzZnVsLCBzaWduZWQgaW4gc3ViOiBcIiwgdXNlci5wcm9maWxlLnN1Yik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLnNpZ25pblNpbGVudDogbm8gc3ViXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdXNlcjtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzaWduaW5TaWxlbnRDYWxsYmFjayh1cmwpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluQ2FsbGJhY2sodXJsLCB0aGlzLl9pZnJhbWVOYXZpZ2F0b3IpLnRoZW4odXNlciA9PiB7XHJcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXNlci5wcm9maWxlICYmIHVzZXIucHJvZmlsZS5zdWIpIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLnNpZ25pblNpbGVudENhbGxiYWNrOiBzdWNjZXNzZnVsLCBzaWduZWQgaW4gc3ViOiBcIiwgdXNlci5wcm9maWxlLnN1Yik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLnNpZ25pblNpbGVudENhbGxiYWNrOiBubyBzdWJcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB1c2VyO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNpZ25pbkNhbGxiYWNrKHVybCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRTaWduaW5SZXNwb25zZVN0YXRlKHVybCkudGhlbigoe3N0YXRlLCByZXNwb25zZX0pID0+IHtcclxuICAgICAgICAgICAgaWYgKHN0YXRlLnJlcXVlc3RfdHlwZSA9PT0gXCJzaTpyXCIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNpZ25pblJlZGlyZWN0Q2FsbGJhY2sodXJsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc3RhdGUucmVxdWVzdF90eXBlID09PSBcInNpOnBcIikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2lnbmluUG9wdXBDYWxsYmFjayh1cmwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzdGF0ZS5yZXF1ZXN0X3R5cGUgPT09IFwic2k6c1wiKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zaWduaW5TaWxlbnRDYWxsYmFjayh1cmwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJpbnZhbGlkIHJlc3BvbnNlX3R5cGUgaW4gc3RhdGVcIikpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNpZ25vdXRDYWxsYmFjayh1cmwsIGtlZXBPcGVuKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZFNpZ25vdXRSZXNwb25zZVN0YXRlKHVybCkudGhlbigoe3N0YXRlLCByZXNwb25zZX0pID0+IHtcclxuICAgICAgICAgICAgaWYgKHN0YXRlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUucmVxdWVzdF90eXBlID09PSBcInNvOnJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNpZ25vdXRSZWRpcmVjdENhbGxiYWNrKHVybCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUucmVxdWVzdF90eXBlID09PSBcInNvOnBcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNpZ25vdXRQb3B1cENhbGxiYWNrKHVybCwga2VlcE9wZW4pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImludmFsaWQgcmVzcG9uc2VfdHlwZSBpbiBzdGF0ZVwiKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHF1ZXJ5U2Vzc2lvblN0YXR1cyhhcmdzID0ge30pIHtcclxuICAgICAgICBhcmdzID0gT2JqZWN0LmFzc2lnbih7fSwgYXJncyk7XHJcblxyXG4gICAgICAgIGFyZ3MucmVxdWVzdF90eXBlID0gXCJzaTpzXCI7IC8vIHRoaXMgYWN0cyBsaWtlIGEgc2lnbmluIHNpbGVudFxyXG4gICAgICAgIGxldCB1cmwgPSBhcmdzLnJlZGlyZWN0X3VyaSB8fCB0aGlzLnNldHRpbmdzLnNpbGVudF9yZWRpcmVjdF91cmkgfHwgdGhpcy5zZXR0aW5ncy5yZWRpcmVjdF91cmk7XHJcbiAgICAgICAgaWYgKCF1cmwpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiVXNlck1hbmFnZXIucXVlcnlTZXNzaW9uU3RhdHVzOiBObyBzaWxlbnRfcmVkaXJlY3RfdXJpIGNvbmZpZ3VyZWRcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBzaWxlbnRfcmVkaXJlY3RfdXJpIGNvbmZpZ3VyZWRcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXJncy5yZWRpcmVjdF91cmkgPSB1cmw7XHJcbiAgICAgICAgYXJncy5wcm9tcHQgPSBcIm5vbmVcIjtcclxuICAgICAgICBhcmdzLnJlc3BvbnNlX3R5cGUgPSBhcmdzLnJlc3BvbnNlX3R5cGUgfHwgdGhpcy5zZXR0aW5ncy5xdWVyeV9zdGF0dXNfcmVzcG9uc2VfdHlwZTtcclxuICAgICAgICBhcmdzLnNjb3BlID0gYXJncy5zY29wZSB8fCBcIm9wZW5pZFwiO1xyXG4gICAgICAgIGFyZ3Muc2tpcFVzZXJJbmZvID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pblN0YXJ0KGFyZ3MsIHRoaXMuX2lmcmFtZU5hdmlnYXRvciwge1xyXG4gICAgICAgICAgICBzdGFydFVybDogdXJsLFxyXG4gICAgICAgICAgICBzaWxlbnRSZXF1ZXN0VGltZW91dDogYXJncy5zaWxlbnRSZXF1ZXN0VGltZW91dCB8fCB0aGlzLnNldHRpbmdzLnNpbGVudFJlcXVlc3RUaW1lb3V0XHJcbiAgICAgICAgfSkudGhlbihuYXZSZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NTaWduaW5SZXNwb25zZShuYXZSZXNwb25zZS51cmwpLnRoZW4oc2lnbmluUmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIucXVlcnlTZXNzaW9uU3RhdHVzOiBnb3Qgc2lnbmluIHJlc3BvbnNlXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzaWduaW5SZXNwb25zZS5zZXNzaW9uX3N0YXRlICYmIHNpZ25pblJlc3BvbnNlLnByb2ZpbGUuc3ViKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlci5xdWVyeVNlc3Npb25TdGF0dXM6IHF1ZXJ5U2Vzc2lvblN0YXR1cyBzdWNjZXNzIGZvciBzdWI6IFwiLCAgc2lnbmluUmVzcG9uc2UucHJvZmlsZS5zdWIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25fc3RhdGU6IHNpZ25pblJlc3BvbnNlLnNlc3Npb25fc3RhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Yjogc2lnbmluUmVzcG9uc2UucHJvZmlsZS5zdWIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZDogc2lnbmluUmVzcG9uc2UucHJvZmlsZS5zaWRcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJxdWVyeVNlc3Npb25TdGF0dXMgc3VjY2Vzc2Z1bCwgdXNlciBub3QgYXV0aGVudGljYXRlZFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyLnNlc3Npb25fc3RhdGUgJiYgdGhpcy5zZXR0aW5ncy5tb25pdG9yQW5vbnltb3VzU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIubWVzc2FnZSA9PSBcImxvZ2luX3JlcXVpcmVkXCIgfHwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVyci5tZXNzYWdlID09IFwiY29uc2VudF9yZXF1aXJlZFwiIHx8IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIubWVzc2FnZSA9PSBcImludGVyYWN0aW9uX3JlcXVpcmVkXCIgfHwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVyci5tZXNzYWdlID09IFwiYWNjb3VudF9zZWxlY3Rpb25fcmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLnF1ZXJ5U2Vzc2lvblN0YXR1czogcXVlcnlTZXNzaW9uU3RhdHVzIHN1Y2Nlc3MgZm9yIGFub255bW91cyB1c2VyXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbl9zdGF0ZTogZXJyLnNlc3Npb25fc3RhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBfc2lnbmluKGFyZ3MsIG5hdmlnYXRvciwgbmF2aWdhdG9yUGFyYW1zID0ge30pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluU3RhcnQoYXJncywgbmF2aWdhdG9yLCBuYXZpZ2F0b3JQYXJhbXMpLnRoZW4obmF2UmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluRW5kKG5hdlJlc3BvbnNlLnVybCwgYXJncyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBfc2lnbmluU3RhcnQoYXJncywgbmF2aWdhdG9yLCBuYXZpZ2F0b3JQYXJhbXMgPSB7fSkge1xyXG5cclxuICAgICAgICByZXR1cm4gbmF2aWdhdG9yLnByZXBhcmUobmF2aWdhdG9yUGFyYW1zKS50aGVuKGhhbmRsZSA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLl9zaWduaW5TdGFydDogZ290IG5hdmlnYXRvciB3aW5kb3cgaGFuZGxlXCIpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU2lnbmluUmVxdWVzdChhcmdzKS50aGVuKHNpZ25pblJlcXVlc3QgPT4ge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuX3NpZ25pblN0YXJ0OiBnb3Qgc2lnbmluIHJlcXVlc3RcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgbmF2aWdhdG9yUGFyYW1zLnVybCA9IHNpZ25pblJlcXVlc3QudXJsO1xyXG4gICAgICAgICAgICAgICAgbmF2aWdhdG9yUGFyYW1zLmlkID0gc2lnbmluUmVxdWVzdC5zdGF0ZS5pZDtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlLm5hdmlnYXRlKG5hdmlnYXRvclBhcmFtcyk7XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLmNsb3NlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuX3NpZ25pblN0YXJ0OiBFcnJvciBhZnRlciBwcmVwYXJpbmcgbmF2aWdhdG9yLCBjbG9zaW5nIG5hdmlnYXRvciB3aW5kb3dcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgX3NpZ25pbkVuZCh1cmwsIGFyZ3MgPSB7fSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NTaWduaW5SZXNwb25zZSh1cmwpLnRoZW4oc2lnbmluUmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5fc2lnbmluRW5kOiBnb3Qgc2lnbmluIHJlc3BvbnNlXCIpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHVzZXIgPSBuZXcgVXNlcihzaWduaW5SZXNwb25zZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYXJncy5jdXJyZW50X3N1Yikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFyZ3MuY3VycmVudF9zdWIgIT09IHVzZXIucHJvZmlsZS5zdWIpIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5fc2lnbmluRW5kOiBjdXJyZW50IHVzZXIgZG9lcyBub3QgbWF0Y2ggdXNlciByZXR1cm5lZCBmcm9tIHNpZ25pbi4gc3ViIGZyb20gc2lnbmluOiBcIiwgdXNlci5wcm9maWxlLnN1Yik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImxvZ2luX3JlcXVpcmVkXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLl9zaWduaW5FbmQ6IGN1cnJlbnQgdXNlciBtYXRjaGVzIHVzZXIgcmV0dXJuZWQgZnJvbSBzaWduaW5cIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0b3JlVXNlcih1c2VyKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLl9zaWduaW5FbmQ6IHVzZXIgc3RvcmVkXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cy5sb2FkKHVzZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB1c2VyO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIF9zaWduaW5DYWxsYmFjayh1cmwsIG5hdmlnYXRvcikge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLl9zaWduaW5DYWxsYmFja1wiKTtcclxuICAgICAgICBsZXQgdXNlUXVlcnkgPSB0aGlzLl9zZXR0aW5ncy5yZXNwb25zZV9tb2RlID09PSBcInF1ZXJ5XCIgfHwgKCF0aGlzLl9zZXR0aW5ncy5yZXNwb25zZV9tb2RlICYmIFNpZ25pblJlcXVlc3QuaXNDb2RlKHRoaXMuX3NldHRpbmdzLnJlc3BvbnNlX3R5cGUpKTtcclxuICAgICAgICBsZXQgZGVsaW1pdGVyID0gdXNlUXVlcnkgPyBcIj9cIiA6IFwiI1wiO1xyXG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IuY2FsbGJhY2sodXJsLCB1bmRlZmluZWQsIGRlbGltaXRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgc2lnbm91dFJlZGlyZWN0KGFyZ3MgPSB7fSkge1xyXG4gICAgICAgIGFyZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBhcmdzKTtcclxuXHJcbiAgICAgICAgYXJncy5yZXF1ZXN0X3R5cGUgPSBcInNvOnJcIjtcclxuICAgICAgICBsZXQgcG9zdExvZ291dFJlZGlyZWN0VXJpID0gYXJncy5wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgfHwgdGhpcy5zZXR0aW5ncy5wb3N0X2xvZ291dF9yZWRpcmVjdF91cmk7XHJcbiAgICAgICAgaWYgKHBvc3RMb2dvdXRSZWRpcmVjdFVyaSl7XHJcbiAgICAgICAgICAgIGFyZ3MucG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpID0gcG9zdExvZ291dFJlZGlyZWN0VXJpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgbmF2UGFyYW1zID0ge1xyXG4gICAgICAgICAgICB1c2VSZXBsYWNlVG9OYXZpZ2F0ZSA6IGFyZ3MudXNlUmVwbGFjZVRvTmF2aWdhdGVcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0U3RhcnQoYXJncywgdGhpcy5fcmVkaXJlY3ROYXZpZ2F0b3IsIG5hdlBhcmFtcykudGhlbigoKT0+e1xyXG4gICAgICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLnNpZ25vdXRSZWRpcmVjdDogc3VjY2Vzc2Z1bFwiKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHNpZ25vdXRSZWRpcmVjdENhbGxiYWNrKHVybCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0RW5kKHVybCB8fCB0aGlzLl9yZWRpcmVjdE5hdmlnYXRvci51cmwpLnRoZW4ocmVzcG9uc2U9PntcclxuICAgICAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlci5zaWdub3V0UmVkaXJlY3RDYWxsYmFjazogc3VjY2Vzc2Z1bFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNpZ25vdXRQb3B1cChhcmdzID0ge30pIHtcclxuICAgICAgICBhcmdzID0gT2JqZWN0LmFzc2lnbih7fSwgYXJncyk7XHJcblxyXG4gICAgICAgIGFyZ3MucmVxdWVzdF90eXBlID0gXCJzbzpwXCI7XHJcbiAgICAgICAgbGV0IHVybCA9IGFyZ3MucG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpIHx8IHRoaXMuc2V0dGluZ3MucG9wdXBfcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpIHx8IHRoaXMuc2V0dGluZ3MucG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpO1xyXG4gICAgICAgIGFyZ3MucG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpID0gdXJsO1xyXG4gICAgICAgIGFyZ3MuZGlzcGxheSA9IFwicG9wdXBcIjtcclxuICAgICAgICBpZiAoYXJncy5wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkpe1xyXG4gICAgICAgICAgICAvLyB3ZSdyZSBwdXR0aW5nIGEgZHVtbXkgZW50cnkgaW4gaGVyZSBiZWNhdXNlIHdlXHJcbiAgICAgICAgICAgIC8vIG5lZWQgYSB1bmlxdWUgaWQgZnJvbSB0aGUgc3RhdGUgZm9yIG5vdGlmaWNhdGlvblxyXG4gICAgICAgICAgICAvLyB0byB0aGUgcGFyZW50IHdpbmRvdywgd2hpY2ggaXMgbmVjZXNzYXJ5IGlmIHdlXHJcbiAgICAgICAgICAgIC8vIHBsYW4gdG8gcmV0dXJuIGJhY2sgdG8gdGhlIGNsaWVudCBhZnRlciBzaWdub3V0XHJcbiAgICAgICAgICAgIC8vIGFuZCBzbyB3ZSBjYW4gY2xvc2UgdGhlIHBvcHVwIGFmdGVyIHNpZ25vdXRcclxuICAgICAgICAgICAgYXJncy5zdGF0ZSA9IGFyZ3Muc3RhdGUgfHwge307XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbm91dChhcmdzLCB0aGlzLl9wb3B1cE5hdmlnYXRvciwge1xyXG4gICAgICAgICAgICBzdGFydFVybDogdXJsLFxyXG4gICAgICAgICAgICBwb3B1cFdpbmRvd0ZlYXR1cmVzOiBhcmdzLnBvcHVwV2luZG93RmVhdHVyZXMgfHwgdGhpcy5zZXR0aW5ncy5wb3B1cFdpbmRvd0ZlYXR1cmVzLFxyXG4gICAgICAgICAgICBwb3B1cFdpbmRvd1RhcmdldDogYXJncy5wb3B1cFdpbmRvd1RhcmdldCB8fCB0aGlzLnNldHRpbmdzLnBvcHVwV2luZG93VGFyZ2V0XHJcbiAgICAgICAgfSkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuc2lnbm91dFBvcHVwOiBzdWNjZXNzZnVsXCIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgc2lnbm91dFBvcHVwQ2FsbGJhY2sodXJsLCBrZWVwT3Blbikge1xyXG4gICAgICAgIGlmICh0eXBlb2Yoa2VlcE9wZW4pID09PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YodXJsKSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgICAgIGtlZXBPcGVuID0gdXJsO1xyXG4gICAgICAgICAgICB1cmwgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGRlbGltaXRlciA9ICc/JztcclxuICAgICAgICByZXR1cm4gdGhpcy5fcG9wdXBOYXZpZ2F0b3IuY2FsbGJhY2sodXJsLCBrZWVwT3BlbiwgZGVsaW1pdGVyKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlci5zaWdub3V0UG9wdXBDYWxsYmFjazogc3VjY2Vzc2Z1bFwiKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBfc2lnbm91dChhcmdzLCBuYXZpZ2F0b3IsIG5hdmlnYXRvclBhcmFtcyA9IHt9KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25vdXRTdGFydChhcmdzLCBuYXZpZ2F0b3IsIG5hdmlnYXRvclBhcmFtcykudGhlbihuYXZSZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0RW5kKG5hdlJlc3BvbnNlLnVybCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBfc2lnbm91dFN0YXJ0KGFyZ3MgPSB7fSwgbmF2aWdhdG9yLCBuYXZpZ2F0b3JQYXJhbXMgPSB7fSkge1xyXG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IucHJlcGFyZShuYXZpZ2F0b3JQYXJhbXMpLnRoZW4oaGFuZGxlID0+IHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuX3NpZ25vdXRTdGFydDogZ290IG5hdmlnYXRvciB3aW5kb3cgaGFuZGxlXCIpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRVc2VyKCkudGhlbih1c2VyID0+IHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLl9zaWdub3V0U3RhcnQ6IGxvYWRlZCBjdXJyZW50IHVzZXIgZnJvbSBzdG9yYWdlXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciByZXZva2VQcm9taXNlID0gdGhpcy5fc2V0dGluZ3MucmV2b2tlQWNjZXNzVG9rZW5PblNpZ25vdXQgPyB0aGlzLl9yZXZva2VJbnRlcm5hbCh1c2VyKSA6IFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldm9rZVByb21pc2UudGhlbigoKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZF90b2tlbiA9IGFyZ3MuaWRfdG9rZW5faGludCB8fCB1c2VyICYmIHVzZXIuaWRfdG9rZW47XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkX3Rva2VuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLl9zaWdub3V0U3RhcnQ6IFNldHRpbmcgaWRfdG9rZW4gaW50byBzaWdub3V0IHJlcXVlc3RcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuaWRfdG9rZW5faGludCA9IGlkX3Rva2VuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlVXNlcigpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5fc2lnbm91dFN0YXJ0OiB1c2VyIHJlbW92ZWQsIGNyZWF0aW5nIHNpZ25vdXQgcmVxdWVzdFwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNpZ25vdXRSZXF1ZXN0KGFyZ3MpLnRoZW4oc2lnbm91dFJlcXVlc3QgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuX3NpZ25vdXRTdGFydDogZ290IHNpZ25vdXQgcmVxdWVzdFwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3JQYXJhbXMudXJsID0gc2lnbm91dFJlcXVlc3QudXJsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpZ25vdXRSZXF1ZXN0LnN0YXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yUGFyYW1zLmlkID0gc2lnbm91dFJlcXVlc3Quc3RhdGUuaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlLm5hdmlnYXRlKG5hdmlnYXRvclBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLmNsb3NlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuX3NpZ25vdXRTdGFydDogRXJyb3IgYWZ0ZXIgcHJlcGFyaW5nIG5hdmlnYXRvciwgY2xvc2luZyBuYXZpZ2F0b3Igd2luZG93XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZS5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIF9zaWdub3V0RW5kKHVybCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NTaWdub3V0UmVzcG9uc2UodXJsKS50aGVuKHNpZ25vdXRSZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLl9zaWdub3V0RW5kOiBnb3Qgc2lnbm91dCByZXNwb25zZVwiKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBzaWdub3V0UmVzcG9uc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV2b2tlQWNjZXNzVG9rZW4oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRVc2VyKCkudGhlbih1c2VyID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jldm9rZUludGVybmFsKHVzZXIsIHRydWUpLnRoZW4oc3VjY2VzcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLnJldm9rZUFjY2Vzc1Rva2VuOiByZW1vdmluZyB0b2tlbiBwcm9wZXJ0aWVzIGZyb20gdXNlciBhbmQgcmUtc3RvcmluZ1wiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlci5hY2Nlc3NfdG9rZW4gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIHVzZXIucmVmcmVzaF90b2tlbiA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgdXNlci5leHBpcmVzX2F0ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB1c2VyLnRva2VuX3R5cGUgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdG9yZVVzZXIodXNlcikudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLnJldm9rZUFjY2Vzc1Rva2VuOiB1c2VyIHN0b3JlZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzLmxvYWQodXNlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pLnRoZW4oKCk9PntcclxuICAgICAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlci5yZXZva2VBY2Nlc3NUb2tlbjogYWNjZXNzIHRva2VuIHJldm9rZWQgc3VjY2Vzc2Z1bGx5XCIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9yZXZva2VJbnRlcm5hbCh1c2VyLCByZXF1aXJlZCkge1xyXG4gICAgICAgIGlmICh1c2VyKSB7XHJcbiAgICAgICAgICAgIHZhciBhY2Nlc3NfdG9rZW4gPSB1c2VyLmFjY2Vzc190b2tlbjtcclxuICAgICAgICAgICAgdmFyIHJlZnJlc2hfdG9rZW4gPSB1c2VyLnJlZnJlc2hfdG9rZW47XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV2b2tlQWNjZXNzVG9rZW5JbnRlcm5hbChhY2Nlc3NfdG9rZW4sIHJlcXVpcmVkKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oYXRTdWNjZXNzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV2b2tlUmVmcmVzaFRva2VuSW50ZXJuYWwocmVmcmVzaF90b2tlbiwgcmVxdWlyZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJ0U3VjY2VzcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF0U3VjY2VzcyAmJiAhcnRTdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIucmV2b2tlQWNjZXNzVG9rZW46IG5vIG5lZWQgdG8gcmV2b2tlIGR1ZSB0byBubyB0b2tlbihzKSwgb3IgSldUIGZvcm1hdFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0U3VjY2VzcyB8fCBydFN1Y2Nlc3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBfcmV2b2tlQWNjZXNzVG9rZW5JbnRlcm5hbChhY2Nlc3NfdG9rZW4sIHJlcXVpcmVkKSB7XHJcbiAgICAgICAgLy8gY2hlY2sgZm9yIEpXVCB2cy4gcmVmZXJlbmNlIHRva2VuXHJcbiAgICAgICAgaWYgKCFhY2Nlc3NfdG9rZW4gfHwgYWNjZXNzX3Rva2VuLmluZGV4T2YoJy4nKSA+PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rva2VuUmV2b2NhdGlvbkNsaWVudC5yZXZva2UoYWNjZXNzX3Rva2VuLCByZXF1aXJlZCkudGhlbigoKSA9PiB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBfcmV2b2tlUmVmcmVzaFRva2VuSW50ZXJuYWwocmVmcmVzaF90b2tlbiwgcmVxdWlyZWQpIHtcclxuICAgICAgICBpZiAoIXJlZnJlc2hfdG9rZW4pIHtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW5SZXZvY2F0aW9uQ2xpZW50LnJldm9rZShyZWZyZXNoX3Rva2VuLCByZXF1aXJlZCwgXCJyZWZyZXNoX3Rva2VuXCIpLnRoZW4oKCkgPT4gdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnRTaWxlbnRSZW5ldygpIHtcclxuICAgICAgICB0aGlzLl9zaWxlbnRSZW5ld1NlcnZpY2Uuc3RhcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdG9wU2lsZW50UmVuZXcoKSB7XHJcbiAgICAgICAgdGhpcy5fc2lsZW50UmVuZXdTZXJ2aWNlLnN0b3AoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgX3VzZXJTdG9yZUtleSgpIHtcclxuICAgICAgICByZXR1cm4gYHVzZXI6JHt0aGlzLnNldHRpbmdzLmF1dGhvcml0eX06JHt0aGlzLnNldHRpbmdzLmNsaWVudF9pZH1gO1xyXG4gICAgfVxyXG5cclxuICAgIF9sb2FkVXNlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdXNlclN0b3JlLmdldCh0aGlzLl91c2VyU3RvcmVLZXkpLnRoZW4oc3RvcmFnZVN0cmluZyA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzdG9yYWdlU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5fbG9hZFVzZXI6IHVzZXIgc3RvcmFnZVN0cmluZyBsb2FkZWRcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gVXNlci5mcm9tU3RvcmFnZVN0cmluZyhzdG9yYWdlU3RyaW5nKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuX2xvYWRVc2VyOiBubyB1c2VyIHN0b3JhZ2VTdHJpbmdcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3JlVXNlcih1c2VyKSB7XHJcbiAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuc3RvcmVVc2VyOiBzdG9yaW5nIHVzZXJcIik7XHJcblxyXG4gICAgICAgICAgICB2YXIgc3RvcmFnZVN0cmluZyA9IHVzZXIudG9TdG9yYWdlU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91c2VyU3RvcmUuc2V0KHRoaXMuX3VzZXJTdG9yZUtleSwgc3RvcmFnZVN0cmluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJzdG9yZVVzZXIuc3RvcmVVc2VyOiByZW1vdmluZyB1c2VyXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdXNlclN0b3JlLnJlbW92ZSh0aGlzLl91c2VyU3RvcmVLZXkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcbmltcG9ydCB7IEFjY2Vzc1Rva2VuRXZlbnRzIH0gZnJvbSAnLi9BY2Nlc3NUb2tlbkV2ZW50cy5qcyc7XHJcbmltcG9ydCB7IEV2ZW50IH0gZnJvbSAnLi9FdmVudC5qcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgVXNlck1hbmFnZXJFdmVudHMgZXh0ZW5kcyBBY2Nlc3NUb2tlbkV2ZW50cyB7XHJcblxyXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcclxuICAgICAgICBzdXBlcihzZXR0aW5ncyk7XHJcbiAgICAgICAgdGhpcy5fdXNlckxvYWRlZCA9IG5ldyBFdmVudChcIlVzZXIgbG9hZGVkXCIpO1xyXG4gICAgICAgIHRoaXMuX3VzZXJVbmxvYWRlZCA9IG5ldyBFdmVudChcIlVzZXIgdW5sb2FkZWRcIik7XHJcbiAgICAgICAgdGhpcy5fc2lsZW50UmVuZXdFcnJvciA9IG5ldyBFdmVudChcIlNpbGVudCByZW5ldyBlcnJvclwiKTtcclxuICAgICAgICB0aGlzLl91c2VyU2lnbmVkSW4gPSBuZXcgRXZlbnQoXCJVc2VyIHNpZ25lZCBpblwiKTtcclxuICAgICAgICB0aGlzLl91c2VyU2lnbmVkT3V0ID0gbmV3IEV2ZW50KFwiVXNlciBzaWduZWQgb3V0XCIpO1xyXG4gICAgICAgIHRoaXMuX3VzZXJTZXNzaW9uQ2hhbmdlZCA9IG5ldyBFdmVudChcIlVzZXIgc2Vzc2lvbiBjaGFuZ2VkXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWQodXNlciwgcmFpc2VFdmVudD10cnVlKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXJFdmVudHMubG9hZFwiKTtcclxuICAgICAgICBzdXBlci5sb2FkKHVzZXIpO1xyXG4gICAgICAgIGlmIChyYWlzZUV2ZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJMb2FkZWQucmFpc2UodXNlcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgdW5sb2FkKCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyRXZlbnRzLnVubG9hZFwiKTtcclxuICAgICAgICBzdXBlci51bmxvYWQoKTtcclxuICAgICAgICB0aGlzLl91c2VyVW5sb2FkZWQucmFpc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRVc2VyTG9hZGVkKGNiKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlckxvYWRlZC5hZGRIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIHJlbW92ZVVzZXJMb2FkZWQoY2IpIHtcclxuICAgICAgICB0aGlzLl91c2VyTG9hZGVkLnJlbW92ZUhhbmRsZXIoY2IpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZFVzZXJVbmxvYWRlZChjYikge1xyXG4gICAgICAgIHRoaXMuX3VzZXJVbmxvYWRlZC5hZGRIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIHJlbW92ZVVzZXJVbmxvYWRlZChjYikge1xyXG4gICAgICAgIHRoaXMuX3VzZXJVbmxvYWRlZC5yZW1vdmVIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRTaWxlbnRSZW5ld0Vycm9yKGNiKSB7XHJcbiAgICAgICAgdGhpcy5fc2lsZW50UmVuZXdFcnJvci5hZGRIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIHJlbW92ZVNpbGVudFJlbmV3RXJyb3IoY2IpIHtcclxuICAgICAgICB0aGlzLl9zaWxlbnRSZW5ld0Vycm9yLnJlbW92ZUhhbmRsZXIoY2IpO1xyXG4gICAgfVxyXG4gICAgX3JhaXNlU2lsZW50UmVuZXdFcnJvcihlKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXJFdmVudHMuX3JhaXNlU2lsZW50UmVuZXdFcnJvclwiLCBlLm1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMuX3NpbGVudFJlbmV3RXJyb3IucmFpc2UoZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkVXNlclNpZ25lZEluKGNiKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlclNpZ25lZEluLmFkZEhhbmRsZXIoY2IpO1xyXG4gICAgfVxyXG4gICAgcmVtb3ZlVXNlclNpZ25lZEluKGNiKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlclNpZ25lZEluLnJlbW92ZUhhbmRsZXIoY2IpO1xyXG4gICAgfVxyXG4gICAgX3JhaXNlVXNlclNpZ25lZEluKCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyRXZlbnRzLl9yYWlzZVVzZXJTaWduZWRJblwiKTtcclxuICAgICAgICB0aGlzLl91c2VyU2lnbmVkSW4ucmFpc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRVc2VyU2lnbmVkT3V0KGNiKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlclNpZ25lZE91dC5hZGRIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIHJlbW92ZVVzZXJTaWduZWRPdXQoY2IpIHtcclxuICAgICAgICB0aGlzLl91c2VyU2lnbmVkT3V0LnJlbW92ZUhhbmRsZXIoY2IpO1xyXG4gICAgfVxyXG4gICAgX3JhaXNlVXNlclNpZ25lZE91dCgpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlckV2ZW50cy5fcmFpc2VVc2VyU2lnbmVkT3V0XCIpO1xyXG4gICAgICAgIHRoaXMuX3VzZXJTaWduZWRPdXQucmFpc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRVc2VyU2Vzc2lvbkNoYW5nZWQoY2IpIHtcclxuICAgICAgICB0aGlzLl91c2VyU2Vzc2lvbkNoYW5nZWQuYWRkSGFuZGxlcihjYik7XHJcbiAgICB9XHJcbiAgICByZW1vdmVVc2VyU2Vzc2lvbkNoYW5nZWQoY2IpIHtcclxuICAgICAgICB0aGlzLl91c2VyU2Vzc2lvbkNoYW5nZWQucmVtb3ZlSGFuZGxlcihjYik7XHJcbiAgICB9XHJcbiAgICBfcmFpc2VVc2VyU2Vzc2lvbkNoYW5nZWQoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXJFdmVudHMuX3JhaXNlVXNlclNlc3Npb25DaGFuZ2VkXCIpO1xyXG4gICAgICAgIHRoaXMuX3VzZXJTZXNzaW9uQ2hhbmdlZC5yYWlzZSgpO1xyXG4gICAgfVxyXG59XHJcbiIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCB7IExvZyB9IGZyb20gJy4vTG9nLmpzJztcclxuaW1wb3J0IHsgT2lkY0NsaWVudFNldHRpbmdzIH0gZnJvbSAnLi9PaWRjQ2xpZW50U2V0dGluZ3MuanMnO1xyXG5pbXBvcnQgeyBSZWRpcmVjdE5hdmlnYXRvciB9IGZyb20gJy4vUmVkaXJlY3ROYXZpZ2F0b3IuanMnO1xyXG5pbXBvcnQgeyBQb3B1cE5hdmlnYXRvciB9IGZyb20gJy4vUG9wdXBOYXZpZ2F0b3IuanMnO1xyXG5pbXBvcnQgeyBJRnJhbWVOYXZpZ2F0b3IgfSBmcm9tICcuL0lGcmFtZU5hdmlnYXRvci5qcyc7XHJcbmltcG9ydCB7IFdlYlN0b3JhZ2VTdGF0ZVN0b3JlIH0gZnJvbSAnLi9XZWJTdG9yYWdlU3RhdGVTdG9yZS5qcyc7XHJcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gJy4vR2xvYmFsLmpzJztcclxuaW1wb3J0IHsgU2lnbmluUmVxdWVzdCB9IGZyb20gJy4vU2lnbmluUmVxdWVzdC5qcyc7XHJcblxyXG5jb25zdCBEZWZhdWx0QWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUgPSA2MDtcclxuY29uc3QgRGVmYXVsdENoZWNrU2Vzc2lvbkludGVydmFsID0gMjAwMDtcclxuXHJcbmV4cG9ydCBjbGFzcyBVc2VyTWFuYWdlclNldHRpbmdzIGV4dGVuZHMgT2lkY0NsaWVudFNldHRpbmdzIHtcclxuICAgIGNvbnN0cnVjdG9yKHtcclxuICAgICAgICBwb3B1cF9yZWRpcmVjdF91cmksXHJcbiAgICAgICAgcG9wdXBfcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpLFxyXG4gICAgICAgIHBvcHVwV2luZG93RmVhdHVyZXMsXHJcbiAgICAgICAgcG9wdXBXaW5kb3dUYXJnZXQsXHJcbiAgICAgICAgc2lsZW50X3JlZGlyZWN0X3VyaSxcclxuICAgICAgICBzaWxlbnRSZXF1ZXN0VGltZW91dCxcclxuICAgICAgICBhdXRvbWF0aWNTaWxlbnRSZW5ldyA9IGZhbHNlLFxyXG4gICAgICAgIHZhbGlkYXRlU3ViT25TaWxlbnRSZW5ldyA9IGZhbHNlLFxyXG4gICAgICAgIGluY2x1ZGVJZFRva2VuSW5TaWxlbnRSZW5ldyA9IHRydWUsXHJcbiAgICAgICAgbW9uaXRvclNlc3Npb24gPSB0cnVlLFxyXG4gICAgICAgIG1vbml0b3JBbm9ueW1vdXNTZXNzaW9uID0gZmFsc2UsXHJcbiAgICAgICAgY2hlY2tTZXNzaW9uSW50ZXJ2YWwgPSBEZWZhdWx0Q2hlY2tTZXNzaW9uSW50ZXJ2YWwsXHJcbiAgICAgICAgc3RvcENoZWNrU2Vzc2lvbk9uRXJyb3IgPSB0cnVlLFxyXG4gICAgICAgIHF1ZXJ5X3N0YXR1c19yZXNwb25zZV90eXBlLFxyXG4gICAgICAgIHJldm9rZUFjY2Vzc1Rva2VuT25TaWdub3V0ID0gZmFsc2UsXHJcbiAgICAgICAgYWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUgPSBEZWZhdWx0QWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUsXHJcbiAgICAgICAgcmVkaXJlY3ROYXZpZ2F0b3IgPSBuZXcgUmVkaXJlY3ROYXZpZ2F0b3IoKSxcclxuICAgICAgICBwb3B1cE5hdmlnYXRvciA9IG5ldyBQb3B1cE5hdmlnYXRvcigpLFxyXG4gICAgICAgIGlmcmFtZU5hdmlnYXRvciA9IG5ldyBJRnJhbWVOYXZpZ2F0b3IoKSxcclxuICAgICAgICB1c2VyU3RvcmUgPSBuZXcgV2ViU3RvcmFnZVN0YXRlU3RvcmUoeyBzdG9yZTogR2xvYmFsLnNlc3Npb25TdG9yYWdlIH0pXHJcbiAgICB9ID0ge30pIHtcclxuICAgICAgICBzdXBlcihhcmd1bWVudHNbMF0pO1xyXG5cclxuICAgICAgICB0aGlzLl9wb3B1cF9yZWRpcmVjdF91cmkgPSBwb3B1cF9yZWRpcmVjdF91cmk7XHJcbiAgICAgICAgdGhpcy5fcG9wdXBfcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpID0gcG9wdXBfcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpO1xyXG4gICAgICAgIHRoaXMuX3BvcHVwV2luZG93RmVhdHVyZXMgPSBwb3B1cFdpbmRvd0ZlYXR1cmVzO1xyXG4gICAgICAgIHRoaXMuX3BvcHVwV2luZG93VGFyZ2V0ID0gcG9wdXBXaW5kb3dUYXJnZXQ7XHJcblxyXG4gICAgICAgIHRoaXMuX3NpbGVudF9yZWRpcmVjdF91cmkgPSBzaWxlbnRfcmVkaXJlY3RfdXJpO1xyXG4gICAgICAgIHRoaXMuX3NpbGVudFJlcXVlc3RUaW1lb3V0ID0gc2lsZW50UmVxdWVzdFRpbWVvdXQ7XHJcbiAgICAgICAgdGhpcy5fYXV0b21hdGljU2lsZW50UmVuZXcgPSBhdXRvbWF0aWNTaWxlbnRSZW5ldztcclxuICAgICAgICB0aGlzLl92YWxpZGF0ZVN1Yk9uU2lsZW50UmVuZXcgPSB2YWxpZGF0ZVN1Yk9uU2lsZW50UmVuZXc7XHJcbiAgICAgICAgdGhpcy5faW5jbHVkZUlkVG9rZW5JblNpbGVudFJlbmV3ID0gaW5jbHVkZUlkVG9rZW5JblNpbGVudFJlbmV3O1xyXG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lID0gYWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWU7XHJcblxyXG4gICAgICAgIHRoaXMuX21vbml0b3JTZXNzaW9uID0gbW9uaXRvclNlc3Npb247XHJcbiAgICAgICAgdGhpcy5fbW9uaXRvckFub255bW91c1Nlc3Npb24gPSBtb25pdG9yQW5vbnltb3VzU2Vzc2lvbjtcclxuICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JbnRlcnZhbCA9IGNoZWNrU2Vzc2lvbkludGVydmFsO1xyXG4gICAgICAgIHRoaXMuX3N0b3BDaGVja1Nlc3Npb25PbkVycm9yID0gc3RvcENoZWNrU2Vzc2lvbk9uRXJyb3I7XHJcbiAgICAgICAgaWYgKHF1ZXJ5X3N0YXR1c19yZXNwb25zZV90eXBlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3F1ZXJ5X3N0YXR1c19yZXNwb25zZV90eXBlID0gcXVlcnlfc3RhdHVzX3Jlc3BvbnNlX3R5cGU7XHJcbiAgICAgICAgfSBcclxuICAgICAgICBlbHNlIGlmIChhcmd1bWVudHNbMF0gJiYgYXJndW1lbnRzWzBdLnJlc3BvbnNlX3R5cGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fcXVlcnlfc3RhdHVzX3Jlc3BvbnNlX3R5cGUgPSBTaWduaW5SZXF1ZXN0LmlzT2lkYyhhcmd1bWVudHNbMF0ucmVzcG9uc2VfdHlwZSkgPyBcImlkX3Rva2VuXCIgOiBcImNvZGVcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3F1ZXJ5X3N0YXR1c19yZXNwb25zZV90eXBlID0gXCJpZF90b2tlblwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9yZXZva2VBY2Nlc3NUb2tlbk9uU2lnbm91dCA9IHJldm9rZUFjY2Vzc1Rva2VuT25TaWdub3V0O1xyXG5cclxuICAgICAgICB0aGlzLl9yZWRpcmVjdE5hdmlnYXRvciA9IHJlZGlyZWN0TmF2aWdhdG9yO1xyXG4gICAgICAgIHRoaXMuX3BvcHVwTmF2aWdhdG9yID0gcG9wdXBOYXZpZ2F0b3I7XHJcbiAgICAgICAgdGhpcy5faWZyYW1lTmF2aWdhdG9yID0gaWZyYW1lTmF2aWdhdG9yO1xyXG5cclxuICAgICAgICB0aGlzLl91c2VyU3RvcmUgPSB1c2VyU3RvcmU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHBvcHVwX3JlZGlyZWN0X3VyaSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcG9wdXBfcmVkaXJlY3RfdXJpO1xyXG4gICAgfVxyXG4gICAgZ2V0IHBvcHVwX3Bvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcG9wdXBfcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpO1xyXG4gICAgfVxyXG4gICAgZ2V0IHBvcHVwV2luZG93RmVhdHVyZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcHVwV2luZG93RmVhdHVyZXM7XHJcbiAgICB9XHJcbiAgICBnZXQgcG9wdXBXaW5kb3dUYXJnZXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcHVwV2luZG93VGFyZ2V0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzaWxlbnRfcmVkaXJlY3RfdXJpKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWxlbnRfcmVkaXJlY3RfdXJpO1xyXG4gICAgfVxyXG4gICAgIGdldCBzaWxlbnRSZXF1ZXN0VGltZW91dCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lsZW50UmVxdWVzdFRpbWVvdXQ7XHJcbiAgICB9XHJcbiAgICBnZXQgYXV0b21hdGljU2lsZW50UmVuZXcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dG9tYXRpY1NpbGVudFJlbmV3O1xyXG4gICAgfVxyXG4gICAgZ2V0IHZhbGlkYXRlU3ViT25TaWxlbnRSZW5ldygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVTdWJPblNpbGVudFJlbmV3O1xyXG4gICAgfVxyXG4gICAgZ2V0IGluY2x1ZGVJZFRva2VuSW5TaWxlbnRSZW5ldygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW5jbHVkZUlkVG9rZW5JblNpbGVudFJlbmV3O1xyXG4gICAgfVxyXG4gICAgZ2V0IGFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbW9uaXRvclNlc3Npb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vbml0b3JTZXNzaW9uO1xyXG4gICAgfVxyXG4gICAgZ2V0IG1vbml0b3JBbm9ueW1vdXNTZXNzaW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tb25pdG9yQW5vbnltb3VzU2Vzc2lvbjtcclxuICAgIH1cclxuICAgIGdldCBjaGVja1Nlc3Npb25JbnRlcnZhbCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2hlY2tTZXNzaW9uSW50ZXJ2YWw7XHJcbiAgICB9XHJcbiAgICBnZXQgc3RvcENoZWNrU2Vzc2lvbk9uRXJyb3IoKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc3RvcENoZWNrU2Vzc2lvbk9uRXJyb3I7XHJcbiAgICB9XHJcbiAgICBnZXQgcXVlcnlfc3RhdHVzX3Jlc3BvbnNlX3R5cGUoKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcXVlcnlfc3RhdHVzX3Jlc3BvbnNlX3R5cGU7XHJcbiAgICB9XHJcbiAgICBnZXQgcmV2b2tlQWNjZXNzVG9rZW5PblNpZ25vdXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jldm9rZUFjY2Vzc1Rva2VuT25TaWdub3V0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByZWRpcmVjdE5hdmlnYXRvcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVkaXJlY3ROYXZpZ2F0b3I7XHJcbiAgICB9XHJcbiAgICBnZXQgcG9wdXBOYXZpZ2F0b3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcHVwTmF2aWdhdG9yO1xyXG4gICAgfVxyXG4gICAgZ2V0IGlmcmFtZU5hdmlnYXRvcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faWZyYW1lTmF2aWdhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB1c2VyU3RvcmUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJTdG9yZTtcclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gJy4vR2xvYmFsLmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBXZWJTdG9yYWdlU3RhdGVTdG9yZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7cHJlZml4ID0gXCJvaWRjLlwiLCBzdG9yZSA9IEdsb2JhbC5sb2NhbFN0b3JhZ2V9ID0ge30pIHtcclxuICAgICAgICB0aGlzLl9zdG9yZSA9IHN0b3JlO1xyXG4gICAgICAgIHRoaXMuX3ByZWZpeCA9IHByZWZpeDtcclxuICAgIH1cclxuXHJcbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIldlYlN0b3JhZ2VTdGF0ZVN0b3JlLnNldFwiLCBrZXkpO1xyXG5cclxuICAgICAgICBrZXkgPSB0aGlzLl9wcmVmaXggKyBrZXk7XHJcblxyXG4gICAgICAgIHRoaXMuX3N0b3JlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQoa2V5KSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiV2ViU3RvcmFnZVN0YXRlU3RvcmUuZ2V0XCIsIGtleSk7XHJcblxyXG4gICAgICAgIGtleSA9IHRoaXMuX3ByZWZpeCArIGtleTtcclxuXHJcbiAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLl9zdG9yZS5nZXRJdGVtKGtleSk7XHJcblxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoaXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlKGtleSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIldlYlN0b3JhZ2VTdGF0ZVN0b3JlLnJlbW92ZVwiLCBrZXkpO1xyXG5cclxuICAgICAgICBrZXkgPSB0aGlzLl9wcmVmaXggKyBrZXk7XHJcblxyXG4gICAgICAgIGxldCBpdGVtID0gdGhpcy5fc3RvcmUuZ2V0SXRlbShrZXkpO1xyXG4gICAgICAgIHRoaXMuX3N0b3JlLnJlbW92ZUl0ZW0oa2V5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShpdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBbGxLZXlzKCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIldlYlN0b3JhZ2VTdGF0ZVN0b3JlLmdldEFsbEtleXNcIik7XHJcblxyXG4gICAgICAgIHZhciBrZXlzID0gW107XHJcblxyXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9zdG9yZS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgICAgbGV0IGtleSA9IHRoaXMuX3N0b3JlLmtleShpbmRleCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YodGhpcy5fcHJlZml4KSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleS5zdWJzdHIodGhpcy5fcHJlZml4Lmxlbmd0aCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGtleXMpO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IGp3cywgS0VZVVRJTCBhcyBLZXlVdGlsLCBYNTA5LCBjcnlwdG8sIGhleHRvYjY0dSwgYjY0dG9oZXggfSBmcm9tICcuLi8uLi9qc3JzYXNpZ24vZGlzdC9qc3JzYXNpZ24uanMnO1xyXG5cclxuY29uc3QgQWxsb3dlZFNpZ25pbmdBbGdzID0gWydSUzI1NicsICdSUzM4NCcsICdSUzUxMicsICdQUzI1NicsICdQUzM4NCcsICdQUzUxMicsICdFUzI1NicsICdFUzM4NCcsICdFUzUxMiddO1xyXG5cclxuZXhwb3J0IHtcclxuICAgIGp3cyxcclxuICAgIEtleVV0aWwsXHJcbiAgICBYNTA5LFxyXG4gICAgY3J5cHRvLFxyXG4gICAgaGV4dG9iNjR1LFxyXG4gICAgYjY0dG9oZXgsXHJcbiAgICBBbGxvd2VkU2lnbmluZ0FsZ3NcclxufTtcclxuIiwiLyoqXHJcbiAqIEdlbmVyYXRlcyBSRkM0MTIyIHZlcnNpb24gNCBndWlkICgpXHJcbiAqL1xyXG5cclxudmFyIGNyeXB0byA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgPyAod2luZG93LmNyeXB0byB8fCB3aW5kb3cubXNDcnlwdG8pIDogbnVsbDtcclxuXHJcbmZ1bmN0aW9uIF9jcnlwdG9VdWlkdjQoKSB7XHJcbiAgcmV0dXJuIChbMWU3XSstMWUzKy00ZTMrLThlMystMWUxMSkucmVwbGFjZSgvWzAxOF0vZywgYyA9PlxyXG4gICAgKGMgXiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDEpKVswXSAmIDE1ID4+IGMgLyA0KS50b1N0cmluZygxNilcclxuICApXHJcbn1cclxuXHJcbmZ1bmN0aW9uIF91dWlkdjQoKSB7XHJcbiAgICByZXR1cm4gKFsxZTddKy0xZTMrLTRlMystOGUzKy0xZTExKS5yZXBsYWNlKC9bMDE4XS9nLCBjID0+XHJcbiAgICAoYyBeIE1hdGgucmFuZG9tKCkgKiAxNiA+PiBjIC8gNCkudG9TdHJpbmcoMTYpXHJcbiAgKVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5kb20oKSB7XHJcbiAgdmFyIGhhc0NyeXB0byA9IGNyeXB0byAhPSAndW5kZWZpbmVkJyAmJiBjcnlwdG8gIT09IG51bGw7XHJcbiAgdmFyIGhhc1JhbmRvbVZhbHVlcyA9IGhhc0NyeXB0byAmJiAodHlwZW9mKGNyeXB0by5nZXRSYW5kb21WYWx1ZXMpICE9ICd1bmRlZmluZWQnKTsgIFxyXG4gIHZhciB1dWlkID0gaGFzUmFuZG9tVmFsdWVzID8gX2NyeXB0b1V1aWR2NCA6IF91dWlkdjQ7XHJcbiAgcmV0dXJuIHV1aWQoKS5yZXBsYWNlKC8tL2csICcnKTtcclxufVxyXG4iLCJjb25zdCBWZXJzaW9uID0gXCIxLjExLjVcIjsgZXhwb3J0IHtWZXJzaW9ufTsiXSwic291cmNlUm9vdCI6IiJ9