module.exports = /******/ (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 = "./src/index.js"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./src/0globals.js": /*!*************************!*\ !*** ./src/0globals.js ***! \*************************/ /*! exports provided: minimumDiscordVersion, currentDiscordVersion, minSupportedVersion, bbdVersion, bbdChangelog, settings, defaultCookie, settingsCookie, settingsRPC, defaultRPC, bdpluginErrors, bdthemeErrors, bdConfig, bdthemes, bdplugins, pluginCookie, themeCookie */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "minimumDiscordVersion", function() { return minimumDiscordVersion; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "currentDiscordVersion", function() { return currentDiscordVersion; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "minSupportedVersion", function() { return minSupportedVersion; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bbdVersion", function() { return bbdVersion; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bbdChangelog", function() { return bbdChangelog; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "settings", function() { return settings; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultCookie", function() { return defaultCookie; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "settingsCookie", function() { return settingsCookie; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "settingsRPC", function() { return settingsRPC; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultRPC", function() { return defaultRPC; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdpluginErrors", function() { return bdpluginErrors; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdthemeErrors", function() { return bdthemeErrors; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdConfig", function() { return bdConfig; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdthemes", function() { return bdthemes; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdplugins", function() { return bdplugins; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pluginCookie", function() { return pluginCookie; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "themeCookie", function() { return themeCookie; }); const minimumDiscordVersion = "0.0.306"; const currentDiscordVersion = window.DiscordNative && window.DiscordNative.remoteApp && window.DiscordNative.remoteApp.getVersion && window.DiscordNative.remoteApp.getVersion() || "0.0.306"; const minSupportedVersion = "0.3.0"; const bbdVersion = "0.3.5"; const bbdChangelog = { description: "Big things are coming.", changes: [{ title: "Bug Fixes", type: "fixed", items: ["Some fixes related to showing modals in the `BdApi`.", "Fixed the open folder buttons for plugins and themes"] }] }; const settings = { "Custom css live update": { id: "bda-css-0", info: "", implemented: true, hidden: true, cat: "core" }, "Custom css auto udpate": { id: "bda-css-1", info: "", implemented: true, hidden: true, cat: "core" }, "BetterDiscord Blue": { id: "bda-gs-b", info: "Replace Discord blue with BD Blue", implemented: false, hidden: false, cat: "core" }, /* Core */ /* ====== */ "Public Servers": { id: "bda-gs-1", info: "Display public servers button", implemented: true, hidden: false, cat: "core", category: "modules" }, "Minimal Mode": { id: "bda-gs-2", info: "Hide elements and reduce the size of elements.", implemented: true, hidden: false, cat: "core", category: "modules" }, "Voice Mode": { id: "bda-gs-4", info: "Only show voice chat", implemented: true, hidden: false, cat: "core", category: "modules" }, "Hide Channels": { id: "bda-gs-3", info: "Hide channels in minimal mode", implemented: true, hidden: false, cat: "core", category: "modules" }, "Dark Mode": { id: "bda-gs-5", info: "Make certain elements dark by default(wip)", implemented: true, hidden: false, cat: "core", category: "modules" }, "Voice Disconnect": { id: "bda-dc-0", info: "Disconnect from voice server when closing Discord", implemented: true, hidden: false, cat: "core", category: "modules" }, "24 Hour Timestamps": { id: "bda-gs-6", info: "Replace 12hr timestamps with proper ones", implemented: true, hidden: false, cat: "core", category: "modules" }, "Colored Text": { id: "bda-gs-7", info: "Make text color the same as role color", implemented: true, hidden: false, cat: "core", category: "modules" }, "Normalize Classes": { id: "fork-ps-4", info: "Adds stable classes to elements to help themes. (e.g. adds .da-channels to .channels-Ie2l6A)", implemented: true, hidden: false, cat: "core", category: "modules" }, /* Content */ "Content Error Modal": { id: "fork-ps-1", info: "Shows a modal with plugin/theme errors", implemented: true, hidden: false, cat: "core", category: "content manager" }, "Scan Plugins": { id: "fork-ps-6", info: "Scan plugins for any threat that can be hidden inside.", implemented: true, hidden: false, cat: "core", category: "content manager" }, "Show Toasts": { id: "fork-ps-2", info: "Shows a small notification for important information", implemented: true, hidden: false, cat: "core", category: "content manager" }, "Scroll To Settings": { id: "fork-ps-3", info: "Auto-scrolls to a plugin's settings when the button is clicked (only if out of view)", implemented: true, hidden: false, cat: "core", category: "content manager" }, "Automatic Loading": { id: "fork-ps-5", info: "Automatically loads, reloads, and unloads plugins and themes", implemented: true, hidden: false, cat: "core", category: "content manager" }, "Enable Edit Button": { id: "fork-ps-7", info: "Enable an Edit Button on the plugin and theme panel.", implemented: true, hidden: false, cat: "core", category: "content manager" }, "Themes in Popout Window": { id: "lightcord-9", info: "Enable themes in Popout Window. (For example, when detaching screenshare.)", implemented: true, hidden: false, cat: "core", category: "content manager", experimental: true }, /* Developer */ "Developer Mode": { id: "bda-gs-8", info: "Developer Mode Toggle", implemented: true, hidden: false, cat: "core", category: "developer settings" }, "Copy Selector": { id: "fork-dm-1", info: "Adds a \"Copy Selector\" option to context menus when developer mode is active", implemented: true, hidden: false, cat: "core", category: "developer settings" }, "React DevTools": { id: "reactDevTools", info: "Adds react developer tools to the devtools. Must be installed in Google Chrome on your pc.", implemented: true, hidden: true, cat: "core", category: "developer settings" }, /** Lightcord */ "Disable BetterDiscord": { id: "bd-disable", info: "Disable Betterdiscord (plugins, themes, etc) (Not implemented).", implemented: false, hidden: false, cat: "lightcord", category: "Lightcord" }, "Blur Personal Information": { id: "lightcord-6", info: "Blur sensitive informations like email, payment infos and more.", implemented: true, hidden: false, cat: "lightcord", category: "Lightcord" }, "Calling Ring Beat": { id: "lightcord-2", info: "Enable Discord's special calling beat.", implemented: true, hidden: false, cat: "lightcord", category: "Lightcord" }, "Developer Options": { id: "lightcord-1", info: "Enable Discord's & Lightcord's Internal Developer Options. This allow the \"Experiments\" tab, the \"Developer Options\" tab and the \"Lightcord Api\" section.", implemented: true, hidden: false, cat: "lightcord", category: "Lightcord" }, "Ad Block": { id: "lightcord-4", info: "Block any BOT that dms you with an invite link. Even in an embed.", implemented: true, hidden: false, cat: "lightcord", category: "Lightcord" }, "Enable Lightcord Servers": { id: "lightcord-5", info: "Enable Lightcord's servers. Disabling this will disable custom badges.", implemented: true, hidden: false, cat: "lightcord", category: "Lightcord" }, "Disable typing": { id: "lightcord-7", info: "Don't let other see you're typing.", implemented: true, hidden: false, cat: "lightcord", category: "Lightcord" }, "Lightcord Tabs": { id: "lightcord-8", info: "Allows you to launch multiple instances of Lightcord in the same window.", implemented: true, hidden: false, cat: "lightcord", category: "Lightcord", experimental: true }, "Use Notification Shim": { id: "lightcord-10", info: "Basically don't use Windows's Notifications.", implemented: true, hidden: process.platform !== "win32", cat: "lightcord", category: "Lightcord", experimental: false }, /** Lightcord Window */ "Always-on-Top": { id: "lightcord-3", info: "Enable the window's Always-on-Top mode, where Lightcord stays on top of other applications.", implemented: true, hidden: false, cat: "lightcord", category: "Window" }, "No Window Bounds": { id: "no_window_bound", info: "Disable Window Bounds. Can be useful if you use a window manager.", implemented: true, hidden: process.platform !== "linux", cat: "lightcord", category: "Window" }, "Enable Glasstron": { id: "enable_glasstron", info: "Enable Glasstron. If you're not using transparent themes, this can reduce lag.", implemented: true, hidden: false, cat: "lightcord", category: "Window" }, /** RichPresence */ "Enable": { id: "lightcord-presence-1", info: "Enable RichPresence below.", implemented: true, hidden: false, cat: "status" } }; const defaultCookie = { "bda-gs-1": true, "bda-gs-2": false, "bda-gs-3": false, "bda-gs-4": false, "bda-gs-5": true, "bda-gs-6": false, "bda-gs-7": false, "bda-gs-8": false, "bda-es-0": true, "bda-es-1": true, "bda-es-2": true, "bda-es-4": false, "bda-es-6": true, "bda-es-7": true, "bda-gs-b": false, "bda-es-8": true, "bda-dc-0": false, "bda-css-0": false, "bda-css-1": false, "bda-es-9": true, "fork-dm-1": false, "fork-ps-1": true, "fork-ps-2": true, "fork-ps-3": true, "fork-ps-4": true, "fork-ps-5": true, "fork-ps-6": true, "fork-ps-7": false, "fork-es-2": false, "fork-es-3": true, "fork-wp-1": false, "fork-wp-2": false, "fork-beta": true, "reactDevTools": false, "lightcord-1": false, "lightcord-2": true, "lightcord-presence-1": false, "lightcord-3": false, "lightcord-4": false, "lightcord-5": true, "lightcord-6": true, "lightcord-7": false, "lightcord-8": false, "lightcord-9": false, "lightcord-10": false, "no_window_bound": false }; const settingsCookie = {}; const settingsRPC = {}; const defaultRPC = { "name": "Lightcord", "application_id": "711416957718757418", "state": "Lightcord Client", "details": "Browsing Discord", "timestamps.start": Date.now(), "assets.small": null, "assets.large": "712323821037682791" }; const bdpluginErrors = []; const bdthemeErrors = []; // define for backwards compatibility const bdConfig = Object.create(BetterDiscordConfig); const bdthemes = {}; const bdplugins = {}; const pluginCookie = {}; const themeCookie = {}; /***/ }), /***/ "./src/index.js": /*!**********************!*\ !*** ./src/index.js ***! \**********************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CoreWrapper; }); /* harmony import */ var _localStorageFix__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./localStorageFix */ "./src/localStorageFix.js"); /* harmony import */ var _loadingIcon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./loadingIcon */ "./src/loadingIcon.js"); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./0globals */ "./src/0globals.js"); /* harmony import */ var _modules_bdApi__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules/bdApi */ "./src/modules/bdApi.js"); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _modules_pluginModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./modules/pluginModule */ "./src/modules/pluginModule.js"); /* harmony import */ var _modules_themeModule__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./modules/themeModule */ "./src/modules/themeModule.js"); /* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./modules/utils */ "./src/modules/utils.js"); /* harmony import */ var _modules_bdEvents__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./modules/bdEvents */ "./src/modules/bdEvents.js"); /* harmony import */ var _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./modules/settingsPanel */ "./src/modules/settingsPanel.js"); /* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./modules/dataStore */ "./src/modules/dataStore.js"); /* harmony import */ var _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./modules/contentManager */ "./src/modules/contentManager.js"); /* harmony import */ var _modules_classNormalizer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./modules/classNormalizer */ "./src/modules/classNormalizer.js"); /* harmony import */ var _modules_core__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./modules/core */ "./src/modules/core.js"); Object(_localStorageFix__WEBPACK_IMPORTED_MODULE_0__["default"])(); Object(_loadingIcon__WEBPACK_IMPORTED_MODULE_1__["default"])(); const deprecateGlobal = (key, value) => { Object.defineProperty(window, key, { get() { _modules_utils__WEBPACK_IMPORTED_MODULE_7__["default"].warn("Deprecated Global", `"${key}" will be removed in future versions. Please only use BdApi.`); return value; } }); }; const globalKeys = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_2__); for (const key of globalKeys) deprecateGlobal(key, _0globals__WEBPACK_IMPORTED_MODULE_2__[key]); deprecateGlobal("BDV2", _modules_v2__WEBPACK_IMPORTED_MODULE_4__["default"]); deprecateGlobal("pluginModule", _modules_pluginModule__WEBPACK_IMPORTED_MODULE_5__["default"]); deprecateGlobal("themeModule", _modules_themeModule__WEBPACK_IMPORTED_MODULE_6__["default"]); deprecateGlobal("Utils", _modules_utils__WEBPACK_IMPORTED_MODULE_7__["default"]); deprecateGlobal("BDEvents", _modules_bdEvents__WEBPACK_IMPORTED_MODULE_8__["default"]); deprecateGlobal("settingsPanel", _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_9__["default"]); deprecateGlobal("DataStore", _modules_dataStore__WEBPACK_IMPORTED_MODULE_10__["default"]); deprecateGlobal("ContentManager", _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__["default"]); deprecateGlobal("ClassNormalizer", _modules_classNormalizer__WEBPACK_IMPORTED_MODULE_12__["default"]); window.BdApi = _modules_bdApi__WEBPACK_IMPORTED_MODULE_3__["default"]; deprecateGlobal("mainCore", _modules_core__WEBPACK_IMPORTED_MODULE_13__["default"]); // TODO: Change Init mode and stop using CoreWrapper. class CoreWrapper { constructor(bdConfig, methods) { _modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].setConfig(bdConfig); _modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].setMethods(methods); } init() { // deprecateGlobal("mainCore", this.mainCore); _modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].init(); } } /***/ }), /***/ "./src/loadingIcon.js": /*!****************************!*\ !*** ./src/loadingIcon.js ***! \****************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony default export */ __webpack_exports__["default"] = (() => { const v2Loader = document.createElement("div"); v2Loader.className = "bd-loaderv2"; v2Loader.title = "BandagedBD is loading..."; document.body.appendChild(v2Loader); }); /***/ }), /***/ "./src/localStorageFix.js": /*!********************************!*\ !*** ./src/localStorageFix.js ***! \********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony default export */ __webpack_exports__["default"] = (function () { const contentWindowGetter = Object.getOwnPropertyDescriptor(HTMLIFrameElement.prototype, "contentWindow").get; Object.defineProperty(HTMLIFrameElement.prototype, "contentWindow", { get: function () { const contentWindow = Reflect.apply(contentWindowGetter, this, arguments); return new Proxy(contentWindow, { getOwnPropertyDescriptor: function (obj, prop) { if (prop === "localStorage") return undefined; return Object.getOwnPropertyDescriptor(obj, prop); }, get: function (obj, prop) { if (prop === "localStorage") return null; const val = obj[prop]; if (typeof val === "function") return val.bind(obj); return val; } }); } }); // Prevent interception by patching Reflect.apply and Function.prototype.bind Object.defineProperty(Reflect, "apply", { value: Reflect.apply, writable: false, configurable: false }); Object.defineProperty(Function.prototype, "bind", { value: Function.prototype.bind, writable: false, configurable: false }); const oOpen = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function () { const url = arguments[1]; if (url.toLowerCase().includes("api/webhooks")) return null; return Reflect.apply(oOpen, this, arguments); }; }); /***/ }), /***/ "./src/modules/24hour.js": /*!*******************************!*\ !*** ./src/modules/24hour.js ***! \*******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /* harmony default export */ __webpack_exports__["default"] = (new class TFHour { inject24Hour() { if (this.cancel24Hour) return; const twelveHour = new RegExp(`([0-9]{1,2}):([0-9]{1,2})\\s(AM|PM)`); const convert = data => { if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-6"]) return; const matched = data.returnValue.match(twelveHour); if (!matched || matched.length !== 4) return; if (matched[3] === "AM") return data.returnValue = data.returnValue.replace(matched[0], `${matched[1] === "12" ? "00" : matched[1].padStart(2, "0")}:${matched[2]}`); return data.returnValue = data.returnValue.replace(matched[0], `${matched[1] === "12" ? "12" : parseInt(matched[1]) + 12}:${matched[2]}`); }; const cancelCozy = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_1__["default"].TimeFormatter, "calendarFormat", { after: convert }); // Called in Cozy mode const cancelCompact = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_1__["default"].TimeFormatter, "dateFormat", { after: convert }); // Called in Compact mode this.cancel24Hour = () => { cancelCozy(); cancelCompact(); }; // Cancel both } remove24Hour() { if (this.cancel24Hour) this.cancel24Hour(); } }()); /***/ }), /***/ "./src/modules/AntiAdDM.js": /*!*********************************!*\ !*** ./src/modules/AntiAdDM.js ***! \*********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); const dispatcher = window.Lightcord.DiscordModules.dispatcher; const ChannelModule = BDModules.get(e => e.default && e.default.getChannel && e.default.hasChannel)[0].default; let relationShipModule = BDModules.get(e => e.default && e.default.addRelationship)[0]; let DMModule = BDModules.get(e => e.default && e.default.closePrivateChannel)[0]; const blocked = {}; let userModule = BDModules.get(e => e.default && e.default.getCurrentUser)[0]; function getCurrentUser() { if (userModule) return userModule.default.getCurrentUser(); return null; } /* harmony default export */ __webpack_exports__["default"] = (new class AntiBotDM { constructor() { this.antiDM = this.antiDM.bind(this); this.enabled = false; } enable() { if (this.enabled) return; this.enabled = true; dispatcher.subscribe("MESSAGE_CREATE", this.antiDM); } disable() { if (!this.enabled) return; this.enabled = false; dispatcher.unsubscribe("MESSAGE_CREATE", this.antiDM); } antiDM(ev) { if (!ev.message.author.bot) return; if (ev.message.author.id === getCurrentUser().id) if (ev.message.guild_id) return; const channel = ChannelModule.getChannel(ev.message.channel_id); if (!channel) return; // might be broken if (channel.type !== 1) return; if (blocked[ev.message.author.id]) return; // If the user unblock the bot, Don't block it again. if (scanMessage(ev.message)) { blocked[ev.message.author.id] = true; _utils__WEBPACK_IMPORTED_MODULE_0__["default"].showToast(`[AdBlock]: Blocked ${ev.message.author.username}#${ev.message.author.discriminator}`, { "type": "warning" }); if (!relationShipModule) relationShipModule = BDModules.get(e => e.default && e.default.addRelationship)[0]; relationShipModule.default.addRelationship(ev.message.author.id, { location: "ContextMenu" }, 2); if (!DMModule) DMModule = BDModules.get(e => e.default && e.default.closePrivateChannel)[0]; DMModule.default.closePrivateChannel(channel.id, false); } } }()); function scanMessage(message) { if (/(discord\.gg|discord\.com\/invite\/|discordapp\.com\/invite\/)/g.test(message.content)) return true; if (EmbedsContains(message, "discord.gg/") || EmbedsContains(message, "discord.com/invite/") || EmbedsContains(message, "discordapp.com/invite/")) return true; return false; } function EmbedsContains(message, search) { let embeds = message.embeds || []; if (embeds.length === 0) return false; return embeds.map(embed => { if (embed.type !== "rich") return false; if ((embed.title || "").includes(search)) return true; if ((embed.description || "").includes(search)) return true; if (((embed.footer || "") && embed.footer.text || "").includes(search)) return true; if ((embed.fields || []).map(e => { return e.value.includes(search) || e.name.includes(search); }).includes(true)) return true; return false; }).includes(true); } /***/ }), /***/ "./src/modules/CustomRichPresence.js": /*!*******************************************!*\ !*** ./src/modules/CustomRichPresence.js ***! \*******************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); const dispatcher = BDModules.get(m => m.Dispatcher && m.default && m.default.dispatch)[0].default; const ActionTypes = BDModules.get(m => m.ActionTypes)[0].ActionTypes; const socketId = "lightcord-spoof-socket"; const pid = process.pid; /* harmony default export */ __webpack_exports__["default"] = (new class CustomRichPresence { constructor() { this.enabled = false; this.game = _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"]; } get formatedGame() { if (!this.game) return null; if (this.enabled === false) return null; let game = { name: this.game.name || _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"].name, application_id: this.game.application_id || _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"].application_id, details: this.game.details || undefined, state: this.game.state || undefined, timestamps: this.game["timestamps.start"] ? { start: this.game["timestamps.start"] } : undefined, assets: this.game["assets.large"] ? { large_image: this.game["assets.large"], small_image: this.game["assets.small"] || undefined } : undefined }; return game; } sendGame() { dispatcher.dispatch({ type: ActionTypes.LOCAL_ACTIVITY_UPDATE, socketId, pid, activity: this.formatedGame }); } enable() { if (this.enabled) return; this.enabled = true; console.log("Enabling custom RichPresence"); this.set(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"] || Object.create(_0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"])); this.sendGame(); } disable() { if (!this.enabled) return; this.enabled = false; console.log("Disabling custom RichPresence"); this.sendGame(); } async fetchAssets(applicationId) { let assets = await BDModules.get(e => e.getAssets)[0].getAssets(applicationId); if (assets.undefined && typeof assets.undefined === "number") { throw new Error("Unknown Application"); } return assets; } set(activity) { this.game = activity; this.sendGame(); } }()); /***/ }), /***/ "./src/modules/bdApi.js": /*!******************************!*\ !*** ./src/modules/bdApi.js ***! \******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./core */ "./src/modules/core.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js"); /* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js"); /* harmony import */ var _pluginModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./pluginModule */ "./src/modules/pluginModule.js"); /* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.js"); /* harmony import */ var _settingsPanel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./settingsPanel */ "./src/modules/settingsPanel.js"); /* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js"); const BdApi = { get React() { return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].React; }, get ReactDOM() { return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].ReactDom; }, get ReactComponent() { return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].ReactComponent; }, get WindowConfigFile() { return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].WindowConfigFile; }, get settings() { return _0globals__WEBPACK_IMPORTED_MODULE_0__["settings"]; }, get emotes() { return null; }, // deprecated, deleted all emotes from betterdiscord. get screenWidth() { return Math.max(document.documentElement.clientWidth, window.innerWidth || 0); }, get screenHeight() { return Math.max(document.documentElement.clientHeight, window.innerHeight || 0); } }; BdApi.getAllWindowPreferences = function () { return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].getAllWindowPreferences(); }; BdApi.getWindowPreference = function (key) { return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].getWindowPreference(key); }; BdApi.setWindowPreference = function (key, value) { return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].setWindowPreference(key, value); }; //Inject CSS to document head //id = id of element //css = custom css BdApi.injectCSS = function (id, css) { _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addStyle(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id), css); }; //Clear css/remove any element //id = id of element BdApi.clearCSS = function (id) { _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeStyle(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id)); }; //Inject CSS to document head //id = id of element //css = custom css BdApi.linkJS = function (id, url) { _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addScript(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id), url); }; //Clear css/remove any element //id = id of element BdApi.unlinkJS = function (id) { _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeScript(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id)); }; //Get another plugin //name = name of plugin BdApi.getPlugin = function (name) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"].hasOwnProperty(name)) { return _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][name].plugin; } return null; }; //Get BetterDiscord Core BdApi.getCore = function () { _utils__WEBPACK_IMPORTED_MODULE_2__["default"].warn("Deprecation Notice", `BdApi.getCore() will be removed in future versions.`); return _core__WEBPACK_IMPORTED_MODULE_1__["default"]; }; /** * Shows a generic but very customizable modal. * @param {string} title - title of the modal * @param {string} content - a string of text to display in the modal */ BdApi.alert = function (title, content) { return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].showConfirmationModal(title, content, { cancelText: null }); }; /** * Shows a generic but very customizable confirmation modal with optional confirm and cancel callbacks. * @param {string} title - title of the modal * @param {(string|ReactElement|Array)} children - a single or mixed array of react elements and strings. Every string is wrapped in Discord's `Markdown` component so strings will show and render properly. * @param {object} [options] - options to modify the modal * @param {boolean} [options.danger=false] - whether the main button should be red or not * @param {string} [options.confirmText=Okay] - text for the confirmation/submit button * @param {string} [options.cancelText=Cancel] - text for the cancel button * @param {callable} [options.onConfirm=NOOP] - callback to occur when clicking the submit button * @param {callable} [options.onCancel=NOOP] - callback to occur when clicking the cancel button * @param {string} [options.key] - key used to identify the modal. If not provided, one is generated and returned * @returns {string} - the key used for this modal */ BdApi.showConfirmationModal = function (title, content, options = {}) { return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].showConfirmationModal(title, content, options); }; //Show toast alert BdApi.showToast = function (content, options = {}) { _utils__WEBPACK_IMPORTED_MODULE_2__["default"].showToast(content, options); }; // Finds module BdApi.findModule = function (filter) { return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.find(filter); }; // Finds module BdApi.findAllModules = function (filter) { return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findAll(filter); }; // Finds module BdApi.findModuleByProps = function (...props) { return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findByUniqueProperties(props); }; BdApi.findModuleByPrototypes = function (...protos) { return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findByPrototypes(protos); }; BdApi.findModuleByDisplayName = function (name) { return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findByDisplayName(name); }; // Gets react instance BdApi.getInternalInstance = function (node) { if (!(node instanceof window.jQuery) && !(node instanceof Element)) return undefined; if (node instanceof jQuery) node = node[0]; return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].getInternalInstance(node); }; // Gets data BdApi.loadData = function (pluginName, key) { return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].getPluginData(pluginName, key); }; BdApi.getData = BdApi.loadData; // Sets data BdApi.saveData = function (pluginName, key, data) { return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].setPluginData(pluginName, key, data); }; BdApi.setData = BdApi.saveData; // Deletes data BdApi.deleteData = function (pluginName, key) { return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].deletePluginData(pluginName, key); }; // Patches other functions BdApi.monkeyPatch = function (what, methodName, options) { return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(what, methodName, options); }; // Event when element is removed BdApi.onRemoved = function (node, callback) { return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].onRemoved(node, callback); }; // Wraps function in try..catch BdApi.suppressErrors = function (method, message) { return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].suppressErrors(method, message); }; // Tests for valid JSON BdApi.testJSON = function (data) { return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].testJSON(data); }; BdApi.isPluginEnabled = function (name) { return !!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name]; }; BdApi.isThemeEnabled = function (name) { return !!_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][name]; }; BdApi.isSettingEnabled = function (id) { return !!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][id]; }; BdApi.enableSetting = function (id) { return _settingsPanel__WEBPACK_IMPORTED_MODULE_7__["default"].onChange(id, true); }; BdApi.disableSetting = function (id) { return _settingsPanel__WEBPACK_IMPORTED_MODULE_7__["default"].onChange(id, false); }; BdApi.toggleSetting = function (id) { return _settingsPanel__WEBPACK_IMPORTED_MODULE_7__["default"].onChange(id, !_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][id]); }; // Gets data BdApi.getBDData = function (key) { return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].getBDData(key); }; // Sets data BdApi.setBDData = function (key, data) { return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].setBDData(key, data); }; const makeAddonAPI = (cookie, list, manager) => new class AddonAPI { get folder() { return manager.folder; } isEnabled(name) { return !!cookie[name]; } enable(name) { return manager.enable(name); } disable(name) { return manager.disable(name); } toggle(name) { if (cookie[name]) this.disable(name);else this.enable(name); } reload(name) { return manager.reload(name); } get(name) { if (list.hasOwnProperty(name)) { if (list[name].plugin) return list[name].plugin; return list[name]; } return null; } getAll() { return Object.keys(list).map(k => this.get(k)).filter(a => a); } }(); BdApi.Plugins = makeAddonAPI(_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"], _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"], _pluginModule__WEBPACK_IMPORTED_MODULE_5__["default"]); BdApi.Themes = makeAddonAPI(_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"], _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"], _themeModule__WEBPACK_IMPORTED_MODULE_6__["default"]); /* harmony default export */ __webpack_exports__["default"] = (BdApi); window.Lightcord.BetterDiscord.BdApi = BdApi; /***/ }), /***/ "./src/modules/bdEvents.js": /*!*********************************!*\ !*** ./src/modules/bdEvents.js ***! \*********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* BDEvents */ const EventEmitter = __webpack_require__(/*! events */ "events"); /* harmony default export */ __webpack_exports__["default"] = (new class BDEvents extends EventEmitter { constructor() { super(); window.Lightcord.BetterDiscord.BDEvents = this; } dispatch(eventName, ...args) { this.emit(eventName, ...args); } off(eventName, eventAction) { this.removeListener(eventName, eventAction); } }()); /***/ }), /***/ "./src/modules/blurPrivate.js": /*!************************************!*\ !*** ./src/modules/blurPrivate.js ***! \************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /** * Credits to @hellbound1337 on github for the css */ let selectors; const removeDa = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].removeDa; function getSelectors() { let standardSidebarView = BDModules.get(e => e.standardSidebarView)[0]; if (!standardSidebarView) return null; let defaultClassName = removeDa(standardSidebarView.standardSidebarView); let selects = []; let userSettingsAccount = BDModules.get(e => e.userSettingsAccount)[0]; const children = BDModules.get(e => typeof e.children === "string")[0]; selects.push(`#app-mount .${defaultClassName} .payment-info .${removeDa(BDModules.get(e => e.description && typeof e.description === "string" && e.description.includes("formText"))[0].description)}`); selects.push(`#app-mount .${defaultClassName} .${removeDa(BDModules.get(e => e.paymentSourceRow)[0].paymentSourceRow)} .${removeDa(BDModules.get(e => e.subText && e.descriptionWrapper)[0].subText)}`); if (userSettingsAccount) { selects.push(`#app-mount .${defaultClassName} .${removeDa(userSettingsAccount.userSettingsAccount)} div:nth-child(2)>div:nth-child(2)>.${removeDa(BDModules.get(e => e.viewBody)[0].viewBody)}`); selects.push(`.${removeDa(userSettingsAccount.userSettingsSecurity)} .${removeDa(children.children)} > div:nth-child(2)`); } console.log(selects); return selects; } /* harmony default export */ __webpack_exports__["default"] = (new class BlurPrivate { constructor() { this.enabled = false; } enable() { if (this.enabled) return; this.enabled = true; selectors = selectors || getSelectors(); if (!selectors) console.error(new Error("Couldn't find selectors to blur personnal informations.")); _domtools__WEBPACK_IMPORTED_MODULE_0__["default"].addStyle("blurPrivate", ` ${selectors.join(", ")} { transition: all 150ms cubic-bezier(.55,.085,.68,.53); filter: blur(4px); opacity: .8; } ${selectors.map(e => e + ":hover").join(", ")} { transition: all 150ms cubic-bezier(.55,.09,.68,.53); filter: none; opacity: 1; }`); } disable() { if (!this.enabled) return; this.enabled = false; _domtools__WEBPACK_IMPORTED_MODULE_0__["default"].removeStyle("blurPrivate"); } }()); /***/ }), /***/ "./src/modules/classNormalizer.js": /*!****************************************!*\ !*** ./src/modules/classNormalizer.js ***! \****************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js"); const normalizedPrefix = "da"; const randClass = new RegExp(`^(?!${normalizedPrefix}-)((?:[A-Za-z]|[0-9]|-)+)-(?:[A-Za-z]|[0-9]|-|_){6}$`); /* harmony default export */ __webpack_exports__["default"] = (new class ClassNormalizer { constructor() { window.Lightcord.BetterDiscord.ClassNormalizer = this; } stop() { if (!this.hasPatched) return; this.unpatchClassModules(_webpackModules__WEBPACK_IMPORTED_MODULE_0__["default"].findAll(this.moduleFilter.bind(this))); this.revertElement(document.querySelector("#app-mount")); this.hasPatched = false; } start() { if (this.hasPatched) return; this.patchClassModules(_webpackModules__WEBPACK_IMPORTED_MODULE_0__["default"].findAll(this.moduleFilter.bind(this))); this.normalizeElement(document.querySelector("#app-mount")); this.hasPatched = true; this.patchDOMMethods(); } patchClassModules(modules) { for (const module of modules) { this.patchClassModule(normalizedPrefix, module); } } unpatchClassModules(modules) { for (const module of modules) { this.unpatchClassModule(normalizedPrefix, module); } } shouldIgnore(value) { if (!isNaN(value)) return true; if (value.endsWith("px") || value.endsWith("ch") || value.endsWith("em") || value.endsWith("ms")) return true; if (value.startsWith("layerContainer-")) return true; if (value.startsWith("#") && (value.length == 7 || value.length == 4)) return true; if (value.includes("calc(") || value.includes("rgba")) return true; return false; } moduleFilter(module) { if (typeof module !== "object" || Array.isArray(module)) return false; if (module.__esModule) return false; if (!Object.keys(module).length) return false; for (const baseClassName in module) { const value = module[baseClassName]; if (typeof value !== "string") return false; if (this.shouldIgnore(value)) continue; if (value.split("-").length === 1) return false; if (!randClass.test(value.split(" ")[0])) return false; } return true; } patchClassModule(componentName, classNames) { for (const baseClassName in classNames) { const value = classNames[baseClassName]; if (this.shouldIgnore(value)) continue; const classList = value.split(" "); for (const normalClass of classList) { const match = normalClass.match(randClass); if (!match || !match.length || match.length < 2) continue; // Shouldn't ever happen since they passed the moduleFilter, but you never know const camelCase = match[1].split("-").map((s, i) => i ? s[0].toUpperCase() + s.slice(1) : s).join(""); classNames[baseClassName] += ` ${componentName}-${camelCase}`; } } } unpatchClassModule(componentName, classNames) { for (const baseClassName in classNames) { const value = classNames[baseClassName]; if (this.shouldIgnore(value)) continue; let newString = ""; const classList = value.split(" "); for (const normalClass of classList) { if (normalClass.startsWith(`${componentName}-`)) continue; newString += ` ${normalClass}`; } classNames[baseClassName] = newString.trim(); } } normalizeElement(element) { if (!(element instanceof Element)) return; const classes = element.classList; for (let c = 0, clen = classes.length; c < clen; c++) { if (!randClass.test(classes[c])) continue; const match = classes[c].match(randClass)[1]; const newClass = match.split("-").map((s, i) => i ? s[0].toUpperCase() + s.slice(1) : s).join(""); element.classList.add(`${normalizedPrefix}-${newClass}`); } for (const child of element.children) this.normalizeElement(child); } revertElement(element) { if (!(element instanceof Element)) return; if (element.children && element.children.length) this.revertElement(element.children[0]); if (element.nextElementSibling) this.revertElement(element.nextElementSibling); const classes = element.classList; const toRemove = []; for (let c = 0; c < classes.length; c++) { if (classes[c].startsWith(`${normalizedPrefix}-`)) toRemove.push(classes[c]); } element.classList.remove(...toRemove); } patchDOMMethods() { const contains = DOMTokenList.prototype.contains; DOMTokenList.prototype.contains = function (token) { // const tokens = token.split(" "); return Reflect.apply(contains, this, [token.split(" ")[0]]); // return tokens.every(t => contains.call(this, t)); }; const add = DOMTokenList.prototype.add; DOMTokenList.prototype.add = function (...tokens) { for (let t = 0; t < tokens.length; t++) { tokens[t] = tokens[t].split(" ")[0]; } return Reflect.apply(add, this, tokens); }; const remove = DOMTokenList.prototype.remove; DOMTokenList.prototype.remove = function (...tokens) { for (let t = 0; t < tokens.length; t++) { tokens[t] = tokens[t].split(" ")[0]; } return Reflect.apply(remove, this, tokens); }; } }()); /***/ }), /***/ "./src/modules/coloredText.js": /*!************************************!*\ !*** ./src/modules/coloredText.js ***! \************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /* harmony default export */ __webpack_exports__["default"] = (new class ColoredText { injectColoredText() { if (this.cancelColoredText) return; if (!_v2__WEBPACK_IMPORTED_MODULE_1__["default"].MessageComponent) return; this.cancelColoredText = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_1__["default"].MessageComponent, "default", { before: data => { const props = data.methodArguments[0]; if (!props || !props.childrenMessageContent) return; const messageContent = props.childrenMessageContent; if (!messageContent.type || !messageContent.type.type || messageContent.type.type.displayName != "MessageContent") return; const originalType = messageContent.type.type; if (originalType.__originalMethod) return; // Don't patch again messageContent.type.type = function (props) { const returnValue = originalType(props); const roleColor = _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-7"] ? props.message.colorString || "" : ""; returnValue.props.style = { color: roleColor }; return returnValue; }; messageContent.type.type.__originalMethod = originalType; Object.assign(messageContent.type.type, originalType); } }); } removeColoredText() { let classNameMarkup = BDModules.get(e => e.markup)[0].markup; document.querySelectorAll("." + classNameMarkup.split(" ")[0]).forEach(elem => { elem.style.setProperty("color", ""); }); } }()); /***/ }), /***/ "./src/modules/contentManager.js": /*!***************************************!*\ !*** ./src/modules/contentManager.js ***! \***************************************/ /*! exports provided: addonCache, default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addonCache", function() { return addonCache; }); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _pluginModule__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pluginModule */ "./src/modules/pluginModule.js"); /* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js"); /* harmony import */ var _pluginCertifier__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./pluginCertifier */ "./src/modules/pluginCertifier.js"); const path = __webpack_require__(/*! path */ "path"); const fs = __webpack_require__(/*! fs */ "fs"); const Module = __webpack_require__(/*! module */ "module").Module; Module.globalPaths.push(path.resolve(__webpack_require__(/*! electron */ "electron").remote.app.getAppPath(), "node_modules")); class MetaError extends Error { constructor(message) { super(message); this.name = "MetaError"; } } const originalJSRequire = Module._extensions[".js"]; const originalCSSRequire = Module._extensions[".css"] ? Module._extensions[".css"] : () => { return null; }; const splitRegex = /[^\S\r\n]*?(?:\r\n|\n)[^\S\r\n]*?\*[^\S\r\n]?/; const escapedAtRegex = /^\\@/; let addonCache = {}; let hasPatched = false; /* harmony default export */ __webpack_exports__["default"] = (new class ContentManager { constructor() { this.timeCache = {}; this.watchers = {}; } patchExtensions() { if (hasPatched) return; hasPatched = true; Module._extensions[".js"] = this.getContentRequire("plugin"); Module._extensions[".css"] = this.getContentRequire("theme"); } get pluginsFolder() { return this._pluginsFolder || (this._pluginsFolder = fs.realpathSync(path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath + "plugins/"))); } get themesFolder() { return this._themesFolder || (this._themesFolder = fs.realpathSync(path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath + "themes/"))); } loadAddonCertifierCache() { if (typeof _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].getSettingGroup("PluginCertifierHashes") !== "string") { _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].setSettingGroup("PluginCertifierHashes", Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_5__["encryptSettingsCache"])("{}")); } else { try { addonCache = JSON.parse(Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_5__["decryptSettingsCache"])(_dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].getSettingGroup("PluginCertifierHashes"))); } catch (e) { _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].setSettingGroup("PluginCertifierHashes", Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_5__["encryptSettingsCache"])("{}")); addonCache = {}; } } Object.keys(addonCache).forEach(key => { let value = addonCache[key]; if (!value || typeof value !== "object" || Array.isArray(value)) return delete addonCache[key]; let props = [{ key: "timestamp", type: "number" }, { key: "result", type: "object" }, { key: "hash", type: "string" }]; for (let prop of props) { if (!(prop.key in value) || typeof value[prop.key] !== prop.type) { delete addonCache[key]; return; } } if (value.hash !== key) { delete addonCache[key]; return; } if (value.result.suspect) { // refetch from remote to be sure you're up to date. delete addonCache[key]; return; } }); this.saveAddonCache(); } saveAddonCache() { _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].setSettingGroup("PluginCertifierHashes", Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_5__["encryptSettingsCache"])(JSON.stringify(addonCache))); } watchContent(contentType) { if (this.watchers[contentType]) return; const isPlugin = contentType === "plugin"; const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder; const fileEnding = isPlugin ? ".plugin.js" : ".theme.css"; this.watchers[contentType] = fs.watch(baseFolder, { persistent: false }, async (eventType, filename) => { if (!eventType || !filename || !filename.endsWith(fileEnding)) return; await new Promise(r => setTimeout(r, 50)); try { fs.statSync(path.resolve(baseFolder, filename)); } catch (err) { if (err.code !== "ENOENT") return; delete this.timeCache[filename]; if (isPlugin) return _pluginModule__WEBPACK_IMPORTED_MODULE_1__["default"].unloadPlugin(filename); return _themeModule__WEBPACK_IMPORTED_MODULE_2__["default"].unloadTheme(filename); } if (!fs.statSync(path.resolve(baseFolder, filename)).isFile()) return; const stats = fs.statSync(path.resolve(baseFolder, filename)); if (!stats || !stats.mtime || !stats.mtime.getTime()) return; if (typeof stats.mtime.getTime() !== "number") return; if (this.timeCache[filename] == stats.mtime.getTime()) return; this.timeCache[filename] = stats.mtime.getTime(); if (eventType == "rename") { if (isPlugin) await _pluginModule__WEBPACK_IMPORTED_MODULE_1__["default"].loadPlugin(filename);else await _themeModule__WEBPACK_IMPORTED_MODULE_2__["default"].loadTheme(filename); } if (eventType == "change") { if (isPlugin) await _pluginModule__WEBPACK_IMPORTED_MODULE_1__["default"].reloadPlugin(filename);else await _themeModule__WEBPACK_IMPORTED_MODULE_2__["default"].reloadTheme(filename); } }); } unwatchContent(contentType) { if (!this.watchers[contentType]) return; this.watchers[contentType].close(); delete this.watchers[contentType]; } extractMeta(content) { const firstLine = content.split("\n")[0]; const hasOldMeta = firstLine.includes("//META"); if (hasOldMeta) return this.parseOldMeta(content); const hasNewMeta = firstLine.includes("/**"); if (hasNewMeta) return this.parseNewMeta(content); throw new MetaError("META was not found."); } parseOldMeta(content) { const meta = content.split("\n")[0]; const rawMeta = meta.substring(meta.lastIndexOf("//META") + 6, meta.lastIndexOf("*//")); if (meta.indexOf("META") < 0) throw new MetaError("META was not found."); const parsed = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].testJSON(rawMeta); if (!parsed) throw new MetaError("META could not be parsed."); if (!parsed.name) throw new MetaError("META missing name data."); parsed.format = "json"; return parsed; } parseNewMeta(content) { const block = content.split("/**", 2)[1].split("*/", 1)[0]; const out = {}; let field = ""; let accum = ""; for (const line of block.split(splitRegex)) { if (line.length === 0) continue; if (line.charAt(0) === "@" && line.charAt(1) !== " ") { out[field] = accum; const l = line.indexOf(" "); field = line.substr(1, l - 1); accum = line.substr(l + 1); } else { accum += " " + line.replace("\\n", "\n").replace(escapedAtRegex, "@"); } } out[field] = accum.trim(); delete out[""]; out.format = "jsdoc"; return out; } getContentRequire(type) { const isPlugin = type === "plugin"; const self = this; const originalRequire = isPlugin ? originalJSRequire : originalCSSRequire; return function (module, filename) { const baseFolder = isPlugin ? self.pluginsFolder : self.themesFolder; const possiblePath = path.resolve(baseFolder, path.basename(filename)); if (!fs.existsSync(possiblePath) || filename !== fs.realpathSync(possiblePath)) return Reflect.apply(originalRequire, this, arguments); let content = fs.readFileSync(filename, "utf8"); content = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].stripBOM(content); const stats = fs.statSync(filename); const meta = self.extractMeta(content); meta.filename = path.basename(filename); meta.added = stats.atimeMs; meta.modified = stats.mtimeMs; meta.size = stats.size; if (!isPlugin) { meta.css = content; if (meta.format == "json") meta.css = meta.css.split("\n").slice(1).join("\n"); content = `module.exports = ${JSON.stringify(meta)};`; } if (isPlugin) { module._compile(content, module.filename); const didExport = !_utils__WEBPACK_IMPORTED_MODULE_3__["default"].isEmpty(module.exports); if (didExport) { meta.type = module.exports; module.exports = meta; content = ""; } else { _utils__WEBPACK_IMPORTED_MODULE_3__["default"].warn("Module Not Exported", `${meta.name}, please start setting module.exports`); content += `\nmodule.exports = ${JSON.stringify(meta)};\nmodule.exports.type = ${meta.exports || meta.name};`; } } module._compile(content, filename); }; } makePlaceholderPlugin(data) { return { plugin: { start: () => {}, getName: () => { return data.name || data.filename; }, getAuthor: () => { return "???"; }, getDescription: () => { return data.message ? data.message : "This plugin was unable to be loaded. Check the author's page for updates."; }, getVersion: () => { return "???"; } }, name: data.name || data.filename, filename: data.filename, source: data.source ? data.source : "", website: data.website ? data.website : "" }; } async loadContent(filename, type) { if (typeof filename === "undefined" || typeof type === "undefined") return; const isPlugin = type === "plugin"; const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder; if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-6"]) { let result = await new Promise(resolve => { Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_5__["processFile"])(path.resolve(baseFolder, filename), result => { console.log(result); resolve(result); }, hash => { resolve({ suspect: false, hash: hash, filename: filename, name: filename }); }, true); }); if (result) { addonCache[result.hash] = { timestamp: Date.now(), hash: result.hash, result: result }; this.saveAddonCache(); if (result.suspect) { return { name: filename, file: filename, message: "This plugin might be dangerous (" + result.harm + ").", error: new Error("This plugin might be dangerous (" + result.harm + ").") }; } } } try { window.require(path.resolve(baseFolder, filename)); } catch (error) { return { name: filename, file: filename, message: "Could not be compiled.", error: { message: error.message, stack: error.stack } }; } const content = window.require(path.resolve(baseFolder, filename)); if (!content.name) return { name: filename, file: filename, message: "Cannot escape the ID.", error: new Error("Cannot read property 'replace' of undefined") }; content.id = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].escapeID(content.name); //if(!id)return {name: filename, file: filename, message: "Invalid ID", error: new Error("Please fix the name of "+filename+". BetterDiscord can't escape an ID.")} if (isPlugin) { if (!content.type) return; try { content.plugin = new content.type(); delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][content.plugin.getName()]; _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][content.plugin.getName()] = content; } catch (error) { return { name: filename, file: filename, message: "Could not be constructed.", error: { message: error.message, stack: error.stack } }; } } else { delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][content.name]; _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][content.name] = content; } } unloadContent(filename, type) { if (typeof filename === "undefined" || typeof type === "undefined") return; const isPlugin = type === "plugin"; const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder; try { delete window.require.cache[window.require.resolve(path.resolve(baseFolder, filename))]; } catch (err) { return { name: filename, file: filename, message: "Could not be unloaded.", error: { message: err.message, stack: err.stack } }; } } isLoaded(filename, type) { const isPlugin = type === "plugin"; const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder; try { window.require.cache[window.require.resolve(path.resolve(baseFolder, filename))]; } catch (err) { return false; } return true; } async reloadContent(filename, type) { const cantUnload = this.unloadContent(filename, type); if (cantUnload) return cantUnload; return await this.loadContent(filename, type); } loadNewContent(type) { const isPlugin = type === "plugin"; const fileEnding = isPlugin ? ".plugin.js" : ".theme.css"; const basedir = isPlugin ? this.pluginsFolder : this.themesFolder; const files = fs.readdirSync(basedir); const contentList = Object.values(isPlugin ? _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"] : _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]); const removed = contentList.filter(t => !files.includes(t.filename)).map(c => isPlugin ? c.plugin.getName() : c.name); const added = files.filter(f => !contentList.find(t => t.filename == f) && f.endsWith(fileEnding) && fs.statSync(path.resolve(basedir, f)).isFile()); return { added, removed }; } async loadAllContent(type) { this.patchExtensions(); const isPlugin = type === "plugin"; const fileEnding = isPlugin ? ".plugin.js" : ".theme.css"; const basedir = isPlugin ? this.pluginsFolder : this.themesFolder; const errors = []; const files = fs.readdirSync(basedir); for (const filename of files) { if (!fs.statSync(path.resolve(basedir, filename)).isFile() || !filename.endsWith(fileEnding)) continue; const error = await this.loadContent(filename, type); if (error) errors.push(error); } return errors; } loadPlugins() { return this.loadAllContent("plugin"); } loadThemes() { return this.loadAllContent("theme"); } }()); /** * Don't expose contentManager - could be dangerous for now */ /***/ }), /***/ "./src/modules/core.js": /*!*****************************!*\ !*** ./src/modules/core.js ***! \*****************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js"); /* harmony import */ var _settingsPanel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./settingsPanel */ "./src/modules/settingsPanel.js"); /* harmony import */ var _pluginModule__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./pluginModule */ "./src/modules/pluginModule.js"); /* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.js"); /* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js"); /* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js"); /* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js"); /* harmony import */ var _ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../ui/bdLogo */ "./src/ui/bdLogo.js"); /* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../ui/tooltipWrap */ "./src/ui/tooltipWrap.js"); /* harmony import */ var _svg_lightcord__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../svg/lightcord */ "./src/svg/lightcord.jsx"); /* harmony import */ var _pluginCertifier__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./pluginCertifier */ "./src/modules/pluginCertifier.js"); /* harmony import */ var _distant__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./distant */ "./src/modules/distant.js"); /* harmony import */ var _emojiModule__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./emojiModule */ "./src/modules/emojiModule.js"); /* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! electron */ "electron"); /* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_15__); /* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js"); let methods; function Core() {} Core.prototype.setConfig = function (config) { if (this.hasStarted) return; Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"], config); }; Object.defineProperty(Core.prototype, "methods", { get() { return methods; } }); Core.prototype.setMethods = function (m) { if (this.hasStarted) return; methods = m; }; Core.prototype.init = async function () { if (this.hasStarted) return; this.hasStarted = true; if (!Array.prototype.flat) { _utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BetterDiscord v" + _0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"] + " does not support this old version (" + _0globals__WEBPACK_IMPORTED_MODULE_0__["currentDiscordVersion"] + ") of Discord. Please update your Discord installation before proceeding."); return; } if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].version < _0globals__WEBPACK_IMPORTED_MODULE_0__["minSupportedVersion"]) { _utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BetterDiscord v" + _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].version + " (your version)" + " is not supported by the latest js (" + _0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"] + ").

Please download the latest version from GitHub"); return; } if (window.ED) { _utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BandagedBD does not work with EnhancedDiscord. Please uninstall one of them."); return; } if (window.WebSocket && window.WebSocket.name && window.WebSocket.name.includes("Patched")) { _utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BandagedBD does not work with Powercord. Please uninstall one of them."); return; } _utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchAttributes.bind(this), "LC Plugin Certifier Patch")(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Initializing Settings"); this.initSettings(); await this.checkForGuilds(); _v2__WEBPACK_IMPORTED_MODULE_2__["default"].initialize(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Updating Settings"); _settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].initializeSettings(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Loading Addons Cache"); await _contentManager__WEBPACK_IMPORTED_MODULE_16__["default"].loadAddonCertifierCache(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Loading Plugins"); await _pluginModule__WEBPACK_IMPORTED_MODULE_4__["default"].loadPlugins(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Loading Themes"); await _themeModule__WEBPACK_IMPORTED_MODULE_5__["default"].loadThemes(); _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addStyle("customcss", Buffer.from(_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getBDData("bdcustomcss"), "base64").toString("utf8")); window.addEventListener("beforeunload", function () { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-dc-0"]) document.querySelector(".btn.btn-disconnect").click(); }); _pluginCertifier__WEBPACK_IMPORTED_MODULE_12__["default"].start(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Removing Loading Icon"); if (document.getElementsByClassName("bd-loaderv2").length) document.getElementsByClassName("bd-loaderv2")[0].remove(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Initializing Main Observer"); this.initObserver(); // Show loading errors if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) { _utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Collecting Startup Errors"); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].showContentErrors({ plugins: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"], themes: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemeErrors"] }); } const previousVersion = _dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getBDData("version"); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"] > previousVersion) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdChangelog"]) this.showChangelogModal(_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdChangelog"]); _dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].setBDData("version", _0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"]); } _emojiModule__WEBPACK_IMPORTED_MODULE_14__["default"].start(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchSocial.bind(this), "BD Social Patch")(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchGuildPills.bind(this), "BD Guild Pills Patch")(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchGuildListItems.bind(this), "BD Guild List Items Patch")(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchGuildSeparator.bind(this), "BD Guild Separator Patch")(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchMessageHeader.bind(this), "BD Badge Chat Patch")(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchMemberList.bind(this), "BD Badge Member List Patch")(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchAttachment.bind(this), "LC Plugin Certifier Patch")(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchPopoutWindow.bind(this), "BD Popout Window Patch")(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].haveInstalledDefault) { let alert = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("First Installation", "As it is the first time you install Lightcord, We added two default themes and one default plugin in your plugin/theme folder. Check it in the Plugin/Theme settings."); await new Promise(resolve => { alert.onClose(resolve); }); } const logo = document.querySelector("#app-mount > div.typeWindows-1za-n7.withFrame-haYltI.titleBar-AC4pGV.horizontalReverse-3tRjY7.flex-1O1GKY.directionRowReverse-m8IjIq.justifyStart-2NDFzi.alignStretch-DpGPf3.da-typeWindows.da-withFrame.da-titleBar.da-horizontalReverse.da-flex.da-directionRowReverse.da-justifyStart.da-alignStretch > div.wordmarkWindows-1v0lYD.wordmark-2iDDfm.da-wordmarkWindows.da-wordmark"); if (logo) { logo.style.top = "3px"; logo.innerHTML = ` `; } }; Core.prototype.patchPopoutWindow = async function () { let canceled = false; this.cancelPatchPopoutWindow = () => { canceled = true; }; window.Lightcord.Api.ensureExported(e => e.default && e.default.getWindow).then(popoutModule => { if (canceled) return; /* // Not a good idea to do it like that. const interceptor = window.Lightcord.DiscordModules.dispatcher._interceptor window.Lightcord.DiscordModules.dispatcher.setInterceptor(function(action){ if(action && action.type === "POPOUT_WINDOW_OPEN"){ const render = action.render action.render = function(){ const render1 = render.call(this, ...arguments) const type1 = render1.type render1.type = function(props){ const render2 = type1(props) console.log(props, render2) return render2 } console.log(render1) return render1 } } return interceptor.call(this, action) }) window.Lightcord.DiscordModules.dispatcher.subscribe("POPOUT_WINDOW_OPEN", (ev) => { if(!settingsCookie["lightcord-9"])return if(canceled)return Utils.log("POPOUT THEME", "Popout opened, Adding theme") setImmediate(() => { console.log(ev) const window = popoutModule.default.getWindow(ev.key) console.log(window) }) })*/ }); }; Core.prototype.patchAttributes = async function () { let attribsPatchs = []; this.cancelPatchAttributes = function () { attribsPatchs.forEach(e => e()); }; while (!_v2__WEBPACK_IMPORTED_MODULE_2__["default"].MessageComponent) await new Promise(resolve => setTimeout(resolve, 100)); // TODO: try to patch correctly the user popout on a next update const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor"); window.Lightcord.Api.ensureExported(e => e.default && e.default.displayName === "DiscordTag").then(DiscordTag => { let DiscordTagComp = DiscordTag.default; DiscordTag.default = function (props) { let returnValue = DiscordTagComp(props); let id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])(); let badgeDiv = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", { style: { display: "inline", marginTop: "5px" } }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("span", { id: "badges-" + id, key: "badges-" + id, style: { display: "inherit" } })); let children = [returnValue]; if (props.user.id === "249746236008169473") { // Rauenzi: BandagedBD Developer children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], { color: "black", side: "top", text: "BandagedBD Developer" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, { className: "bd-chat-badge", href: "https://github.com/rauenzi/BetterDiscordApp", title: "BandagedBD", target: "_blank" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__["default"], { size: "16px", className: "bd-logo" })))); } else if (props.user.id === "696481194443014174" || props.user.id === "696003456611385396") { // Not Thomiz: Lightcord Developer, Phorcys: Lightcord Developer children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], { color: "black", side: "top", text: "Lightcord Developer" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, { className: "bd-chat-badge", href: "https://github.com/Lightcord/Lightcord", title: "Lightcord", target: "_blank" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_svg_lightcord__WEBPACK_IMPORTED_MODULE_11__["default"], { size: "16px", className: "bd-logo" })))); } children.push(badgeDiv); let div = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", { style: { display: "block" } }, children); applyBadges(id, props.user, false); return div; }; }); attribsPatchs.push(_utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].MessageComponent, "default", { after: data => { if (data.methodArguments[0].childrenMessageContent.props.message) { // this can be a blocked message (not opened) data.returnValue.props["data-message-id"] = data.methodArguments[0].childrenMessageContent.props.message.id; } } })); /* attribsPatchs.push(Utils.monkeyPatch(v2.MessageComponent, "default", {after: (data) => { data.returnValue.props["message-id"] = data.methodArguments[0].childrenMessageContent.props.message.id }}))*/ }; Core.prototype.checkForGuilds = function () { let timesChecked = 0; return new Promise(resolve => { const checkForGuilds = function () { const wrapper = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].guildClasses.wrapper.split(" ")[0]; if (document.querySelectorAll(`.${wrapper}`).length > 0) timesChecked++; const guild = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].guildClasses.listItem.split(" ")[0]; const blob = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].guildClasses.blobContainer.split(" ")[0]; if (document.querySelectorAll(`.${wrapper} .${guild} .${blob}`).length > 0) return resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].deferLoaded = true);else if (timesChecked >= 50) return resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].deferLoaded = true); setTimeout(checkForGuilds, 100); }; if (document.readyState != "loading") setTimeout(checkForGuilds, 100); document.addEventListener("DOMContentLoaded", () => { setTimeout(checkForGuilds, 100); }); }); }; Core.prototype.injectExternals = async function () {// No externals }; Core.prototype.initSettings = function () { _dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].initialize(); if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("settings") && !_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("rpc")) { if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("settings")) { Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"], _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultCookie"]); } if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("rpc")) { Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"], _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"]); } _settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].saveSettings(); } else { _settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].loadSettings(); for (const setting in _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultCookie"]) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting] == undefined) { _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting] = _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultCookie"][setting]; _settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].saveSettings(); } } } window.Lightcord.Api.ensureExported(e => e.default && e.default.prototype && e.default.prototype.getPredicateSections).then(settingModule => { let getPredicateSections = settingModule.default.prototype.getPredicateSections; settingModule.default.prototype.getPredicateSections = function () { let result = getPredicateSections.call(this, ...arguments); if (!result[1]) return result; if (result[1].section === "My Account") { // user settings, not guild settings let poped = []; poped.push(result.pop()); poped.push(result.pop()); poped.push(result.pop()); poped.push(result.pop()); result.push(..._settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].renderSidebar(this)); while (poped[0]) { result.push(poped.pop()); } } return result; }; }); }; let classNameLayer; let classNameSocialLinks; let classNameModal; Core.prototype.initObserver = function () { const mainObserver = new MutationObserver(mutations => { for (let i = 0, mlen = mutations.length; i < mlen; i++) { const mutation = mutations[i]; if (typeof _pluginModule__WEBPACK_IMPORTED_MODULE_4__["default"] !== "undefined") _pluginModule__WEBPACK_IMPORTED_MODULE_4__["default"].rawObserver(mutation); // if there was nothing added, skip if (!mutation.addedNodes.length || !(mutation.addedNodes[0] instanceof Element)) continue; const node = mutation.addedNodes[0]; if (!classNameLayer) classNameLayer = BDModules.get(e => e.layer && typeof e.layer === "string" && e.animating)[0].layer; if (!classNameSocialLinks) classNameSocialLinks = BDModules.get(e => e.socialLinks && typeof e.socialLinks === "string")[0].socialLinks; if (!classNameModal) classNameModal = BDModules.get(e => e.modal && typeof e.modal === "string" && e.inner && typeof e.inner === "string" && !e.responsiveWidthMobile)[0].modal; if (node.classList.contains(classNameLayer)) { if (node.getAttribute("aria-label") === "GUILD_SETTINGS") { node.setAttribute("layer-id", "server-settings"); node.setAttribute("id", "server-settings"); } if (node.getElementsByClassName(classNameSocialLinks).length) { node.setAttribute("layer-id", "user-settings"); node.setAttribute("id", "user-settings"); } } if (node.parentElement == document.body && node.querySelector("#ace_settingsmenu")) node.id = "ace_settingsmenu_container"; // Emoji Picker //node.getElementsByClassName("emojiPicker-3m1S-j").length && !node.querySelector(".emojiPicker-3m1S-j").parentElement.classList.contains("animatorLeft-1EQxU0") //if (node.classList.contains(classNameLayer2) && node.getElementsByClassName(classNameEmojiPicker).length && !node.querySelector("."+classNameEmojiPicker).parentElement.classList.contains(classNameAnimatorLeft)) quickEmoteMenu.obsCallback(node); } }); mainObserver.observe(document, { childList: true, subtree: true }); }; Core.prototype.showChangelogModal = function (options = {}) { return _utils__WEBPACK_IMPORTED_MODULE_1__["default"].showChangelogModal(options); }; Core.prototype.alert = function (title, content) { return _utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert(title, content); }; Core.prototype.patchSocial = function () { if (this.socialPatch) return; const TabBar = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "TabBar"); const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor"); if (!TabBar) return; this.socialPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(TabBar.prototype, "render", { after: data => { const children = data.returnValue.props.children; if (!children || !children.length || children.length < 3) return; if (children[children.length - 3].type.displayName !== "Separator") return; if (!children[children.length - 2].type.toString().includes("socialLinks")) return; if (Anchor) { let socialModule1 = BDModules.get(e => e.socialLinks)[0]; const original = children[children.length - 2].type; const newOne = function () { const returnVal = original(...arguments); returnVal.props.children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], { color: "black", side: "top", text: "Lightcord" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, { className: "bd-social-link " + socialModule1.link, href: "https://github.com/Lightcord/Lightcord", title: "Lightcord", target: "_blank" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_svg_lightcord__WEBPACK_IMPORTED_MODULE_11__["default"], { size: "16px", className: "bd-social-logo" })))); returnVal.props.children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], { color: "black", side: "top", text: "BandagedBD" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, { className: "bd-social-link " + socialModule1.link, href: "https://github.com/rauenzi/BetterDiscordApp", title: "BandagedBD", target: "_blank" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__["default"], { size: "16px", className: "bd-social-logo" })))); return returnVal; }; children[children.length - 2].type = newOne; } let [classNameColorMuted, sizes, classNameVersionHash] = [BDModules.get(e => e.colorMuted)[0].colorMuted, BDModules.get(e => e.size32)[0], BDModules.get(e => e.versionHash)[0].versionHash]; const versionHash = `(${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].hash ? _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].hash.substring(0, 7) : _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].branch})`; const additional = [_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { className: `${classNameColorMuted} ${sizes.size12}` }, `Lightcord ${electron__WEBPACK_IMPORTED_MODULE_15__["remote"].getGlobal("BuildInfo").version} `, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", { className: classNameVersionHash + " da-versionHash" }, `(${(electron__WEBPACK_IMPORTED_MODULE_15__["remote"].getGlobal("BuildInfo").commit || "Unknown").slice(0, 7)})`)), _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { className: `${classNameColorMuted} ${sizes.size12}` }, `BBD ${_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"]} `, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", { className: classNameVersionHash + " da-versionHash" }, versionHash))]; const originalVersions = children[children.length - 1].type; children[children.length - 1].type = function () { const returnVal = originalVersions(...arguments); returnVal.props.children.splice(1, 0, additional); return returnVal; }; } }); }; const getGuildClasses = function () { const guildsWrapper = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("wrapper", "unreadMentionsBar"); const guilds = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("guildsError", "selected"); const pill = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("blobContainer"); return Object.assign({}, guildsWrapper, guilds, pill); }; Core.prototype.patchGuildListItems = function () { if (this.guildListItemsPatch) return; const GuildClasses = getGuildClasses(); const listItemClass = GuildClasses.listItem.split(" ")[0]; const blobClass = GuildClasses.blobContainer.split(" ")[0]; const reactInstance = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].getInternalInstance(document.querySelector(`.${listItemClass} .${blobClass}`).parentElement); const GuildComponent = reactInstance.return.type; if (!GuildComponent) return; this.guildListItemsPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(GuildComponent.prototype, "render", { after: data => { if (data.returnValue && data.thisObject) { const returnValue = data.returnValue; const guildData = data.thisObject.props; let className = returnValue.props.className; className += " bd-guild"; if (guildData.unread) className += " bd-unread"; if (guildData.selected) className += " bd-selected"; if (guildData.audio) className += " bd-audio"; if (guildData.video) className += " bd-video"; if (guildData.badge) className += " bd-badge"; if (guildData.animatable) className += " bd-animatable"; returnValue.props.className = className; return returnValue; } } }); }; Core.prototype.patchGuildPills = function () { if (this.guildPillPatch) return; const guildPill = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.default && !m.default.displayName && m.default.toString && m.default.toString().includes("translate3d")); if (!guildPill) return; this.guildPillPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(guildPill, "default", { after: data => { const props = data.methodArguments[0]; if (props.unread) data.returnValue.props.className += " bd-unread"; if (props.selected) data.returnValue.props.className += " bd-selected"; if (props.hovered) data.returnValue.props.className += " bd-hovered"; return data.returnValue; } }); }; Core.prototype.patchGuildSeparator = function () { if (this.guildSeparatorPatch) return; const Guilds = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByDisplayName("Guilds"); const guildComponents = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("renderListItem"); if (!guildComponents || !Guilds) return; const GuildSeparator = function () { const returnValue = guildComponents.Separator(...arguments); returnValue.props.className += " bd-guild-separator"; return returnValue; }; this.guildSeparatorPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(Guilds.prototype, "render", { after: data => { data.returnValue.props.children[1].props.children[3].type = GuildSeparator; } }); }; Core.prototype.patchAttachment = function () { if (this.AttachmentPatch) return; const Attachment = BDModules.get(e => e.default && e.default.displayName === "Attachment")[0]; // temporary const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor"); if (!Anchor || !Attachment || !Attachment.default) return; this.AttachmentPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(Attachment, "default", { after: data => { if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-6"]) return; const attachment = data.methodArguments[0] || null; const children = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.returnValue, "props.children"); if (!children || !attachment || !attachment.url) return; if (!Array.isArray(children)) return; const id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])(); children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", { id: "certified-" + id })); _pluginCertifier__WEBPACK_IMPORTED_MODULE_12__["default"].patch(attachment, "certified-" + id); } }); }; Core.prototype.patchMessageHeader = function () { if (this.messageHeaderPatch) return; const MessageHeader = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("MessageTimestamp"); const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor"); if (!Anchor || !MessageHeader || !MessageHeader.default) return; this.messageHeaderPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(MessageHeader, "default", { after: data => { const author = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.methodArguments[0], "message.author"); // const header = Utils.getNestedProp(data.returnValue, "props.children.1.props"); const children = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.returnValue, "props.children.1.props.children.1.props.children"); if (!children || !author || !author.id) return; // if (header && header.className) header.className += " " if (!Array.isArray(children)) return; if (author.id === "249746236008169473") { // Rauenzi: BandagedBD Developer children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], { color: "black", side: "top", text: "BandagedBD Developer" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, { className: "bd-chat-badge", href: "https://github.com/rauenzi/BetterDiscordApp", title: "BandagedBD", target: "_blank" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__["default"], { size: "16px", className: "bd-logo" })))); } else if (author.id === "696481194443014174" || author.id === "696003456611385396") { // Not Thomiz: Lightcord Developer, Phorcys: Lightcord Developer children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], { color: "black", side: "top", text: "Lightcord Developer" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, { className: "bd-chat-badge", href: "https://github.com/Lightcord/Lightcord", title: "Lightcord", target: "_blank" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_svg_lightcord__WEBPACK_IMPORTED_MODULE_11__["default"], { size: "16px", className: "bd-logo" })))); } const id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])(); children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", { id: "badges-" + id, style: { display: "inline" } })); applyBadges(id, author, true); } }); }; function applyBadges(id, user, chat) { process.nextTick(() => { const div = document.getElementById("badges-" + id); if (!div || div.childNodes.length > 0) return; if (div.childNodes.length) return; let blockDiv = document.createElement("div"); blockDiv.style.display = "none"; div.appendChild(blockDiv); const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor"); _distant__WEBPACK_IMPORTED_MODULE_13__["default"].getBadges(user.id).then(badges => { badges.forEach(badge => { const props = { svg: { size: "16px", className: "bd-logo", width: "16px" } }; badge.scopes.forEach(scope => { if (scope === "user") { // require user props.user = user; } }); if (!badge.href) { props.Anchor = Anchor; props.href = { className: chat ? "bd-chat-badge" : "bd-member-badge", title: badge.name, target: "_blank" }; } const element = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], { color: "black", side: "top", text: badge.name }, badge.href ? _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(Anchor, { href: badge.href, className: chat ? "bd-chat-badge" : "bd-member-badge", title: badge.name, target: "_blank" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(badge.component, props)) : _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(badge.component, props)); const div2 = document.createElement("div"); _v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.render(element, div2); div2.childNodes.forEach(node => { div.appendChild(node); }); }); }); }); } Core.prototype.patchMemberList = function () { if (this.memberListPatch) return; const MemberListItem = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByDisplayName("MemberListItem"); const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor"); if (!Anchor || !MemberListItem || !MemberListItem.prototype || !MemberListItem.prototype.renderDecorators) return; this.memberListPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(MemberListItem.prototype, "renderDecorators", { after: data => { const user = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.thisObject, "props.user"); const children = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.returnValue, "props.children"); if (!children || !user || !user.id) return; // if (header && header.className) header.className += " " if (!Array.isArray(children)) return; if (user.id === "249746236008169473") { children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], { color: "black", side: "top", text: "BandagedBD Developer" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, { className: "bd-member-badge", href: "https://github.com/rauenzi/BetterDiscordApp", title: "BandagedBD", target: "_blank" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__["default"], { size: "16px", className: "bd-logo" })))); } else if (user.id === "696481194443014174" || user.id === "696003456611385396") { children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], { color: "black", side: "top", text: "Lightcord Developer" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, { className: "bd-member-badge", href: "https://github.com/Lightcord/Lightcord", title: "Lightcord", target: "_blank" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_svg_lightcord__WEBPACK_IMPORTED_MODULE_11__["default"], { size: "16px", className: "bd-logo" })))); } const id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])(); children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", { id: "badges-" + id })); applyBadges(id, user, false); } }); }; Core.prototype.updateInjector = async function () { // There will never be an injection path, so we do not need the code below. // Insert comments so it will be erased when production. const injectionPath = _dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].injectionPath; if (!injectionPath) return false; /* const fs = require("fs"); const path = require("path"); const rmrf = require("rimraf"); const yauzl = require("yauzl"); const mkdirp = require("mkdirp"); const request = require("request"); const parentPath = path.resolve(injectionPath, ".."); const folderName = path.basename(injectionPath); const zipLink = "https://github.com/rauenzi/BetterDiscordApp/archive/injector.zip"; const savedZip = path.resolve(parentPath, "injector.zip"); const extractedFolder = path.resolve(parentPath, "BetterDiscordApp-injector"); // Download the injector zip file Utils.log("InjectorUpdate", "Downloading " + zipLink); let success = await new Promise(resolve => { request.get({url: zipLink, encoding: null}, async (error, response, body) => { if (error || response.statusCode !== 200) return resolve(false); // Save a backup in case someone has their own copy const alreadyExists = await new Promise(res => fs.exists(savedZip, res)); if (alreadyExists) await new Promise(res => fs.rename(savedZip, `${savedZip}.bak${Math.round(performance.now())}`, res)); Utils.log("InjectorUpdate", "Writing " + savedZip); fs.writeFile(savedZip, body, err => resolve(!err)); }); }); if (!success) return success; // Check and delete rename extraction const alreadyExists = await new Promise(res => fs.exists(extractedFolder, res)); if (alreadyExists) await new Promise(res => fs.rename(extractedFolder, `${extractedFolder}.bak${Math.round(performance.now())}`, res)); // Unzip the downloaded zip file const zipfile = await new Promise(r => yauzl.open(savedZip, {lazyEntries: true}, (err, zip) => r(zip))); zipfile.on("entry", function(entry) { // Skip directories, they are handled with mkdirp if (entry.fileName.endsWith("/")) return zipfile.readEntry(); Utils.log("InjectorUpdate", "Extracting " + entry.fileName); // Make any needed parent directories const fullPath = path.resolve(parentPath, entry.fileName); mkdirp.sync(path.dirname(fullPath)); zipfile.openReadStream(entry, function(err, readStream) { if (err) return success = false; readStream.on("end", function() {zipfile.readEntry();}); // Go to next file after this readStream.pipe(fs.createWriteStream(fullPath)); }); }); zipfile.readEntry(); // Start reading // Wait for the final file to finish await new Promise(resolve => zipfile.once("end", resolve)); // Save a backup in case something goes wrong during final step const backupFolder = path.resolve(parentPath, `${folderName}.bak${Math.round(performance.now())}`); await new Promise(resolve => fs.rename(injectionPath, backupFolder, resolve)); // Rename the extracted folder to what it should be Utils.log("InjectorUpdate", `Renaming ${path.basename(extractedFolder)} to ${folderName}`); success = await new Promise(resolve => fs.rename(extractedFolder, injectionPath, err => resolve(!err))); if (!success) { Utils.err("InjectorUpdate", "Failed to rename the final directory"); return success; } // If rename had issues, delete what we tried to rename and restore backup if (!success) { Utils.err("InjectorUpdate", "Something went wrong... restoring backups."); await new Promise(resolve => rmrf(extractedFolder, resolve)); await new Promise(resolve => fs.rename(backupFolder, injectionPath, resolve)); return success; } // If we've gotten to this point, everything should have gone smoothly. // Cleanup the backup folder then remove the zip await new Promise(resolve => rmrf(backupFolder, resolve)); await new Promise(resolve => fs.unlink(savedZip, resolve)); Utils.log("InjectorUpdate", "Injector Updated!"); return success;*/ }; /* harmony default export */ __webpack_exports__["default"] = (new Core()); /** * Don't expose core - could be dangerous for now */ /***/ }), /***/ "./src/modules/dataStore.js": /*!**********************************!*\ !*** ./src/modules/dataStore.js ***! \**********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js"); const __non_webpack_require__ = window.require; const fs = __webpack_require__(/*! fs */ "fs"); const path = __webpack_require__(/*! path */ "path"); const releaseChannel = DiscordNative.globals ? DiscordNative.globals.releaseChannel : DiscordNative.app ? DiscordNative.app.getReleaseChannel() : "stable"; let dataPath = ""; if (process.platform === "win32") dataPath = process.env.APPDATA;else if (process.platform === "darwin") dataPath = path.join(process.env.HOME, "Library", "Preferences");else dataPath = process.env.XDG_CONFIG_HOME ? process.env.XDG_CONFIG_HOME : path.join(process.env.HOME, ".config"); dataPath = path.join(dataPath, "BetterDiscord"); /* harmony default export */ __webpack_exports__["default"] = (new class DataStore { constructor() { this.data = { settings: { stable: {}, canary: {}, ptb: {} } }; this.pluginData = {}; window.Lightcord.BetterDiscord.DataStore = this; } initialize() { try { if (!fs.existsSync(this.BDFile)) fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), "utf-8"); const data = JSON.parse(fs.readFileSync(this.BDFile, "utf-8")); if (data.hasOwnProperty("settings")) this.data = data; if (!fs.existsSync(this.settingsFile)) return; let settings = __non_webpack_require__(this.settingsFile); fs.unlinkSync(this.settingsFile); if (settings.hasOwnProperty("settings")) settings = Object.assign({ stable: {}, canary: {}, ptb: {} }, { [releaseChannel]: settings });else settings = Object.assign({ stable: {}, canary: {}, ptb: {} }, settings); this.setBDData("settings", settings); } catch (err) { console.error(err); _utils__WEBPACK_IMPORTED_MODULE_0__["default"].alert("Corrupt Storage", "The bd storage has somehow become corrupt. You may either try to salvage the file or delete it then reload."); } } get injectionPath() { return this._injectionPath = null; if (this._injectionPath) return this._injectionPath; const electron = __webpack_require__(/*! electron */ "electron").remote.app; const base = electron.getAppPath(); const roamingBase = electron.getPath("userData"); const roamingLocation = path.resolve(roamingBase, electron.getVersion(), "modules", "discord_desktop_core", "injector"); const location = path.resolve(base, "..", "app"); const realLocation = fs.existsSync(location) ? location : fs.existsSync(roamingLocation) ? roamingLocation : null; if (!realLocation) return this._injectionPath = null; return this._injectionPath = realLocation; } get configFile() { return this._configFile || (this._configFile = path.resolve(this.injectionPath, "betterdiscord", "config.json")); } get BDFile() { return this._BDFile || (this._BDFile = path.resolve(dataPath, "bdstorage.json")); } get settingsFile() { return this._settingsFile || (this._settingsFile = path.resolve(dataPath, "bdsettings.json")); } getPluginFile(pluginName) { return path.resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder, pluginName + ".config.json"); } getSettingGroup(key) { return this.data.settings[releaseChannel][key] || null; } setSettingGroup(key, data) { this.data.settings[releaseChannel][key] = data; fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), "utf-8"); } getBDData(key) { return this.data[key] || ""; } setBDData(key, value) { this.data[key] = value; fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), "utf-8"); } getPluginData(pluginName, key) { if (this.pluginData[pluginName] !== undefined) return this.pluginData[pluginName][key]; if (!fs.existsSync(this.getPluginFile(pluginName))) return undefined; this.pluginData[pluginName] = JSON.parse(fs.readFileSync(this.getPluginFile(pluginName))); return this.pluginData[pluginName][key]; } setPluginData(pluginName, key, value) { if (value === undefined) return; if (this.pluginData[pluginName] === undefined) this.pluginData[pluginName] = {}; this.pluginData[pluginName][key] = value; fs.writeFileSync(this.getPluginFile(pluginName), JSON.stringify(this.pluginData[pluginName], null, 4), "utf-8"); } deletePluginData(pluginName, key) { if (this.pluginData[pluginName] === undefined) this.pluginData[pluginName] = {}; delete this.pluginData[pluginName][key]; fs.writeFileSync(this.getPluginFile(pluginName), JSON.stringify(this.pluginData[pluginName], null, 4), "utf-8"); } }()); /***/ }), /***/ "./src/modules/devMode.js": /*!********************************!*\ !*** ./src/modules/devMode.js ***! \********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js"); /* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /* harmony default export */ __webpack_exports__["default"] = (new class DevMode { constructor() { this.debugListener = this.debugListener.bind(this); this.copySelectorListener = this.copySelectorListener.bind(this); } start() { this.startDebugListener(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-dm-1"]) this.startCopySelector(); } stop() { this.stopDebugListener(); this.stopCopySelector(); } startDebugListener() { this.stopDebugListener(); document.addEventListener("keydown", this.debugListener); } stopDebugListener() { document.removeEventListener("keydown", this.debugListener); } startCopySelector() { this.stopCopySelector(); document.addEventListener("contextmenu", this.copySelectorListener); } stopCopySelector() { document.removeEventListener("contextmenu", this.copySelectorListener); } debugListener(e) { if (e.which === 119 || e.which == 118) { //F8 console.log("%c[%cDevMode%c] %cBreak/Resume", "color: red;", "color: #303030; font-weight:700;", "color:red;", ""); debugger; // eslint-disable-line no-debugger e.preventDefault(); e.stopImmediatePropagation(); } } copySelectorListener(e) { try { e.stopPropagation(); const selector = this.getSelector(e.target); let [classLayer, classItems] = [BDModules.get(e => e.layer && typeof e.layer === "string" && e.disabledPointerEvents)[0], BDModules.get(e => e.menu)[0]]; function attach() { if (!classItems || !classLayer.layer) return console.log(classItems, classLayer.layer); let cm = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].query("." + _utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(classItems.menu)); if (!cm) { const container = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].query("#app-mount > ." + _utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(classLayer.layerContainer)); const cmWrap = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`
`); cm = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`
`); cmWrap.append(cm); container.append(cmWrap); cmWrap.style.top = e.clientY + "px"; cmWrap.style.left = e.clientX + "px"; cmWrap.setAttribute("role", "menu"); cmWrap.setAttribute("tabindex", "-1"); cmWrap.id = "bd-copy-selector-context"; cmWrap.setAttribute("aria-label", "Copy Selector Actions"); const scrollerClasses = BDModules.get(e => e.scrollerWrap)[0]; const scrollerWrap = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`
`); const scroller = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`
`); scrollerWrap.append(scroller); cm.append(scrollerWrap); const removeCM = function (e) { if (e.keyCode && e.keyCode !== 27) return; cmWrap.remove(); document.removeEventListener("click", removeCM); document.removeEventListener("contextmenu", removeCM); document.removeEventListener("keyup", removeCM); }; document.addEventListener("click", removeCM); document.addEventListener("contextmenu", removeCM); document.addEventListener("keyup", removeCM); } const cmWrap = cm.parentElement; const scroller = cm.childNodes[0].childNodes[0]; const cmg = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`
`); /** * @type {HTMLElement} */ const cmi = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(``); cmi.append(_domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`
Copy Selector
`)); cmi.addEventListener("click", () => { _v2__WEBPACK_IMPORTED_MODULE_1__["default"].NativeModule.copy(selector); cmWrap.style.display = "none"; }); cmi.addEventListener("mouseover", e => { let elements = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].queryAll("div[role=menuitem]." + _utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(classItems.focused)); elements && elements.forEach(elem => elem.classList.remove(classItems.focused)); cmi.classList.add(classItems.focused); }); cmi.addEventListener("mouseout", e => { cmi.classList.remove(classItems.focused); }); cmg.append(cmi); if (scroller.childNodes.length) { // apend a separator const separator = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(``); scroller.append(separator); } scroller.append(cmg); if (cmWrap.clientHeight < cmWrap.scrollHeight) { console.log("overflowing " + cmWrap.style.top); cmWrap.style.top = cmWrap.style.top - cmg.clientHeight + "px"; console.log("overflowing" + cmWrap.style.top); } } setTimeout(attach, 1); } catch (e) { console.error(e); } } getSelector(element) { if (element.id) return `#${element.id}`; /** * * @param {HTMLElement} el */ function fullPath(el) { var names = []; while (el.parentNode) { if (el.id) { names.unshift('#' + el.id); break; } else { if (el == el.ownerDocument.documentElement) names.unshift(el.tagName.toLowerCase() + Array.from(el.classList.entries()).map(e => "." + e).join(""));else { for (var c = 1, e = el; e.previousElementSibling; e = e.previousElementSibling, c++); names.unshift(el.tagName.toLowerCase() + (typeof el.className === "string" && el.className || "").split(" ").filter(e => !!e).map(e => "." + e).join("") + ":nth-child(" + c + ")"); } el = el.parentNode; } } return names.join(" > "); } return fullPath(element); } }()); /***/ }), /***/ "./src/modules/disableTyping.js": /*!**************************************!*\ !*** ./src/modules/disableTyping.js ***! \**************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony default export */ __webpack_exports__["default"] = (new class DisableTyping { constructor() { window.Lightcord.Api.ensureExported(e => e.default && e.default.startTyping).then(typingModule => { let self = this; const startTyping = typingModule.default.startTyping; typingModule.default.startTyping = function () { if (self.disabled) return startTyping.call(this, ...arguments); }; const stopTyping = typingModule.default.stopTyping; typingModule.default.stopTyping = function () { if (self.disabled) return stopTyping.call(this, ...arguments); }; this.disabled = true; }); window.Lightcord.BetterDiscord.DisableTyping = this; } disable() { this.disabled = true; } enable() { this.disabled = false; } }()); /***/ }), /***/ "./src/modules/distant.js": /*!********************************!*\ !*** ./src/modules/distant.js ***! \********************************/ /*! exports provided: uuidv4, default, Constants, Routes */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uuidv4", function() { return uuidv4; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Constants", function() { return Constants; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Routes", function() { return Routes; }); /* harmony import */ var _svg_bug_hunter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../svg/bug_hunter */ "./src/svg/bug_hunter.jsx"); /* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! node-fetch */ "node-fetch"); /* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(node_fetch__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _svg_circus__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../svg/circus */ "./src/svg/circus.jsx"); function uuidv4() { // Generate UUID (No crypto rng) return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : r & 0x3 | 0x8; return v.toString(16); }); } const awaitingBadgesPromises = {}; let badgesToFetch = []; /* harmony default export */ __webpack_exports__["default"] = (new class DistantServer { constructor() { this._cache = { badges: {} }; window.Lightcord.BetterDiscord.DistantServer = this; } get cache() { return this._cache; } set cache(data) { if (typeof data !== "object" || typeof this._cache !== "object") return this._cache = data; return this._cache = Object.assign(this._cache, data); } /** * Get custom badges from the user ID. * @param {string} user The user ID * @returns {Promise} */ async getBadges(user) { if (this.cache.badges[user]) return this.cache.badges[user]; if (awaitingBadgesPromises[user]) return awaitingBadgesPromises[user]; let resolve; const newPromise = new Promise(res => resolve = res); awaitingBadgesPromises[user] = newPromise; const badges = []; for (let badge of Constants.badges) { if (badge.defaultUsers.includes(user)) badges.push(badge); } const fetchedBadges = await new Promise(resolve => { if (!_0globals__WEBPACK_IMPORTED_MODULE_2__["settingsCookie"]["lightcord-5"]) return resolve([]); badgesToFetch.push([user, resolve]); setTimeout(() => { let users = badgesToFetch; if (users.length === 0) return; badgesToFetch = []; handleRequest(Routes.badges, "POST", JSON.stringify(users.map(e => e[0]))).then(async res => { if (res.status !== 200) { // Couldn't fetch badges: server error users.forEach(data => { data[1]([]); // resolve no badge fetched }); } const responseBody = await res.json(); for (let user of responseBody) { let promise = users.find(promise => promise[0] === user.user_id); promise[1](user.badges); } }).catch(err => { // Couldn't fetch badges: error if (!(err instanceof LightcordError)) console.error(err); users.forEach(data => { data[1]([]); // resolve no badge fetched }); }); }, 0); }); for (let badge of fetchedBadges) { if (!Constants.badges.find(e => e.id === badge)) continue; // We do not have the Component, skip it. if (badges.find(e => e.id === badge)) continue; // Already inserted. badges.push(Constants.badges.find(e => e.id === badge)); } this.cache = { badges: Object.assign(this.cache.badges, { [user]: badges }) }; setTimeout(() => { delete this.cache.badges[user]; }, 600000); resolve(badges); delete awaitingBadgesPromises[user]; return badges; } }()); const handleRequest = function (route, method, data) { if (!_0globals__WEBPACK_IMPORTED_MODULE_2__["settingsCookie"]["lightcord-5"]) { return Promise.reject(new LightcordError("The current settings blocked the request.")); } return node_fetch__WEBPACK_IMPORTED_MODULE_1___default()(`${Constants.SERVER_URL}/api/v1${route}`, { method, headers: { "CLIENT": "Lightcord", "Authorization": window.Lightcord.Api.Authorization || "None::Anonymous" }, ...(data ? { body: data } : {}) }); }; class LightcordError extends Error { constructor() { super(...arguments); this.name = "LightcordError"; } } const Constants = { SERVER_URL: "https://lightcord.deroku.xyz", badges: [// TODO: Add more badges + server side svg { name: "Lightcord Bug Hunter", id: "f04698f5-816b-41e3-bd01-92291193d7a5", defaultUsers: ["696481194443014174", "696003456611385396"], scopes: [], component: _svg_bug_hunter__WEBPACK_IMPORTED_MODULE_0__["default"], href: "https://github.com/lightcord/lightcord/wiki/badges#bug_hunter" }, { name: "Buffoon", id: "06904d31-65b4-41ec-a50c-8658bbd1af96", defaultUsers: ["389016895543705602", "664600134528663565", "625350657829896224"], scopes: [], component: _svg_circus__WEBPACK_IMPORTED_MODULE_3__["default"], href: "https://youtu.be/EJtb6z-dlT8?t=145" }] }; const Routes = { badges: `/users/badges` }; /***/ }), /***/ "./src/modules/domtools.js": /*!*********************************!*\ !*** ./src/modules/domtools.js ***! \*********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DOMTools; }); /** * Copyright 2018 Zachary Rauen * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is furnished * to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * From: https://github.com/rauenzi/BDPluginLibrary */ /** * @interface * @name Offset * @property {number} top - Top offset of the target element. * @property {number} right - Right offset of the target element. * @property {number} bottom - Bottom offset of the target element. * @property {number} left - Left offset of the target element. * @property {number} height - Outer height of the target element. * @property {number} width - Outer width of the target element. */ /** * Function that automatically removes added listener. * @callback module:DOMTools~CancelListener */ class DOMTools { static escapeID(id) { return id.replace(/^[^a-z]+|[^\w-]+/gi, "-"); } /** * Adds a style to the document. * @param {string} id - identifier to use as the element id * @param {string} css - css to add to the document */ static addStyle(id, css) { document.head.append(DOMTools.createElement(``)); } /** * Removes a style from the document. * @param {string} id - original identifier used */ static removeStyle(id) { const element = document.getElementById(id); if (element) element.remove(); } /** * Adds/requires a remote script to be loaded * @param {string} id - identifier to use for this script * @param {string} url - url from which to load the script * @returns {Promise} promise that resolves when the script is loaded */ static addScript(id, url) { return new Promise(resolve => { const script = document.createElement("script"); script.id = id; script.src = url; script.type = "text/javascript"; script.onload = resolve; document.head.append(script); }); } /** * Removes a remote script from the document. * @param {string} id - original identifier used */ static removeScript(id) { id = this.escapeID(id); const element = document.getElementById(id); if (element) element.remove(); } // https://javascript.info/js-animation static animate({ timing = _ => _, update, duration }) { const start = performance.now(); requestAnimationFrame(function animate(time) { // timeFraction goes from 0 to 1 let timeFraction = (time - start) / duration; if (timeFraction > 1) timeFraction = 1; // calculate the current animation state const progress = timing(timeFraction); update(progress); // draw it if (timeFraction < 1) { requestAnimationFrame(animate); } }); } /** * This is my shit version of not having to use `$` from jQuery. Meaning * that you can pass a selector and it will automatically run {@link module:DOMTools.query}. * It also means that you can pass a string of html and it will perform and return `parseHTML`. * @see module:DOMTools.parseHTML * @see module:DOMTools.query * @param {string} selector - Selector to query or HTML to parse * @returns {(DocumentFragment|NodeList|HTMLElement)} - Either the result of `parseHTML` or `query` */ static Q(selector) { const element = this.parseHTML(selector); const isHTML = element instanceof NodeList ? Array.from(element).some(n => n.nodeType === 1) : element.nodeType === 1; if (isHTML) return element; return this.query(selector); } /** * Essentially a shorthand for `document.querySelector`. If the `baseElement` is not provided * `document` is used by default. * @param {string} selector - Selector to query * @param {Element} [baseElement] - Element to base the query from * @returns {(Element|null)} - The found element or null if not found */ static query(selector, baseElement) { if (!baseElement) baseElement = document; return baseElement.querySelector(selector); } /** * Essentially a shorthand for `document.querySelectorAll`. If the `baseElement` is not provided * `document` is used by default. * @param {string} selector - Selector to query * @param {Element} [baseElement] - Element to base the query from * @returns {Array} - Array of all found elements */ static queryAll(selector, baseElement) { if (!baseElement) baseElement = document; return baseElement.querySelectorAll(selector); } /** * Parses a string of HTML and returns the results. If the second parameter is true, * the parsed HTML will be returned as a document fragment {@see https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment}. * This is extremely useful if you have a list of elements at the top level, they can then be appended all at once to another node. * * If the second parameter is false, then the return value will be the list of parsed * nodes and there were multiple top level nodes, otherwise the single node is returned. * @param {string} html - HTML to be parsed * @param {boolean} [fragment=false] - Whether or not the return should be the raw `DocumentFragment` * @returns {(DocumentFragment|NodeList|HTMLElement)} - The result of HTML parsing */ static parseHTML(html, fragment = false) { const template = document.createElement("template"); template.innerHTML = html; const node = template.content.cloneNode(true); if (fragment) return node; return node.childNodes.length > 1 ? node.childNodes : node.childNodes[0]; } /** Alternate name for {@link module:DOMTools.parseHTML} */ static createElement(html, fragment = false) { return this.parseHTML(html, fragment); } /** * Takes a string of html and escapes it using the brower's own escaping mechanism. * @param {String} html - html to be escaped */ static escapeHTML(html) { const textNode = document.createTextNode(""); const spanElement = document.createElement("span"); spanElement.append(textNode); textNode.nodeValue = html; return spanElement.innerHTML; } /** * Adds a list of classes from the target element. * @param {Element} element - Element to edit classes of * @param {...string} classes - Names of classes to add * @returns {Element} - `element` to allow for chaining */ static addClass(element, ...classes) { classes = classes.flat().filter(c => c); for (let c = 0; c < classes.length; c++) classes[c] = classes[c].toString().split(" "); classes = classes.flat().filter(c => c); element.classList.add(...classes); return element; } /** * Removes a list of classes from the target element. * @param {Element} element - Element to edit classes of * @param {...string} classes - Names of classes to remove * @returns {Element} - `element` to allow for chaining */ static removeClass(element, ...classes) { for (let c = 0; c < classes.length; c++) classes[c] = classes[c].toString().split(" "); classes = classes.flat().filter(c => c); element.classList.remove(...classes); return element; } /** * When only one argument is present: Toggle class value; * i.e., if class exists then remove it and return false, if not, then add it and return true. * When a second argument is present: * If the second argument evaluates to true, add specified class value, and if it evaluates to false, remove it. * @param {Element} element - Element to edit classes of * @param {string} classname - Name of class to toggle * @param {boolean} [indicator] - Optional indicator for if the class should be toggled * @returns {Element} - `element` to allow for chaining */ static toggleClass(element, classname, indicator) { classname = classname.toString().split(" ").filter(c => c); if (typeof indicator !== "undefined") classname.forEach(c => element.classList.toggle(c, indicator));else classname.forEach(c => element.classList.toggle(c)); return element; } /** * Checks if an element has a specific class * @param {Element} element - Element to edit classes of * @param {string} classname - Name of class to check * @returns {boolean} - `true` if the element has the class, `false` otherwise. */ static hasClass(element, classname) { return classname.toString().split(" ").filter(c => c).every(c => element.classList.contains(c)); } /** * Replaces one class with another * @param {Element} element - Element to edit classes of * @param {string} oldName - Name of class to replace * @param {string} newName - New name for the class * @returns {Element} - `element` to allow for chaining */ static replaceClass(element, oldName, newName) { element.classList.replace(oldName, newName); return element; } /** * Appends `thisNode` to `thatNode` * @param {Node} thisNode - Node to be appended to another node * @param {Node} thatNode - Node for `thisNode` to be appended to * @returns {Node} - `thisNode` to allow for chaining */ static appendTo(thisNode, thatNode) { if (typeof thatNode == "string") thatNode = this.query(thatNode); if (!thatNode) return null; thatNode.append(thisNode); return thisNode; } /** * Prepends `thisNode` to `thatNode` * @param {Node} thisNode - Node to be prepended to another node * @param {Node} thatNode - Node for `thisNode` to be prepended to * @returns {Node} - `thisNode` to allow for chaining */ static prependTo(thisNode, thatNode) { if (typeof thatNode == "string") thatNode = this.query(thatNode); if (!thatNode) return null; thatNode.prepend(thisNode); return thisNode; } /** * Insert after a specific element, similar to jQuery's `thisElement.insertAfter(otherElement)`. * @param {Node} thisNode - The node to insert * @param {Node} targetNode - Node to insert after in the tree * @returns {Node} - `thisNode` to allow for chaining */ static insertAfter(thisNode, targetNode) { targetNode.parentNode.insertBefore(thisNode, targetNode.nextSibling); return thisNode; } /** * Insert after a specific element, similar to jQuery's `thisElement.after(newElement)`. * @param {Node} thisNode - The node to insert * @param {Node} newNode - Node to insert after in the tree * @returns {Node} - `thisNode` to allow for chaining */ static after(thisNode, newNode) { thisNode.parentNode.insertBefore(newNode, thisNode.nextSibling); return thisNode; } /** * Gets the next sibling element that matches the selector. * @param {Element} element - Element to get the next sibling of * @param {string} [selector=""] - Optional selector * @returns {Element} - The sibling element */ static next(element, selector = "") { return selector ? element.querySelector("+ " + selector) : element.nextElementSibling; } /** * Gets all subsequent siblings. * @param {Element} element - Element to get next siblings of * @returns {NodeList} - The list of siblings */ static nextAll(element) { return element.querySelectorAll("~ *"); } /** * Gets the subsequent siblings until an element matches the selector. * @param {Element} element - Element to get the following siblings of * @param {string} selector - Selector to stop at * @returns {Array} - The list of siblings */ static nextUntil(element, selector) { const next = []; while (element.nextElementSibling && !element.nextElementSibling.matches(selector)) next.push(element = element.nextElementSibling); return next; } /** * Gets the previous sibling element that matches the selector. * @param {Element} element - Element to get the previous sibling of * @param {string} [selector=""] - Optional selector * @returns {Element} - The sibling element */ static previous(element, selector = "") { const previous = element.previousElementSibling; if (selector) return previous && previous.matches(selector) ? previous : null; return previous; } /** * Gets all preceeding siblings. * @param {Element} element - Element to get preceeding siblings of * @returns {NodeList} - The list of siblings */ static previousAll(element) { const previous = []; while (element.previousElementSibling) previous.push(element = element.previousElementSibling); return previous; } /** * Gets the preceeding siblings until an element matches the selector. * @param {Element} element - Element to get the preceeding siblings of * @param {string} selector - Selector to stop at * @returns {Array} - The list of siblings */ static previousUntil(element, selector) { const previous = []; while (element.previousElementSibling && !element.previousElementSibling.matches(selector)) previous.push(element = element.previousElementSibling); return previous; } /** * Find which index in children a certain node is. Similar to jQuery's `$.index()` * @param {HTMLElement} node - The node to find its index in parent * @returns {number} Index of the node */ static indexInParent(node) { const children = node.parentNode.childNodes; let num = 0; for (let i = 0; i < children.length; i++) { if (children[i] == node) return num; if (children[i].nodeType == 1) num++; } return -1; } /** Shorthand for {@link module:DOMTools.indexInParent} */ static index(node) { return this.indexInParent(node); } /** * Gets the parent of the element if it matches the selector, * otherwise returns null. * @param {Element} element - Element to get parent of * @param {string} [selector=""] - Selector to match parent * @returns {(Element|null)} - The sibling element or null */ static parent(element, selector = "") { return !selector || element.parentElement.matches(selector) ? element.parentElement : null; } /** * Gets all children of Element that match the selector if provided. * @param {Element} element - Element to get all children of * @param {string} selector - Selector to match the children to * @returns {Array} - The list of children */ static findChild(element, selector) { return element.querySelector(":scope > " + selector); } /** * Gets all children of Element that match the selector if provided. * @param {Element} element - Element to get all children of * @param {string} selector - Selector to match the children to * @returns {Array} - The list of children */ static findChildren(element, selector) { return element.querySelectorAll(":scope > " + selector); } /** * Gets all ancestors of Element that match the selector if provided. * @param {Element} element - Element to get all parents of * @param {string} [selector=""] - Selector to match the parents to * @returns {Array} - The list of parents */ static parents(element, selector = "") { const parents = []; if (selector) while (element.parentElement && element.parentElement.closest(selector)) parents.push(element = element.parentElement.closest(selector));else while (element.parentElement) parents.push(element = element.parentElement); return parents; } /** * Gets the ancestors until an element matches the selector. * @param {Element} element - Element to get the ancestors of * @param {string} selector - Selector to stop at * @returns {Array} - The list of parents */ static parentsUntil(element, selector) { const parents = []; while (element.parentElement && !element.parentElement.matches(selector)) parents.push(element = element.parentElement); return parents; } /** * Gets all siblings of the element that match the selector. * @param {Element} element - Element to get all siblings of * @param {string} [selector="*"] - Selector to match the siblings to * @returns {Array} - The list of siblings */ static siblings(element, selector = "*") { return Array.from(element.parentElement.children).filter(e => e != element && e.matches(selector)); } /** * Sets or gets css styles for a specific element. If `value` is provided * then it sets the style and returns the element to allow for chaining, * otherwise returns the style. * @param {Element} element - Element to set the CSS of * @param {string} attribute - Attribute to get or set * @param {string} [value] - Value to set for attribute * @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned. */ static css(element, attribute, value) { if (typeof value == "undefined") return global.getComputedStyle(element)[attribute]; element.style[attribute] = value; return element; } /** * Sets or gets the width for a specific element. If `value` is provided * then it sets the width and returns the element to allow for chaining, * otherwise returns the width. * @param {Element} element - Element to set the CSS of * @param {string} [value] - Width to set * @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned. */ static width(element, value) { if (typeof value == "undefined") return parseInt(getComputedStyle(element).width); element.style.width = value; return element; } /** * Sets or gets the height for a specific element. If `value` is provided * then it sets the height and returns the element to allow for chaining, * otherwise returns the height. * @param {Element} element - Element to set the CSS of * @param {string} [value] - Height to set * @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned. */ static height(element, value) { if (typeof value == "undefined") return parseInt(getComputedStyle(element).height); element.style.height = value; return element; } /** * Sets the inner text of an element if given a value, otherwise returns it. * @param {Element} element - Element to set the text of * @param {string} [text] - Content to set * @returns {string} - Either the string set by this call or the current text content of the node. */ static text(element, text) { if (typeof text == "undefined") return element.textContent; return element.textContent = text; } /** * Returns the innerWidth of the element. * @param {Element} element - Element to retrieve inner width of * @return {number} - The inner width of the element. */ static innerWidth(element) { return element.clientWidth; } /** * Returns the innerHeight of the element. * @param {Element} element - Element to retrieve inner height of * @return {number} - The inner height of the element. */ static innerHeight(element) { return element.clientHeight; } /** * Returns the outerWidth of the element. * @param {Element} element - Element to retrieve outer width of * @return {number} - The outer width of the element. */ static outerWidth(element) { return element.offsetWidth; } /** * Returns the outerHeight of the element. * @param {Element} element - Element to retrieve outer height of * @return {number} - The outer height of the element. */ static outerHeight(element) { return element.offsetHeight; } /** * Gets the offset of the element in the page. * @param {Element} element - Element to get offset of * @return {Offset} - The offset of the element */ static offset(element) { return element.getBoundingClientRect(); } static get listeners() { return this._listeners || (this._listeners = {}); } /** * This is similar to jQuery's `on` function and can *hopefully* be used in the same way. * * Rather than attempt to explain, I'll show some example usages. * * The following will add a click listener (in the `myPlugin` namespace) to `element`. * `DOMTools.on(element, "click.myPlugin", () => {console.log("clicked!");});` * * The following will add a click listener (in the `myPlugin` namespace) to `element` that only fires when the target is a `.block` element. * `DOMTools.on(element, "click.myPlugin", ".block", () => {console.log("clicked!");});` * * The following will add a click listener (without namespace) to `element`. * `DOMTools.on(element, "click", () => {console.log("clicked!");});` * * The following will add a click listener (without namespace) to `element` that only fires once. * `const cancel = DOMTools.on(element, "click", () => {console.log("fired!"); cancel();});` * * @param {Element} element - Element to add listener to * @param {string} event - Event to listen to with option namespace (e.g. "event.namespace") * @param {(string|callable)} delegate - Selector to run on element to listen to * @param {callable} [callback] - Function to fire on event * @returns {module:DOMTools~CancelListener} - A function that will undo the listener */ static on(element, event, delegate, callback) { const [type, namespace] = event.split("."); const hasDelegate = delegate && callback; if (!callback) callback = delegate; const eventFunc = !hasDelegate ? callback : function (event) { if (event.target.matches(delegate)) { callback(event); } }; element.addEventListener(type, eventFunc); const cancel = () => { element.removeEventListener(type, eventFunc); }; if (namespace) { if (!this.listeners[namespace]) this.listeners[namespace] = []; const newCancel = () => { cancel(); this.listeners[namespace].splice(this.listeners[namespace].findIndex(l => l.event == type && l.element == element), 1); }; this.listeners[namespace].push({ event: type, element: element, cancel: newCancel }); return newCancel; } return cancel; } /** * Functionality for this method matches {@link module:DOMTools.on} but automatically cancels itself * and removes the listener upon the first firing of the desired event. * * @param {Element} element - Element to add listener to * @param {string} event - Event to listen to with option namespace (e.g. "event.namespace") * @param {(string|callable)} delegate - Selector to run on element to listen to * @param {callable} [callback] - Function to fire on event * @returns {module:DOMTools~CancelListener} - A function that will undo the listener */ static once(element, event, delegate, callback) { const [type, namespace] = event.split("."); const hasDelegate = delegate && callback; if (!callback) callback = delegate; const eventFunc = !hasDelegate ? function (event) { callback(event); element.removeEventListener(type, eventFunc); } : function (event) { if (!event.target.matches(delegate)) return; callback(event); element.removeEventListener(type, eventFunc); }; element.addEventListener(type, eventFunc); const cancel = () => { element.removeEventListener(type, eventFunc); }; if (namespace) { if (!this.listeners[namespace]) this.listeners[namespace] = []; const newCancel = () => { cancel(); this.listeners[namespace].splice(this.listeners[namespace].findIndex(l => l.event == type && l.element == element), 1); }; this.listeners[namespace].push({ event: type, element: element, cancel: newCancel }); return newCancel; } return cancel; } static __offAll(event, element) { const [type, namespace] = event.split("."); let matchFilter = listener => listener.event == type, defaultFilter = _ => _; if (element) matchFilter = l => l.event == type && l.element == element, defaultFilter = l => l.element == element; const listeners = this.listeners[namespace] || []; const list = type ? listeners.filter(matchFilter) : listeners.filter(defaultFilter); for (let c = 0; c < list.length; c++) list[c].cancel(); } /** * This is similar to jQuery's `off` function and can *hopefully* be used in the same way. * * Rather than attempt to explain, I'll show some example usages. * * The following will remove a click listener called `onClick` (in the `myPlugin` namespace) from `element`. * `DOMTools.off(element, "click.myPlugin", onClick);` * * The following will remove a click listener called `onClick` (in the `myPlugin` namespace) from `element` that only fired when the target is a `.block` element. * `DOMTools.off(element, "click.myPlugin", ".block", onClick);` * * The following will remove a click listener (without namespace) from `element`. * `DOMTools.off(element, "click", onClick);` * * The following will remove all listeners in namespace `myPlugin` from `element`. * `DOMTools.off(element, ".myPlugin");` * * The following will remove all click listeners in namespace `myPlugin` from *all elements*. * `DOMTools.off("click.myPlugin");` * * The following will remove all listeners in namespace `myPlugin` from *all elements*. * `DOMTools.off(".myPlugin");` * * @param {(Element|string)} element - Element to remove listener from * @param {string} [event] - Event to listen to with option namespace (e.g. "event.namespace") * @param {(string|callable)} [delegate] - Selector to run on element to listen to * @param {callable} [callback] - Function to fire on event * @returns {Element} - The original element to allow for chaining */ static off(element, event, delegate, callback) { if (typeof element == "string") return this.__offAll(element); const [type, namespace] = event.split("."); if (namespace) return this.__offAll(event, element); const hasDelegate = delegate && callback; if (!callback) callback = delegate; const eventFunc = !hasDelegate ? callback : function (event) { if (event.target.matches(delegate)) { callback(event); } }; element.removeEventListener(type, eventFunc); return element; } /** * Adds a listener for when the node is added/removed from the document body. * The listener is automatically removed upon firing. * @param {HTMLElement} node - node to wait for * @param {callable} callback - function to be performed on event * @param {boolean} onMount - determines if it should fire on Mount or on Unmount */ static onMountChange(node, callback, onMount = true) { const wrappedCallback = () => { this.observer.unsubscribe(wrappedCallback); callback(); }; this.observer.subscribe(wrappedCallback, mutation => { const nodes = Array.from(onMount ? mutation.addedNodes : mutation.removedNodes); const directMatch = nodes.indexOf(node) > -1; const parentMatch = nodes.some(parent => parent.contains(node)); return directMatch || parentMatch; }); return node; } /** Shorthand for {@link module:DOMTools.onMountChange} with third parameter `true` */ static onMount(node, callback) { return this.onMountChange(node, callback); } /** Shorthand for {@link module:DOMTools.onMountChange} with third parameter `false` */ static onUnmount(node, callback) { return this.onMountChange(node, callback, false); } /** Alias for {@link module:DOMTools.onMount} */ static onAdded(node, callback) { return this.onMount(node, callback); } /** Alias for {@link module:DOMTools.onUnmount} */ static onRemoved(node, callback) { return this.onUnmount(node, callback, false); } /** * Helper function which combines multiple elements into one parent element * @param {Array} elements - array of elements to put into a single parent */ static wrap(elements) { const domWrapper = this.parseHTML(`
`); for (let e = 0; e < elements.length; e++) domWrapper.appendChild(elements[e]); return domWrapper; } /** * Resolves the node to an HTMLElement. This is mainly used by library modules. * @param {(jQuery|Element)} node - node to resolve */ static resolveElement(node) { if (!(node instanceof jQuery) && !(node instanceof Element)) return undefined; return node instanceof jQuery ? node[0] : node; } } window.Lightcord.BetterDiscord.DOM = DOMTools; /***/ }), /***/ "./src/modules/emojiModule.js": /*!************************************!*\ !*** ./src/modules/emojiModule.js ***! \************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); const Constants = { EmojiRegex: //g }; let CustomEmojiModule = BDModules.get(e => e.CustomEmoji)[0]; let EmojiModuleApi = BDModules.get(e => e.default && e.default.getCustomEmojiById)[0]; let AutocompleteModule = BDModules.get(e => e.default && e.default.displayName === "Autocomplete")[0]; let AutoCompletionTemplates = BDModules.get(e => e.getAutocompleteOptions)[0]; let EmojiModuleQuery = BDModules.get(e => e.default && e.default.queryEmojiResults)[0]; let Messages = BDModules.get(e => e.default && e.default.Messages && e.default.Messages.EMOJI_MATCHING)[0]; let guildModule = BDModules.get(e => e.default && e.default.getGuild && e.default.getGuilds && !e.default.isFetching)[0]; let emojiSearch = BDModules.get(e => e.default && e.default.getDisambiguatedEmojiContext); /* harmony default export */ __webpack_exports__["default"] = (new class EmojiModule { constructor() { this.init().catch(err => _utils__WEBPACK_IMPORTED_MODULE_1__["default"].err("EmojiModule", "An error occured", err)); // better logging } async init() { /** Emoji AutoComplete */ if (!AutocompleteModule) AutocompleteModule = await window.Lightcord.Api.ensureExported(e => e.default && e.default.displayName === "Autocomplete"); if (!AutoCompletionTemplates) AutoCompletionTemplates = await window.Lightcord.Api.ensureExported(e => e.getAutocompleteOptions); if (!EmojiModuleQuery) EmojiModuleQuery = await window.Lightcord.Api.ensureExported(e => e.default && e.default.queryEmojiResults); if (!Messages) Messages = await window.Lightcord.Api.ensureExported(e => e.default && e.default.Messages && e.default.Messages.EMOJI_MATCHING); if (!guildModule) guildModule = await window.Lightcord.Api.ensureExported(e => e.default && e.default.getGuild && e.default.getGuilds && !e.default.isFetching); if (!emojiSearch) emojiSearch = await window.Lightcord.Api.ensureExported(e => e.default && e.default.getDisambiguatedEmojiContext); if (AutocompleteModule && AutoCompletionTemplates && EmojiModuleQuery && Messages && guildModule && emojiSearch) { console.log(`Patching getAutocompleteOptions of AutoCompletionTemplates`, AutoCompletionTemplates); const getAutocompleteOptions = AutoCompletionTemplates.getAutocompleteOptions; AutoCompletionTemplates.getAutocompleteOptions = function (e, t, n, r, a) { const value = getAutocompleteOptions.call(this, ...arguments); value.LIGHTCORD_EMOJIS = { matches(arg1, arg2) { let condition = arg2.length > 1 && "." === arg1; setEmojiUsable(condition); return condition; }, queryResults(t) { let results = EmojiModuleQuery.default.queryEmojiResults(t, e); return results; }, renderResults(e, t, n, r, a) { return D(e, t, a.emojis, n, r, Messages.default.Messages.EMOJI_MATCHING, Messages.default.Messages.EMOJI, AutocompleteModule.default.Emoji, function (e) { return { emoji: e, key: e.id || e.uniqueName || e.name, sentinel: ".", guild: null != e.guildId ? guildModule.default.getGuild(e.guildId) : null }; }, function (e) { return "." + e + "."; }); }, getPlainText(id, guild) { var emojis = guild.emojis; if (null == emojis || null == emojis[id]) return ""; var emoji = emojis[id], isAnimated = emoji.animated ? "a" : ""; return emoji.managed || null == emoji.id ? "." + emoji.name + "." : "<" + isAnimated + "." + (emoji.originalName || emoji.name) + "." + emoji.id + ">"; }, getRawText(id, guild) { var emojis = guild.emojis; if (null == emojis || null == emojis[id]) return ""; var emoji = emojis[id], isAnimated = emoji.animated ? "a" : ""; return emoji.managed || null == emoji.id ? "." + emoji.name + "." : "<" + isAnimated + "." + (emoji.originalName || emoji.name) + "." + emoji.id + ">"; } }; return value; }; } else { console.error(new Error("Couldn't start autocompletion of Lightcord's emojis.")); } /** Emoji display */ while (!_v2__WEBPACK_IMPORTED_MODULE_0__["default"].MessageComponent) await new Promise(resolve => setTimeout(resolve, 100)); if (!this.cancelEmojiRender) { // TODO: Proper emoji formatting / rendering this.cancelEmoteRender = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_0__["default"].MessageComponent, "default", { before: data => { const message = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.methodArguments[0], "childrenMessageContent.props.message"); if (!message) return; const content = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.methodArguments[0], "childrenMessageContent.props.content"); if (!content || !content.length) return; /** * @type {{ * raw: string, * name: string, * id: string, * animated: boolean * }[]} */ let emojis = []; const newContent = []; for (let node of content) { if (typeof node !== "string") { newContent.push(node); continue; } ; let parsed; let hasParsed = false; do { parsed = Constants.EmojiRegex.exec(node); if (parsed) { hasParsed = true; if (!EmojiModuleApi) EmojiModuleApi = BDModules.get(e => e.default && e.default.getCustomEmojiById)[0]; const emoji = EmojiModuleApi.default.getCustomEmojiById(parsed[2]); if (emoji) { emojis.push({ animated: emoji.animated, name: emoji.name, id: emoji.id, raw: parsed[0] }); } else { emojis.push({ animated: parsed[0].startsWith(" { if (!word) return ""; const emoji = emojis.find(e => e.raw == word); if (!emoji) return word; if (!CustomEmojiModule) CustomEmojiModule = BDModules.get(e => e.CustomEmoji)[0]; return React.createElement(CustomEmojiModule.CustomEmoji, { emoji: { name: `.${emoji.name}.`, emojiId: emoji.id, animated: emoji.animated, jumboable: arr.length === 1 && content.length === 1 } }); }).reduce((previous, current) => { if (previous.length === 0) return [current]; if (typeof current === "string") { if (typeof previous[previous.length - 1] === "string") { previous[previous.length - 1] += ` ${current}`; return previous; } previous.push(" " + current); return previous; } previous.push(" ", current); return previous; }, []); newContent.push(...words); } else { newContent.push(node); } } while (data.methodArguments[0].childrenMessageContent.props.content[0]) { data.methodArguments[0].childrenMessageContent.props.content.shift(); } while (newContent[0]) { data.methodArguments[0].childrenMessageContent.props.content.push(newContent.shift()); } } }); } /* let userModule window.Lightcord.Api.ensureExported(e => e.default && e.default.displayName === "EmojiPickerListRow") .then(EmojiPickerListRow => { let classs = EmojiPickerListRow.default EmojiPickerListRow.default = class EmojiPickerListRow extends React.Component { constructor(props){ super(props) } render(){ if(!userModule)userModule = BDModules.get(e => e.default && e.default.getCurrentUser)[0] if(!userModule)return React.createElement(classs, this.props) let user = userModule.default.getCurrentUser() if(!user.hasPremiumSubscription)return React.createElement(classs, this.props) return React.createElement(classs, Object.assign({}, this.props, { emojiDescriptors: this.props.emojiDescriptors.map(e => { e.isDisabled = false }) })) } } EmojiPickerListRow.default.displayName = "EmojiPickerListRow" })*/ } disable() { if (!this.cancelEmoteRender) return; this.cancelEmoteRender(); this.cancelEmoteRender = null; } start() {} }()); function D(e, t, n, r, o, i, s, u, l, c) { if (null == n || 0 === n.length) return null; var d = n.map(function (e, n) { return React.createElement(u, Object.assign({ onClick: o, onHover: r, selected: t === n, index: n }, l(e, n))); }); return [R(i, s, e, c), d]; } function R(e, t, n, r) { var a = n.length > 0 ? e.format({ prefix: r(n) }) : t; if (Array.isArray(a)) { a.unshift(React.createElement("strong", {}, "[Lightcord] ")); } else { a = "[LIGHTCORD] " + a; } return React.createElement(AutocompleteModule.default.Title, { title: a }, a); } R.displayName = "renderHeader"; let EmojiFilterModule = BDModules.get(e => e.default && e.default.isEmojiDisabled)[0]; let isEmojiDisabled = EmojiFilterModule && EmojiFilterModule.default.isEmojiDisabled; let isUsable = false; let hasPatched = false; function setEmojiUsable(usable) { isUsable = usable; if (hasPatched) return; if (!EmojiFilterModule) EmojiFilterModule = BDModules.get(e => e.default && e.default.isEmojiDisabled)[0]; if (!EmojiFilterModule) return; if (!isEmojiDisabled) isEmojiDisabled = EmojiFilterModule.default.isEmojiDisabled; hasPatched = true; EmojiFilterModule.default.isEmojiDisabled = function (emoji) { if (isUsable) { if (emoji.surrogates || emoji.diversity) return true; return false; } return isEmojiDisabled.call(this, ...arguments); }; } /***/ }), /***/ "./src/modules/pluginCertifier.js": /*!****************************************!*\ !*** ./src/modules/pluginCertifier.js ***! \****************************************/ /*! exports provided: default, checkViruses, checkHash, processFile, processAttachment, decryptSettingsCache, encryptSettingsCache */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkViruses", function() { return checkViruses; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkHash", function() { return checkHash; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "processFile", function() { return processFile; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "processAttachment", function() { return processAttachment; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "decryptSettingsCache", function() { return decryptSettingsCache; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "encryptSettingsCache", function() { return encryptSettingsCache; }); /* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! node-fetch */ "node-fetch"); /* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(node_fetch__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! electron */ "electron"); /* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! crypto */ "crypto"); /* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(crypto__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js"); /* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ui/tooltipWrap */ "./src/ui/tooltipWrap.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! fs */ "fs"); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! path */ "path"); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js"); const cache = {}; const cache2 = {}; /* harmony default export */ __webpack_exports__["default"] = (new class PluginCertifier { constructor() { window.Lightcord.BetterDiscord.PluginCertifier = this; } patch(attachment, id) { process.nextTick(() => { processAttachment(attachment, id); }); } start() {} isTrusted(hash) { return cache[hash] && !cache[hash].suspect; } }()); function checkViruses(hash, data, resultCallback, removeCallback, filename) { data = data.toString("utf8"); let isHarmful = false; for (let keyword of data.split(/[^\w\d]+/g)) { for (let oof of ["token", "email", "phone", "MFA", "2fa", "child_process", "localStorage", "eval", "getGlobal", "BrowserWindow"]) { if (keyword.toLowerCase().includes(oof.toLowerCase()) && !keyword.toLowerCase() === "domtokenlist") { console.log(oof, keyword); isHarmful = "token stealer/virus"; break; } } if (isHarmful) break; } if (!isHarmful) { /** * @type {string} */ const no_comments = data.replace(/\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/gm, "").trim(); // removing the META comment from plugins if (/var [\w\d_$]+=\["/gi.test(no_comments)) { isHarmful = "obfuscation/hidden code"; } if (!isHarmful) { const regexps = [ /** hexadecimal */ /_0x\w{4}\('0x[\dabcdef]+'\)/g, /_0x\w{4}\('0x[\dabcdef]+'[, ]+'[^']{4}'\)/g, // _0x8db7('0x0', 'x1]f') /** mangled */ /\w+\('0x[\dabcdef]+'\)/g, // b('0x0') /\w+\('0x[\dabcdef]+'[, ]+'[^']{4}'\)/g // b('0x0', 'x1]f') ]; for (let regex of regexps) { if (isHarmful) break; if (regex.test(no_comments)) isHarmful = "obfuscation/hidden code"; } } } if (!isHarmful) return removeCallback(hash); cache[hash] = { suspect: true, name: hashToUrl[hash].split("/").pop(), type: hashToUrl[hash].endsWith(".js") ? "Plugin" : "Theme", harm: isHarmful, hash: hash, filename }; console.log(`Found potentially dangerous ${cache[hash].type.toLowerCase()}: ${cache[hash].name}`); resultCallback(cache[hash]); } const hashToUrl = {}; function checkHash(hash, data, filename, resultCallback, removeCallback) { console.log(`File: ${filename} hash: ${hash}`); if (!cache[hash]) { node_fetch__WEBPACK_IMPORTED_MODULE_0___default()("https://cdn.jsdelivr.net/gh/Lightcord/filehashes@master/hashes/" + hash, { // Using node-fetch to bypass cors headers: { "User-Agent": electron__WEBPACK_IMPORTED_MODULE_1__["remote"].getCurrentWebContents().userAgent // have to set user-agent } }).then(async res => { if (res.status !== 200) { if (filename.endsWith(".theme.css")) return removeCallback(hash); checkViruses(hash, data, resultCallback, removeCallback, filename); return; } const result = await res.json(); result.hash = hash; result.filename = filename; cache[hash] = result; resultCallback(result); }).catch(err => { console.error(`Could not read from github. ${err}`); if (filename.endsWith(".theme.css")) return removeCallback(hash); checkViruses(hash, data, resultCallback, removeCallback, filename); }); } else { const result = cache[hash]; resultCallback(result); } } function processFile(__path, resultCallback, removeCallback = hash => {}, isFromLoader = false) { const hash = crypto__WEBPACK_IMPORTED_MODULE_2__["createHash"]("sha256"); let data = Buffer.alloc(0); Object(fs__WEBPACK_IMPORTED_MODULE_6__["createReadStream"])(__path).on("data", chunk => { data = Buffer.concat([data, chunk]); hash.update(chunk); }).on("end", () => { const hashResult = hash.digest("hex"); hashToUrl[hashResult] = __path; if (isFromLoader && _contentManager__WEBPACK_IMPORTED_MODULE_8__["addonCache"][hashResult]) { let value = _contentManager__WEBPACK_IMPORTED_MODULE_8__["addonCache"][hashResult]; if (value.timestamp < Date.now() - 6.048e+8) { delete _contentManager__WEBPACK_IMPORTED_MODULE_8__["addonCache"][hashResult]; _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"].saveAddonCache(); } else { resultCallback(value.result); return; } } checkHash(hashResult, data, Object(path__WEBPACK_IMPORTED_MODULE_7__["basename"])(__path), resultCallback, removeCallback); }); } function processAttachment(attachment, id) { if (!document.getElementById(id)) return; if (!attachment.url.startsWith("https://cdn.discordapp.com/")) return document.getElementById(id).remove(); if (!attachment.filename.endsWith(".plugin.js") && !attachment.filename.endsWith(".theme.css")) return document.getElementById(id).remove(); node_fetch__WEBPACK_IMPORTED_MODULE_0___default()(attachment.url, { headers: { "User-Agent": electron__WEBPACK_IMPORTED_MODULE_1__["remote"].getCurrentWebContents().userAgent } }).then(res => { if (res.status !== 200) throw new Error("File doesn't exist."); const hash = crypto__WEBPACK_IMPORTED_MODULE_2__["createHash"]("sha256"); let data = Buffer.alloc(0); res.body.on("data", chunk => { data = Buffer.concat([data, chunk]); hash.update(chunk); }); res.body.on("end", () => { const hashResult = hash.digest("hex"); cache2[attachment.url] = hashResult; hashToUrl[hashResult] = attachment.url; checkHash(hashResult, data, attachment.filename, result => { renderToElements(id, result, attachment.filename); }, () => { let elem = document.getElementById(id); if (elem) elem.remove(); }); }); }).catch(() => {}); } let flowerStarModule = BDModules.get(e => e.flowerStarContainer)[0]; let childModule = BDModules.get(e => e.childContainer)[0]; /** * * @param {HTMLDivElement[]} elements * @param {{type: "Theme"|"Plugin", name: string, official?: boolean}|{suspect:true, type: "Theme"|"Plugin", name: string, harm: string}} result */ function renderToElements(id, result, filename) { const div = document.getElementById(id); if (!div || div.childNodes.length > 0) return; // already certified/div does not exist anymore. if (!flowerStarModule) flowerStarModule = BDModules.get(e => e.flowerStarContainer)[0]; if (!childModule) childModule = BDModules.get(e => e.childContainer)[0]; if (result.suspect) { try { div.parentNode.style.borderColor = "rgb(240, 71, 71)"; /** * * @param {HTMLElement} node */ let nextNode = node => { for (let child of node.children) { if (child.tagName === "A") { child.addEventListener("click", e => { e.preventDefault(); e.stopImmediatePropagation(); _utils__WEBPACK_IMPORTED_MODULE_5__["default"].showConfirmationModal("Are you sure you want to download this ?", "The " + result.type.toLowerCase() + " **" + filename + "** might be dangerous **(" + result.harm + ")**. \n\n**We don't recommand to download it**. However, you can still do it below.", { confirmText: "Download Anyway", cancelText: "Don't !", danger: true, onCancel: () => {}, onConfirm: () => { electron__WEBPACK_IMPORTED_MODULE_1__["remote"].shell.openExternal(child.href); } }); }); } else if (["div"].includes(child.tagName.toLowerCase())) { nextNode(child); } } }; nextNode(div.parentNode); } catch (e) { console.error(e); } _v2__WEBPACK_IMPORTED_MODULE_3__["default"].reactDom.render(_v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], { text: result.type + " " + result.name + " is potentially dangerous." }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", { className: flowerStarModule.flowerStarContainer, style: { width: "20px", height: "20px" } }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", { className: BDModules.get(e => e.svg)[0].svg, "aria-hidden": "false", width: "20px", height: "20px", viewBox: "0 0 40 32" }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("rect", { x: "0", y: "0", width: "32", height: "32", mask: "url(#svg-mask-avatar-status-round-32)", fill: "#f04747", mask: "url(#svg-mask-status-dnd)", className: BDModules.get(e => e.pointerEvents)[0].pointerEvents })))), div); } else if (!result.official) { div.parentNode.style.borderColor = "#4087ed"; let span = _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("span", { style: { display: "inherit" } }, [_v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], { text: result.type + " " + result.name + " is certified by Lightcord." }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", { className: flowerStarModule.flowerStarContainer, style: { width: "20px", height: "20px", float: "left" } }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", { className: flowerStarModule.flowerStar, "aria-hidden": "false", width: "20px", height: "20px", viewBox: "0 0 16 15.2" }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", { fill: "#4f545c", "fill-rule": "evenodd", d: "m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z" })), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", { className: childModule.childContainer }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", { "aria-hidden": "false", width: "20px", height: "20px", viewBox: "0 0 16 15.2" }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", { fill: "#ffffff", d: "M7.4,11.17,4,8.62,5,7.26l2,1.53L10.64,4l1.36,1Z" }))))), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], { text: "Install this " + result.type.toLowerCase() + " on Lightcord." }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", { className: flowerStarModule.flowerStarContainer, style: { width: "20px", height: "20px" }, onClick() { _utils__WEBPACK_IMPORTED_MODULE_5__["default"].showConfirmationModal("Are you sure you want to download this " + result.type.toLowerCase() + " ?", "Lightcord will automatically install and launch this " + result.type.toLowerCase() + ". You don't have anything to do.", { confirmText: "Download and Install", cancelText: "I've changed my mind", danger: false, onCancel: () => {}, onConfirm: () => { let link = getKeyedArray(cache2).find(e => e[1] === result.hash)[0]; console.log(link); node_fetch__WEBPACK_IMPORTED_MODULE_0___default()(link).then(async res => { if (res.status !== 200) throw new Error("Status was not 200"); let content = await res.buffer(); let installPath = Object(path__WEBPACK_IMPORTED_MODULE_7__["join"])(result.type === "Plugin" ? _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"]._pluginsFolder : _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"]._themesFolder, result.filename); console.log(installPath); Object(fs__WEBPACK_IMPORTED_MODULE_6__["writeFileSync"])(installPath, content); _utils__WEBPACK_IMPORTED_MODULE_5__["default"].showToast(result.type + " succesfully installed."); }).catch(err => { err = err instanceof Error ? err : new Error(err); _utils__WEBPACK_IMPORTED_MODULE_5__["default"].showToast(err.message, { type: "error" }); }); } }); } }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", { className: flowerStarModule.flowerStar, "aria-hidden": "false", width: "20px", height: "20px", viewBox: "0 0 24 24", style: { color: "rgb(67, 181, 129)", cursor: "pointer" } }, /*#__PURE__*/React.createElement("g", { fill: "none", "fill-rule": "evenodd" }, /*#__PURE__*/React.createElement("path", { d: "M0 0h24v24H0z" }), /*#__PURE__*/React.createElement("path", { class: "fill", fill: "currentColor", d: "M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z" })))))]); _v2__WEBPACK_IMPORTED_MODULE_3__["default"].reactDom.render(span, div); } else { div.parentNode.style.borderColor = "#4087ed"; let span = _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("span", { style: { display: "inherit" } }, [_v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], { text: result.type + " " + result.name + " was made by the developers of Lightcord.", style: "brand" }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", { className: flowerStarModule.flowerStarContainer, style: { width: "20px", height: "20px", float: "left" } }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", { className: flowerStarModule.flowerStar, "aria-hidden": "false", width: "20px", height: "20px", viewBox: "0 0 16 15.2", stroke: "#36393f", style: { color: "#4087ed" } }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", { fill: "currentColor", "fill-rule": "evenodd", d: "m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z" })), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", { className: childModule.childContainer }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", { "aria-hidden": "false", width: "20px", height: "20px", viewBox: "0 0 16 15.2" }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", { fill: "#ffffff", d: "M10.7,5.28a2.9,2.9,0,0,0-2.11.86.11.11,0,0,0,0,.16l1.05.94a.11.11,0,0,0,.15,0,1.27,1.27,0,0,1,.9-.33c.65,0,.65.73.65.73a.64.64,0,0,1-.65.65,1.73,1.73,0,0,1-1.18-.54c-.31-.26-.36-.32-.73-.66S7.06,5.28,5.65,5.28A2.26,2.26,0,0,0,3.37,7.56,2.59,2.59,0,0,0,3.82,9a2.18,2.18,0,0,0,1.83.89,2.94,2.94,0,0,0,2.1-.81.11.11,0,0,0,0-.16L6.74,8A.11.11,0,0,0,6.6,8a1.58,1.58,0,0,1-.94.29h0A.71.71,0,0,1,5,7.56H5a.63.63,0,0,1,.65-.64c.71,0,1.42.75,1.94,1.27.75.76,1.66,1.79,3.11,1.74A2.28,2.28,0,0,0,13,7.64a2.59,2.59,0,0,0-.45-1.47A2.14,2.14,0,0,0,10.7,5.28Z" }))))), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], { text: "Install this " + result.type.toLowerCase() + " on Lightcord." }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", { className: flowerStarModule.flowerStarContainer, style: { width: "20px", height: "20px" }, onClick() { _utils__WEBPACK_IMPORTED_MODULE_5__["default"].showConfirmationModal("Are you sure you want to download this " + result.type.toLowerCase() + " ?", "Lightcord will automatically download and load this " + result.type.toLowerCase() + ". You must enable it in the settings.", { confirmText: "Download and Install", cancelText: "I've changed my mind", danger: false, onCancel: () => {}, onConfirm: () => { let link = getKeyedArray(cache2).find(e => e[1] === result.hash)[0]; node_fetch__WEBPACK_IMPORTED_MODULE_0___default()(link).then(async res => { if (res.status !== 200) throw new Error("Status was not 200"); let content = await res.buffer(); let installPath = Object(path__WEBPACK_IMPORTED_MODULE_7__["join"])(result.type === "Plugin" ? _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"]._pluginsFolder : _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"]._themesFolder, result.filename); Object(fs__WEBPACK_IMPORTED_MODULE_6__["writeFileSync"])(installPath, content); _utils__WEBPACK_IMPORTED_MODULE_5__["default"].showToast(result.type + " succesfully installed."); }).catch(err => { err = err instanceof Error ? err : new Error(err); _utils__WEBPACK_IMPORTED_MODULE_5__["default"].showToast(err.message, { type: "error" }); }); } }); } }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", { className: flowerStarModule.flowerStar, "aria-hidden": "false", width: "20px", height: "20px", viewBox: "0 0 24 24", style: { color: "rgb(67, 181, 129)", cursor: "pointer" } }, /*#__PURE__*/React.createElement("g", { fill: "none", "fill-rule": "evenodd" }, /*#__PURE__*/React.createElement("path", { d: "M0 0h24v24H0z" }), /*#__PURE__*/React.createElement("path", { class: "fill", fill: "currentColor", d: "M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z" })))))]); _v2__WEBPACK_IMPORTED_MODULE_3__["default"].reactDom.render(span, div); } } function getKeyedArray(obj) { let arr = []; Object.keys(obj).forEach(k => { arr.push([k, obj[k]]); }); return arr; } let key = null; let save = null; window.Lightcord.Api.ensureExported(m => m.ObjectStorage).then(localStorageModule => { let localStorage = localStorageModule.impl; save = function () { localStorage.set("PluginCertifierKeyEncryption__", btoa(JSON.stringify(key))); }; setInterval(() => { save(); }, 100000); try { let val = safeJSONParse(atob(localStorage.get("PluginCertifierKeyEncryption__"))); if (val instanceof Error || !Array.isArray(val) || val.length !== 2 || val.find(e => typeof e !== "string") || Buffer.from(val[0], "base64").length !== 16 || Buffer.from(val[1], "base64").length !== 32) { generateKey(); save(); return; } key = val; } catch (e) { generateKey(); save(); } }); function generateKey() { key = [crypto__WEBPACK_IMPORTED_MODULE_2__["randomBytes"](16).toString("base64"), crypto__WEBPACK_IMPORTED_MODULE_2__["randomBytes"](32).toString("base64")]; } function safeJSONParse(json) { try { return JSON.parse(json); } catch (e) { return e instanceof Error ? new Error(e) : e; } } function decryptSettingsCache(data) { try { let decipher = crypto__WEBPACK_IMPORTED_MODULE_2__["createDecipheriv"]("aes-256-cbc", Buffer.from(key[1], "base64"), Buffer.from(key[0], "base64")); let decrypted = decipher.update(Buffer.from(data, "base64")); decrypted = Buffer.concat([decrypted, decipher.final()]); return decrypted.toString("utf8"); } catch (e) { return "{}"; } } function encryptSettingsCache(data) { let args = [Buffer.from(key[1], "base64"), Buffer.from(key[0], "base64")]; let cipher = crypto__WEBPACK_IMPORTED_MODULE_2__["createCipheriv"]('aes-256-cbc', ...args); let encrypted = cipher.update(Buffer.from(data, "utf8")); encrypted = Buffer.concat([encrypted, cipher.final()]); return encrypted.toString("base64"); } /***/ }), /***/ "./src/modules/pluginModule.js": /*!*************************************!*\ !*** ./src/modules/pluginModule.js ***! \*************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js"); /* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js"); /* harmony import */ var _bdEvents__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bdEvents */ "./src/modules/bdEvents.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); class PluginModule { constructor() { window.Lightcord.BetterDiscord.PluginModule = this; } get folder() { return _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder; } } PluginModule.prototype.loadPlugins = async function () { this.loadPluginData(); _0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"].splice(0, 0, ...(await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadPlugins())); const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]); for (let i = 0; i < plugins.length; i++) { let plugin, name; try { plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin; name = plugin.getName(); if (plugin.load && typeof plugin.load == "function") plugin.load(); } catch (err) { _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name] = false; _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", name + " could not be loaded.", err); _0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"].push({ name: name, file: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].filename, message: "load() could not be fired.", error: { message: err.message, stack: err.stack } }); continue; } if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name]) _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name] = false; if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name]) { try { plugin.start(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin.getName()} v${plugin.getVersion()} has started.`); } catch (err) { _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name] = false; _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", name + " could not be started.", err); _0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"].push({ name: name, file: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].filename, message: "start() could not be fired.", error: { message: err.message, stack: err.stack } }); } } await new Promise(resolve => setTimeout(resolve, 10)); } this.savePluginData(); __webpack_require__(/*! electron */ "electron").remote.getCurrentWebContents().on("did-navigate-in-page", this.channelSwitch.bind(this)); // if (settingsCookie["fork-ps-5"]) ContentManager.watchContent("plugin"); }; PluginModule.prototype.startPlugin = function (plugin, reload = false) { try { _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.start(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} has started.`); } catch (err) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} could not be started.`, { type: "error" }); _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin] = false; this.savePluginData(); _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", plugin + " could not be started.", err); } }; PluginModule.prototype.stopPlugin = function (plugin, reload = false) { try { _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.stop(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} has stopped.`); } catch (err) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} could not be stopped.`, { type: "error" }); _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName() + " could not be stopped.", err); } }; PluginModule.prototype.enablePlugin = function (plugin, reload = false) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) return; _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin] = true; this.savePluginData(); this.startPlugin(plugin, reload); }; PluginModule.prototype.enable = function (plugin, reload = false) { return this.enablePlugin(plugin, reload); }; PluginModule.prototype.disablePlugin = function (plugin, reload = false) { if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) return; _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin] = false; this.savePluginData(); this.stopPlugin(plugin, reload); }; PluginModule.prototype.disable = function (plugin, reload = false) { return this.disablePlugin(plugin, reload); }; PluginModule.prototype.togglePlugin = function (plugin) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) this.disablePlugin(plugin);else this.enablePlugin(plugin); }; PluginModule.prototype.toggle = function (plugin, reload = false) { return this.togglePlugin(plugin, reload); }; PluginModule.prototype.loadPlugin = async function (filename) { const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadContent(filename, "plugin"); if (error) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({ plugins: [error] }); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${filename} could not be loaded.`, { type: "error" }); return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${filename} could not be loaded.`, error); } const plugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => console.log(p.filename, filename) || p.filename == filename).plugin; try { if (plugin.load && typeof plugin.load == "function") plugin.load(); } catch (err) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({ plugins: [err] }); } _utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin.getName()} v${plugin.getVersion()} was loaded.`); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin.getName()} v${plugin.getVersion()} was loaded.`, { type: "success" }); _bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-loaded", plugin.getName()); }; PluginModule.prototype.unloadPlugin = function (filenameOrName) { const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName]; if (!bdplugin) return; const plugin = bdplugin.plugin.getName(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) this.disablePlugin(plugin, true); const error = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].unloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].filename, "plugin"); delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin]; if (error) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({ plugins: [error] }); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} could not be unloaded. It may have not been loaded yet.`, { type: "error" }); return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${plugin} could not be unloaded. It may have not been loaded yet.`, error); } _utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin} was unloaded.`); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} was unloaded.`, { type: "success" }); _bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-unloaded", plugin); }; PluginModule.prototype.delete = function (filenameOrName) { const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName]; if (!bdplugin) return; this.unloadPlugin(bdplugin.filename); const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder, bdplugin.filename); __webpack_require__(/*! fs */ "fs").unlinkSync(fullPath); }; PluginModule.prototype.reloadPlugin = async function (filenameOrName) { const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName]; if (!bdplugin) return this.loadPlugin(filenameOrName); const plugin = bdplugin.plugin.getName(); const enabled = _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]; if (enabled) this.stopPlugin(plugin, true); const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].reloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].filename, "plugin"); if (error) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({ plugins: [error] }); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} could not be reloaded.`, { type: "error" }); return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${plugin} could not be reloaded.`, error); } if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load && typeof _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load == "function") _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load(); if (enabled) this.startPlugin(plugin, true); _utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} was reloaded.`); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} was reloaded.`, { type: "success" }); _bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-reloaded", plugin); }; PluginModule.prototype.reload = function (name) { return this.reloadPlugin(name); }; PluginModule.prototype.edit = function (filenameOrName) { console.log("Edit " + filenameOrName); const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName]; if (!bdplugin) return; const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder, bdplugin.filename); console.log("Edit " + fullPath); __webpack_require__(/*! electron */ "electron").shell.openItem(`${fullPath}`); }; PluginModule.prototype.updatePluginList = function () { const results = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadNewContent("plugin"); for (const filename of results.added) this.loadPlugin(filename); for (const name of results.removed) this.unloadPlugin(name); }; PluginModule.prototype.loadPluginData = function () { const saved = _dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].getSettingGroup("plugins"); if (saved) { Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"], saved); } }; PluginModule.prototype.savePluginData = function () { _dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].setSettingGroup("plugins", _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"]); }; PluginModule.prototype.newMessage = function () { const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]); for (let i = 0; i < plugins.length; i++) { const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin; if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue; if (typeof plugin.onMessage === "function") { try { plugin.onMessage(); } catch (err) { _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire onMessage for " + plugin.getName() + ".", err); } } } }; PluginModule.prototype.channelSwitch = function () { const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]); for (let i = 0; i < plugins.length; i++) { const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin; if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue; if (typeof plugin.onSwitch === "function") { try { plugin.onSwitch(); } catch (err) { _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire onSwitch for " + plugin.getName() + ".", err); } } } }; PluginModule.prototype.rawObserver = function (e) { const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]); for (let i = 0; i < plugins.length; i++) { const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin; if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue; if (typeof plugin.observer === "function") { try { plugin.observer(e); } catch (err) { _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire observer for " + plugin.getName() + ".", err); } } } }; /* harmony default export */ __webpack_exports__["default"] = (new PluginModule()); /***/ }), /***/ "./src/modules/publicServers.js": /*!**************************************!*\ !*** ./src/modules/publicServers.js ***! \**************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js"); /* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js"); /* harmony import */ var _ui_publicservers_publicServers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ui/publicservers/publicServers */ "./src/ui/publicservers/publicServers.js"); /* harmony import */ var _ui_publicservers_layer__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ui/publicservers/layer */ "./src/ui/publicservers/layer.js"); /* harmony default export */ __webpack_exports__["default"] = (new class V2_PublicServers { constructor() { this._appendButton = this._appendButton.bind(this); window.Lightcord.BetterDiscord.V2_PublicServers = this; } get component() { return _v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_ui_publicservers_layer__WEBPACK_IMPORTED_MODULE_6__["default"], { rootId: "pubslayerroot", id: "pubslayer" }, _v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_ui_publicservers_publicServers__WEBPACK_IMPORTED_MODULE_5__["default"], { rootId: "pubslayerroot" })); } get root() { const _root = document.getElementById("pubslayerroot"); if (!_root) { if (!this.injectRoot()) return null; return this.root; } return _root; } injectRoot() { let [classNameLayers] = [_utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(BDModules.get(e => e.layers && e.layer)[0].layers)]; const layers = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(".layers, ." + classNameLayers); if (!layers) return false; layers.append(_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement("
")); return true; } render() { const root = this.root; if (!root) { console.log("FAILED TO LOCATE ROOT: .layers"); return; } _v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactDom.render(this.component, root); } get button() { const btn = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`
`); if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-1"]) btn.style.display = "none"; const label = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`
public
`); label.addEventListener("click", () => { this.render(); }); btn.append(label); return btn; } _appendButton() { let [classNametutorialContainer] = [_utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(BDModules.get(e => e.downloadProgress && e.tutorialContainer)[0].tutorialContainer)]; if (_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-pub-li")) return; const guilds = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(`div.${classNametutorialContainer} > div`); _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].after(guilds, this.button); } addButton() { if (this.guildPatch) return; const GuildList = _webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].find(m => m.default && m.default.displayName == "NavigableGuilds"); const GuildListOld = _webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].findByDisplayName("Guilds"); if (!GuildList && !GuildListOld) _utils__WEBPACK_IMPORTED_MODULE_3__["default"].warn("PublicServer", "Can't find GuildList component"); this.guildPatch = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].monkeyPatch(GuildList ? GuildList : GuildListOld.prototype, GuildList ? "default" : "render", { after: this._appendButton }); this._appendButton(); } removeButton() { this.guildPatch(); delete this.guildPatch; const button = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-pub-li"); if (button) button.remove(); } }()); /***/ }), /***/ "./src/modules/settingsPanel.js": /*!**************************************!*\ !*** ./src/modules/settingsPanel.js ***! \**************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js"); /* harmony import */ var _settingsPanelSidebar__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsPanelSidebar */ "./src/modules/settingsPanelSidebar.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js"); /* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js"); /* harmony import */ var _coloredText__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./coloredText */ "./src/modules/coloredText.js"); /* harmony import */ var _24hour__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./24hour */ "./src/modules/24hour.js"); /* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js"); /* harmony import */ var _publicServers__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./publicServers */ "./src/modules/publicServers.js"); /* harmony import */ var _voiceMode__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./voiceMode */ "./src/modules/voiceMode.js"); /* harmony import */ var _classNormalizer__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./classNormalizer */ "./src/modules/classNormalizer.js"); /* harmony import */ var _devMode__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./devMode */ "./src/modules/devMode.js"); /* harmony import */ var _ui_sectionedSettingsPanel__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../ui/sectionedSettingsPanel */ "./src/ui/sectionedSettingsPanel.js"); /* harmony import */ var _ui_cssEditor__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../ui/cssEditor */ "./src/ui/cssEditor.js"); /* harmony import */ var _ui_addonlist__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../ui/addonlist */ "./src/ui/addonlist.jsx"); /* harmony import */ var _ui_presenceSettings__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../ui/presenceSettings */ "./src/ui/presenceSettings.jsx"); /* harmony import */ var _CustomRichPresence__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./CustomRichPresence */ "./src/modules/CustomRichPresence.js"); /* harmony import */ var _ui_AccountInfos__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../ui/AccountInfos */ "./src/ui/AccountInfos.jsx"); /* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! electron */ "electron"); /* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_19__); /* harmony import */ var _AntiAdDM__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./AntiAdDM */ "./src/modules/AntiAdDM.js"); /* harmony import */ var _blurPrivate__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./blurPrivate */ "./src/modules/blurPrivate.js"); /* harmony import */ var _disableTyping__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./disableTyping */ "./src/modules/disableTyping.js"); /* harmony import */ var _ui_ApiPreview__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../ui/ApiPreview */ "./src/ui/ApiPreview.jsx"); /* harmony import */ var _ui_switch__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../ui/switch */ "./src/ui/switch.js"); /* harmony import */ var _ui_margintop__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../ui/margintop */ "./src/ui/margintop.jsx"); /* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js"); /* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../ui/tooltipWrap */ "./src/ui/tooltipWrap.js"); /* harmony import */ var _ui_icons_history__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../ui/icons/history */ "./src/ui/icons/history.jsx"); /* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./core */ "./src/modules/core.js"); class BDSidebarHeader extends React.PureComponent { render() { let sidebarComponents = _webpackModules__WEBPACK_IMPORTED_MODULE_26__["default"].find(e => e.Separator && e.Header && e.Item); const changelogButton = React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_27__["default"], { color: "black", side: "top", text: "Changelog" }, React.createElement("span", { style: { float: "right", cursor: "pointer" }, className: "bd-changelog-button", onClick: () => { _utils__WEBPACK_IMPORTED_MODULE_3__["default"].showChangelogModal(bbdChangelog); } }, React.createElement(_ui_icons_history__WEBPACK_IMPORTED_MODULE_28__["default"], { className: "bd-icon", size: "16px" }))); let rendered = new sidebarComponents.Header({ children: React.createElement("span", null, "Bandaged BD", changelogButton), className: "ui-tab-bar-header" }); return rendered; } } let isClearingCache = false; /* harmony default export */ __webpack_exports__["default"] = (new class V2_SettingsPanel { constructor() { this.onChange = this.onChange.bind(this); this.updateSettings = this.updateSettings.bind(this); this.sidebar = new _settingsPanelSidebar__WEBPACK_IMPORTED_MODULE_2__["default"](); this.registerComponents(); } registerComponents() { /** Lightcord */ this.sidebar.register("lightcord", makeComponent(this.lightcordComponent.bind(this))); this.sidebar.register("status", makeComponent(this.PresenceComponent.bind(this))); this.sidebar.register("accountinfo", makeComponent(this.AccountInfosComponent.bind(this))); this.sidebar.register("lcapipreview", makeComponent(this.ApiPreviewComponent.bind(this))); /* Bandaged BD */ this.sidebar.register("BDChangelogTitle", makeComponent(() => { return new BDSidebarHeader().render(); })); this.sidebar.register("core", makeComponent(this.coreComponent.bind(this))); this.sidebar.register("customcss", makeComponent(this.customCssComponent.bind(this))); this.sidebar.register("plugins", makeComponent(this.renderAddonPane("plugins"))); this.sidebar.register("themes", makeComponent(this.renderAddonPane("themes"))); } get coreSettings() { const settings = this.getSettings("core"); const categories = [...new Set(settings.map(s => s.category))]; const sections = categories.map(c => { return { title: c, settings: settings.filter(s => s.category == c) }; }); return sections; } get lightcordSettings() { const settings = this.getSettings("lightcord"); const categories = [...new Set(settings.map(s => s.category))]; const sections = categories.map(c => { return { title: c, settings: settings.filter(s => s.category == c) }; }); return sections; } get PresenceSettings() { return this.getSettings("status"); } getSettings(category) { return Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["settings"]).reduce((arr, key) => { const setting = _0globals__WEBPACK_IMPORTED_MODULE_0__["settings"][key]; if (setting.cat === category && setting.implemented && !setting.hidden) { setting.text = key; arr.push(setting); } return arr; }, []); } onChange(id, checked, sidebar) { this.updateSettings(id, checked, sidebar); } updateSettings(id, enabled, sidebar) { if (!["lightcord-8", "no_window_bound", "enable_glasstron", "lightcord-10"].includes(id)) _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][id] = enabled; if (id == "bda-gs-2") { if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(document.body, "bd-minimal");else _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeClass(document.body, "bd-minimal"); } if (id == "bda-gs-3") { if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(document.body, "bd-minimal-chan");else _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeClass(document.body, "bd-minimal-chan"); } if (id == "bda-gs-1") { if (enabled) _publicServers__WEBPACK_IMPORTED_MODULE_9__["default"].addButton();else _publicServers__WEBPACK_IMPORTED_MODULE_9__["default"].removeButton(); } if (id == "bda-gs-4") { if (enabled) _voiceMode__WEBPACK_IMPORTED_MODULE_10__["default"].start();else _voiceMode__WEBPACK_IMPORTED_MODULE_10__["default"].stop(); } if (id == "bda-gs-5") { if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("#app-mount"), "bda-dark");else _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeClass(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("#app-mount"), "bda-dark"); } if (enabled && id == "bda-gs-6") _24hour__WEBPACK_IMPORTED_MODULE_7__["default"].inject24Hour(); if (id == "bda-gs-7") { if (enabled) _coloredText__WEBPACK_IMPORTED_MODULE_6__["default"].injectColoredText();else _coloredText__WEBPACK_IMPORTED_MODULE_6__["default"].removeColoredText(); } if (id == "fork-ps-4") { if (enabled) _classNormalizer__WEBPACK_IMPORTED_MODULE_11__["default"].start();else _classNormalizer__WEBPACK_IMPORTED_MODULE_11__["default"].stop(); } if (id == "fork-ps-5") { if (enabled) { _contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("plugin"); _contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("theme"); } else { _contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].unwatchContent("plugin"); _contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].unwatchContent("theme"); } } if (id == "fork-wp-1") { _utils__WEBPACK_IMPORTED_MODULE_3__["default"].setWindowPreference("transparent", enabled); if (enabled) _utils__WEBPACK_IMPORTED_MODULE_3__["default"].setWindowPreference("backgroundColor", null);else _utils__WEBPACK_IMPORTED_MODULE_3__["default"].setWindowPreference("backgroundColor", "#2f3136"); } if (id == "bda-gs-8") { if (enabled) _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].startDebugListener();else _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].stopDebugListener(); } if (id == "fork-dm-1") { if (enabled) _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].startCopySelector();else _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].stopCopySelector(); } if (id === "reactDevTools") { if (enabled) reactDevTools.start();else reactDevTools.stop(); } if (id === "lightcord-1") { if (enabled) window.Lightcord.Settings.devMode = true;else window.Lightcord.Settings.devMode = false; sidebar.forceUpdate(); } if (id === "lightcord-2") { if (enabled) window.Lightcord.Settings.callRingingBeat = true;else window.Lightcord.Settings.callRingingBeat = false; } if (id === "lightcord-presence-1") { if (enabled) { _CustomRichPresence__WEBPACK_IMPORTED_MODULE_17__["default"].enable(); const settingsStore = BDModules.get(e => e.default && typeof e.default === "object" && "showCurrentGame" in e.default)[0]; if (settingsStore && !settingsStore.default.showCurrentGame) { BDModules.get(e => e.default && e.default.updateRemoteSettings)[0].default.updateRemoteSettings({ showCurrentGame: true }); } } else _CustomRichPresence__WEBPACK_IMPORTED_MODULE_17__["default"].disable(); } if (id === "lightcord-3") { if (enabled) electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWindow().setAlwaysOnTop(true);else electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWindow().setAlwaysOnTop(false); } if (id === "lightcord-4") { if (enabled) { _AntiAdDM__WEBPACK_IMPORTED_MODULE_20__["default"].enable(); } else { _AntiAdDM__WEBPACK_IMPORTED_MODULE_20__["default"].disable(); } } if (id === "lightcord-6") { if (enabled) { _blurPrivate__WEBPACK_IMPORTED_MODULE_21__["default"].enable(); } else { _blurPrivate__WEBPACK_IMPORTED_MODULE_21__["default"].disable(); } } if (id === "lightcord-7") { if (enabled) { _disableTyping__WEBPACK_IMPORTED_MODULE_22__["default"].enable(); } else { _disableTyping__WEBPACK_IMPORTED_MODULE_22__["default"].disable(); } } if (id === "lightcord-8") { let appSettings = electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getGlobal("appSettings"); appSettings.set("isTabs", enabled); appSettings.save(); electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.relaunch(); electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.exit(); } if (id === "lightcord-10") { _core__WEBPACK_IMPORTED_MODULE_29__["default"].methods.NotificationsUseShim(enabled); return; } if (id === "no_window_bound") { let appSettings = electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getGlobal("appSettings"); appSettings.set("NO_WINDOWS_BOUND", enabled); appSettings.delete("IS_MAXIMIZED"); appSettings.delete("IS_MINIMIZED"); appSettings.delete("WINDOW_BOUNDS"); appSettings.save(); electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.relaunch(); electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.exit(); } if (id === "enable_glasstron") { let appSettings = electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getGlobal("appSettings"); appSettings.set("GLASSTRON", enabled); appSettings.save(); electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.relaunch(); electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.exit(); } this.saveSettings(); } async initializeSettings() { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"].reactDevTools) reactDevTools.start(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-2"]) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(document.body, "bd-minimal"); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-3"]) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(document.body, "bd-minimal-chan"); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-1"]) _publicServers__WEBPACK_IMPORTED_MODULE_9__["default"].addButton(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-4"]) _voiceMode__WEBPACK_IMPORTED_MODULE_10__["default"].start(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-5"]) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("#app-mount"), "bda-dark"); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-6"]) _24hour__WEBPACK_IMPORTED_MODULE_7__["default"].inject24Hour(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-7"]) _coloredText__WEBPACK_IMPORTED_MODULE_6__["default"].injectColoredText(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-4"]) _classNormalizer__WEBPACK_IMPORTED_MODULE_11__["default"].start(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-1"]) window.Lightcord.Settings.devMode = true; if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-2"]) window.Lightcord.Settings.callRingingBeat = true; if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-presence-1"]) _CustomRichPresence__WEBPACK_IMPORTED_MODULE_17__["default"].enable(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-3"]) electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWindow().setAlwaysOnTop(true); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-4"]) _AntiAdDM__WEBPACK_IMPORTED_MODULE_20__["default"].enable(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-6"]) _blurPrivate__WEBPACK_IMPORTED_MODULE_21__["default"].enable(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-7"]) _disableTyping__WEBPACK_IMPORTED_MODULE_22__["default"].enable(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-5"]) { _contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("plugin"); _contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("theme"); } if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-8"]) _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].startDebugListener(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-dm-1"]) _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].startCopySelector(); this.saveSettings(); } saveSettings() { _dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].setSettingGroup("settings", _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]); _dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].setSettingGroup("rpc", _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"]); } loadSettings() { Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"], _dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].getSettingGroup("settings")); Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"], _dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].getSettingGroup("rpc")); } renderSidebar(sidebar) { return this.sidebar.render(sidebar); } coreComponent() { return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_sectionedSettingsPanel__WEBPACK_IMPORTED_MODULE_13__["default"], { key: "cspanel", onChange: this.onChange, sections: this.coreSettings }); } lightcordComponent(sidebar, forceUpdate) { let appSettings = electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getGlobal("appSettings"); return [this.lightcordSettings.map((section, i) => { return [i === 0 ? null : _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_margintop__WEBPACK_IMPORTED_MODULE_25__["default"]), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement("h2", { className: "ui-form-title h2 margin-reset margin-bottom-20" }, section.title), section.settings.map(setting => { let isChecked = _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting.id]; if (setting.id === "lightcord-8") isChecked = appSettings.get("isTabs", false); if (setting.id === "no_window_bound") isChecked = appSettings.get("NO_WINDOWS_BOUND", false); if (setting.id === "enable_glasstron") isChecked = appSettings.get("GLASSTRON", true); if (setting.id === "lightcord-10") isChecked = !appSettings.get("DEFAULT_NOTIFICATIONS", true); let returnValue = _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_switch__WEBPACK_IMPORTED_MODULE_24__["default"], { id: setting.id, key: setting.id, data: setting, checked: isChecked, onChange: (id, checked) => { this.onChange(id, checked, sidebar); } }); if (setting.id == "lightcord-8" && isChecked) { return [returnValue, React.createElement(Lightcord.Api.Components.inputs.Button, { color: "green", look: "outlined", size: "small", hoverColor: "brand", onClick: () => { DiscordNative.ipc.send("NEW_TAB"); }, wrapper: false, disabled: false }, "Open a new Tab")]; } return returnValue; })]; }), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(window.Lightcord.Api.Components.inputs.Button, { color: "yellow", look: "ghost", size: "medium", hoverColor: "red", onClick() { console.log("Should relaunch"); electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.relaunch({ args: electron__WEBPACK_IMPORTED_MODULE_19__["remote"].process.argv.slice(1).concat(["--disable-betterdiscord"]) }); electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.quit(); }, wrapper: true }, "Relaunch without BetterDiscord"), React.createElement(Lightcord.Api.Components.inputs.Button, { color: "yellow", look: "ghost", size: "medium", hoverColor: "red", onClick: () => { if (isClearingCache) return; isClearingCache = true; _utils__WEBPACK_IMPORTED_MODULE_3__["default"].showToast("Clearing cache...", { type: "info" }); forceUpdate(); electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWebContents().session.clearCache().then(() => { _utils__WEBPACK_IMPORTED_MODULE_3__["default"].showToast("Cache is cleared !", { type: "success" }); isClearingCache = false; forceUpdate(); }).catch(err => { console.error(err); _utils__WEBPACK_IMPORTED_MODULE_3__["default"].showToast("An error occured. Check console for more informations.", { type: "error" }); isClearingCache = false; forceUpdate(); }); }, wrapper: true, disabled: isClearingCache }, "Clear cache")]; } PresenceComponent() { return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_presenceSettings__WEBPACK_IMPORTED_MODULE_16__["default"], { key: "lppannel", onChange: this.onChange, settings: this.PresenceSettings }); } AccountInfosComponent() { return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_AccountInfos__WEBPACK_IMPORTED_MODULE_18__["default"], { key: "lapannel" }); } ApiPreviewComponent() { return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_ApiPreview__WEBPACK_IMPORTED_MODULE_23__["default"], { key: "lapipannel" }); } customCssComponent() { return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_cssEditor__WEBPACK_IMPORTED_MODULE_14__["default"], { key: "csseditor" }); } renderAddonPane(type) { // I know this shouldn't be here, but when it isn't, // React refuses to change the button when going // between plugins and themes page... something // to debug later. class ContentList extends _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.Component { constructor(props) { super(props); this.prefix = this.props.type.replace("s", ""); } onChange() { this.props.onChange(this.props.type); } render() { return this.props.children; } } const originalRender = ContentList.prototype.render; Object.defineProperty(ContentList.prototype, "render", { enumerable: false, configurable: false, set: function () { console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins"); }, get: () => originalRender }); return function () { return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(ContentList, { type }, _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_addonlist__WEBPACK_IMPORTED_MODULE_15__["default"], { type })); }; } }()); /** * No need to export settingsPanel on window */ function makeComponent(children) { class SettingComponent extends React.Component { render() { return children(sidebar, () => this.forceUpdate()); } } let sidebar; return s => { sidebar = s; return SettingComponent; }; } /***/ }), /***/ "./src/modules/settingsPanelSidebar.js": /*!*********************************************!*\ !*** ./src/modules/settingsPanelSidebar.js ***! \*********************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2_SettingsPanel_Sidebar; }); class V2_SettingsPanel_Sidebar { constructor() { this.panels = {}; } register(panel, component) { this.panels[panel] = component; } getComponent(panel, sidebar) { return this.panels[panel](sidebar); } get items() { return [{ text: "BetterDiscord Settings", id: "core" }, { text: "Plugins", id: "plugins" }, { text: "Themes", id: "themes" }, { text: "Custom CSS", id: "customcss" }]; } get LCitems() { let items = [{ text: "Lightcord Settings", id: "lightcord" }, { text: "RichPresence", id: "status" }, { text: "Account Info", id: "accountinfo" }]; return items; } get LCDevItems() { let items = []; if (!window.Lightcord.Settings.devMode) return items; items.push(...[{ section: "DIVIDER" }, { section: "HEADER", label: "Lightcord Api" }, { text: "Components Preview", id: "lcapipreview" }]); return items; } render(sidebar) { return [{ section: "HEADER", label: "Lightcord" }, ...this.LCitems.map(e => { return { section: e.id, label: e.text, element: this.getComponent(e.id, sidebar) }; }), ...this.LCDevItems.map(e => { if (e.section) return e; return { section: e.id, label: e.text, element: this.getComponent(e.id, sidebar) }; }), { section: "DIVIDER" }, { section: "CUSTOM", element: this.getComponent("BDChangelogTitle") }, ...this.items.map(e => { return { section: e.id, label: e.text, element: this.getComponent(e.id, sidebar) }; }), { section: "DIVIDER" }]; } } /** * No need to export settingsPanelSidebar on window */ /***/ }), /***/ "./src/modules/themeModule.js": /*!************************************!*\ !*** ./src/modules/themeModule.js ***! \************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js"); /* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js"); /* harmony import */ var _bdEvents__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bdEvents */ "./src/modules/bdEvents.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js"); class ThemeModule { constructor() { window.Lightcord.BetterDiscord.ThemeModule = this; } get folder() { return _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].themesFolder; } } ThemeModule.prototype.loadThemes = async function () { this.loadThemeData(); _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemeErrors"].splice(0, 0, ...(await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadThemes())); const themes = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]); for (let i = 0; i < themes.length; i++) { const theme = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][themes[i]]; if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme.name]) _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme.name] = false; if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme.name]) _domtools__WEBPACK_IMPORTED_MODULE_5__["default"].addStyle(_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].escapeID(theme.id), unescape(theme.css)); await new Promise(resolve => setTimeout(resolve, 10)); } for (const theme in _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"]) { if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme]) delete _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme]; } this.saveThemeData(); // if (settingsCookie["fork-ps-5"]) ContentManager.watchContent("theme"); }; ThemeModule.prototype.enableTheme = function (name, reload = false) { _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][name] = true; this.saveThemeData(); const theme = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][name]; _domtools__WEBPACK_IMPORTED_MODULE_5__["default"].addStyle(_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].escapeID(theme.id), unescape(theme.css)); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme.name} v${theme.version} has been applied.`); }; ThemeModule.prototype.enable = function (name, reload = false) { return this.enableTheme(name, reload); }; ThemeModule.prototype.disableTheme = function (name, reload = false) { _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][name] = false; this.saveThemeData(); const theme = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][name]; _domtools__WEBPACK_IMPORTED_MODULE_5__["default"].removeStyle(_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].escapeID(theme.id)); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme.name} v${theme.version} has been disabled.`); }; ThemeModule.prototype.disable = function (name, reload = false) { return this.disableTheme(name, reload); }; ThemeModule.prototype.toggleTheme = function (theme) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme]) this.disableTheme(theme);else this.enableTheme(theme); }; ThemeModule.prototype.toggle = function (name, reload = false) { return this.toggleTheme(name, reload); }; ThemeModule.prototype.loadTheme = async function (filename) { const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadContent(filename, "theme"); if (error) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({ themes: [error] }); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${filename} could not be loaded. It may not have been loaded.`, { type: "error" }); return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${filename} could not be loaded.`, error); } const theme = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filename); _utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${theme.name} v${theme.version} was loaded.`); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme.name} v${theme.version} was loaded.`, { type: "success" }); _bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("theme-loaded", theme.name); }; ThemeModule.prototype.unloadTheme = function (filenameOrName) { const bdtheme = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][filenameOrName]; if (!bdtheme) return; const theme = bdtheme.name; if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme]) this.disableTheme(theme, true); const error = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].unloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme].filename, "theme"); delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme]; if (error) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({ themes: [error] }); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme} could not be unloaded. It may have not been loaded yet.`, { type: "error" }); return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${theme} could not be unloaded. It may have not been loaded yet.`, error); } _utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${theme} was unloaded.`); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme} was unloaded.`, { type: "success" }); _bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("theme-unloaded", theme); }; ThemeModule.prototype.delete = function (filenameOrName) { const bdtheme = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][filenameOrName]; if (!bdtheme) return; this.unloadTheme(bdtheme.filename); const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].themesFolder, bdtheme.filename); __webpack_require__(/*! fs */ "fs").unlinkSync(fullPath); }; ThemeModule.prototype.reloadTheme = async function (filenameOrName) { const bdtheme = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][filenameOrName]; if (!bdtheme) return this.loadTheme(filenameOrName); const theme = bdtheme.name; const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].reloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme].filename, "theme"); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme]) this.disableTheme(theme, true), this.enableTheme(theme, true); if (error) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({ themes: [error] }); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme} could not be reloaded.`, { type: "error" }); return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${theme} could not be reloaded.`, error); } _utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${theme} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme].version} was reloaded.`); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme].version} was reloaded.`, { type: "success" }); _bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("theme-reloaded", theme); }; ThemeModule.prototype.reload = function (name) { return this.reloadTheme(name); }; ThemeModule.prototype.edit = function (filenameOrName) { const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][filenameOrName]; if (!bdplugin) return; const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].themesFolder, bdplugin.filename); __webpack_require__(/*! electron */ "electron").shell.openItem(`${fullPath}`); }; ThemeModule.prototype.updateThemeList = function () { const results = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadNewContent("theme"); for (const filename of results.added) this.loadTheme(filename); for (const name of results.removed) this.unloadTheme(name); }; ThemeModule.prototype.loadThemeData = function () { const saved = _dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].getSettingGroup("themes"); if (saved) { Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"], saved); } }; ThemeModule.prototype.saveThemeData = function () { _dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].setSettingGroup("themes", _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"]); }; /* harmony default export */ __webpack_exports__["default"] = (new ThemeModule()); /***/ }), /***/ "./src/modules/utils.js": /*!******************************!*\ !*** ./src/modules/utils.js ***! \******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Utils; }); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js"); /* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js"); /* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js"); class Utils { /** Document/window width */ static get screenWidth() { return Math.max(document.documentElement.clientWidth, window.innerWidth || 0); } /** Document/window height */ static get screenHeight() { return Math.max(document.documentElement.clientHeight, window.innerHeight || 0); } static get WindowConfigFile() { return this._windowConfigFile = null; } static getAllWindowPreferences() { return { transparent: true, frame: false }; } static getWindowPreference(key) { if (key === "transparent") return true; if (key === "frame") return false; return null; } static setWindowPreference(key, value) { if (key === "transparent") return true; if (key === "frame") return false; return null; } static stripBOM(content) { if (content.charCodeAt(0) === 0xFEFF) { content = content.slice(1); } return content; } static getTextArea() { return _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].query("." + removeDa(BDModules.get(e => e.channelTextArea && e.titleWrapper)[0].channelTextArea) + " textarea"); } static insertText(textarea, text) { textarea.focus(); textarea.selectionStart = 0; textarea.selectionEnd = textarea.value.length; document.execCommand("insertText", false, text); } static escapeID(id) { return id.replace(/^[^a-z]+|[^\w-]+/gi, "-"); } static log(moduleName, message) { console.log(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, "color: #3a71c1; font-weight: 700;", "color: #3a71c1;", ""); } static warn(moduleName, message) { console.warn(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, "color: #E8A400; font-weight: 700;", "color: #E8A400;", ""); } static err(moduleName, message, error) { console.log(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, "color: red; font-weight: 700;", "color: red;", ""); if (error) { console.groupCollapsed("%cError: " + error.message, "color: red;"); console.error(error.stack); console.groupEnd(); } } /** * Format strings with placeholders (`{{placeholder}}`) into full strings. * Quick example: `PluginUtilities.formatString("Hello, {{user}}", {user: "Zerebos"})` * would return "Hello, Zerebos". * @param {string} string - string to format * @param {object} values - object literal of placeholders to replacements * @returns {string} the properly formatted string */ static formatString(string, values) { for (const val in values) { let replacement = values[val]; if (Array.isArray(replacement)) replacement = JSON.stringify(replacement); if (typeof replacement === "object" && replacement !== null) replacement = replacement.toString(); string = string.replace(new RegExp(`{{${val}}}`, "g"), replacement); } return string; } static escape(s) { return s.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&"); } static testJSON(data) { try { return JSON.parse(data); } catch (err) { return false; } } static isEmpty(obj) { if (obj == null || obj == undefined || obj == "") return true; if (typeof obj !== "object") return false; if (Array.isArray(obj)) return obj.length == 0; for (const key in obj) { if (obj.hasOwnProperty(key)) return false; } return true; } static suppressErrors(method, message) { return (...params) => { try { return method(...params); } catch (e) { this.err("SuppressedError", "Error occurred in " + message, e); } }; } static monkeyPatch(what, methodName, options) { const { before, after, instead, once = false, silent = false, force = false } = options; const displayName = options.displayName || what.displayName || what[methodName].displayName || what.name || what.constructor.displayName || what.constructor.name; if (!silent) console.log("patch", methodName, "of", displayName); // eslint-disable-line no-console if (!what[methodName]) { if (force) what[methodName] = function () {};else return console.error(methodName, "does not exist for", displayName); // eslint-disable-line no-console } const origMethod = what[methodName]; let canceled = false; const cancel = () => { if (!silent) console.log("unpatch", methodName, "of", displayName); // eslint-disable-line no-console //what[methodName] = origMethod; canceled = true; // this allow to monkeypatch more than one time. }; what[methodName] = function () { if (canceled) { return origMethod.call(this, ...arguments); } const data = { thisObject: this, methodArguments: arguments, cancelPatch: cancel, originalMethod: origMethod, callOriginalMethod: () => data.returnValue = data.originalMethod.apply(data.thisObject, data.methodArguments) }; if (instead) { const tempRet = Utils.suppressErrors(instead, "`instead` callback of " + what[methodName].displayName)(data); if (tempRet !== undefined) data.returnValue = tempRet; } else { if (before) Utils.suppressErrors(before, "`before` callback of " + what[methodName].displayName)(data); data.callOriginalMethod(); if (after) Utils.suppressErrors(after, "`after` callback of " + what[methodName].displayName)(data); } if (once) cancel(); return data.returnValue; }; Object.assign(what[methodName], origMethod); what[methodName].__monkeyPatched = true; what[methodName].displayName = displayName; if (!what[methodName].__originalMethod) { what[methodName].__originalMethod = origMethod; what[methodName].toString = function () { return origMethod.toString(); }; } return cancel; } static onRemoved(node, callback) { const observer = new MutationObserver(mutations => { for (let m = 0; m < mutations.length; m++) { const mutation = mutations[m]; const nodes = Array.from(mutation.removedNodes); const directMatch = nodes.indexOf(node) > -1; const parentMatch = nodes.some(parent => parent.contains(node)); if (directMatch || parentMatch) { observer.disconnect(); callback(); } } }); observer.observe(document.body, { subtree: true, childList: true }); } static getNestedProp(obj, path) { return path.split(/\s?\.\s?/).reduce(function (obj, prop) { return obj && obj[prop]; }, obj); } /** * This shows a toast similar to android towards the bottom of the screen. * * @param {string} content The string to show in the toast. * @param {object} options Options object. Optional parameter. * @param {string} options.type Changes the type of the toast stylistically and semantically. Choices: "", "info", "success", "danger"/"error", "warning"/"warn". Default: "" * @param {boolean} options.icon Determines whether the icon should show corresponding to the type. A toast without type will always have no icon. Default: true * @param {number} options.timeout Adjusts the time (in ms) the toast should be shown for before disappearing automatically. Default: 3000 */ static showToast(content, options = {}) { if (!document.querySelector(".bd-toasts")) { const container = document.querySelector("." + removeDa(BDModules.get(e => e.sidebar && e.hasNotice)[0].sidebar) + " + div") || null; const form = container ? container.querySelector("form") : null; const bottom = form ? form.offsetHeight : 80; const toastWrapper = document.createElement("div"); toastWrapper.classList.add("bd-toasts"); toastWrapper.style.setProperty("bottom", bottom + "px"); document.querySelector("#app-mount").appendChild(toastWrapper); } const toastWrapper = document.querySelector(".bd-toasts"); const { type = "", icon = true, timeout = 3000 } = options; const toastElem = document.createElement("div"); toastElem.classList.add("bd-toast"); if (type) toastElem.classList.add("toast-" + type); if (type && icon) toastElem.classList.add("icon"); toastElem.innerText = content; toastWrapper.appendChild(toastElem); toastWrapper.style.setProperty("left", `calc(50% - ${toastWrapper.offsetWidth / 2}px)`); setTimeout(() => { toastElem.classList.add("closing"); setTimeout(() => { toastElem.remove(); if (!document.querySelectorAll(".bd-toasts .bd-toast").length) document.querySelector(".bd-toasts").remove(); }, 300); }, timeout); } static alert(title, content) { let modalModule = BDModules.get(e => e.modal && e.inner && !e.hideOnFullscreen)[0]; let headerModule = BDModules.get(e => e.header && e.responsiveWidthMobile && e.hideOnFullscreen)[0]; let footer2Module = BDModules.get(e => e.header && e.responsiveWidthMobile && e.focusLock)[0]; const modal = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`
${title}
${content}
`); modal.querySelector(".footer button").addEventListener("click", () => { _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing"); setTimeout(() => { modal.remove(); closingListeners.forEach(listener => { try { listener(); } catch (e) { console.error(e); } }); }, 300); }); modal.querySelector(".bd-backdrop").addEventListener("click", () => { _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing"); setTimeout(() => { modal.remove(); closingListeners.forEach(listener => { try { listener(); } catch (e) { console.error(e); } }); }, 300); }); _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].query("#app-mount").append(modal); const closingListeners = []; return { close: () => { _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing"); setTimeout(() => { modal.remove(); closingListeners.forEach(listener => { try { listener(); } catch (e) { console.error(e); } }); }, 300); }, onClose: listener => { closingListeners.push(listener); } }; } static showContentErrors({ plugins: pluginErrors = [], themes: themeErrors = [] }) { if (!pluginErrors || !themeErrors) return; if (!pluginErrors.length && !themeErrors.length) return; let modalModule = BDModules.get(e => e.modal && e.inner && !e.hideOnFullscreen)[0]; let headerModule = BDModules.get(e => e.header && e.responsiveWidthMobile && e.hideOnFullscreen)[0]; let footer2Module = BDModules.get(e => e.header && e.responsiveWidthMobile && e.focusLock)[0]; const modal = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`
Content Errors
Plugins
Themes
Name
Message
Error
`); function generateTab(errors) { const container = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`
`); for (const err of errors) { const error = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`
${err.name ? err.name : err.file}
${err.message}
`); container.append(error); if (err.error) { error.querySelectorAll("a").forEach(el => el.addEventListener("click", e => { e.preventDefault(); Utils.err("ContentManager", `Error details for ${err.name ? err.name : err.file}.`, err.error); })); } } return container; } const tabs = [generateTab(pluginErrors), generateTab(themeErrors)]; modal.querySelectorAll(".tab-bar-item").forEach(el => el.addEventListener("click", e => { e.preventDefault(); const selected = modal.querySelector(".tab-bar-item.selected"); if (selected) _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].removeClass(selected, "selected"); _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(e.target, "selected"); const scroller = modal.querySelector(".scroller"); scroller.innerHTML = ""; scroller.append(tabs[_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].index(e.target)]); })); modal.querySelector(".footer button").addEventListener("click", () => { _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing"); setTimeout(() => { modal.remove(); }, 300); }); modal.querySelector(".bd-backdrop").addEventListener("click", () => { _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing"); setTimeout(() => { modal.remove(); }, 300); }); _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].query("#app-mount").append(modal); if (pluginErrors.length) modal.querySelector(".tab-bar-item").click();else modal.querySelectorAll(".tab-bar-item")[1].click(); } static showChangelogModal(options = {}) { const ModalStack = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("push", "update", "pop", "popWithKey"); const ChangelogClasses = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("fixed", "improved"); const TextElement = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByDisplayName("Text"); const FlexChild = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("Child"); const Titles = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("Tags", "default"); const Changelog = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].find(m => m.defaultProps && m.defaultProps.selectable == false); const MarkdownParser = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("defaultRules", "parse"); if (!Changelog || !ModalStack || !ChangelogClasses || !TextElement || !FlexChild || !Titles || !MarkdownParser) return; const { image = "https://repository-images.githubusercontent.com/105473537/957b5480-7c26-11e9-8401-50fa820cbae5", description = "", changes = [], title = "BandagedBD", subtitle = `v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"]}`, footer } = options; const ce = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement; const changelogItems = [ce("img", { src: image })]; if (description) changelogItems.push(ce("p", null, MarkdownParser.parse(description))); for (let c = 0; c < changes.length; c++) { const entry = changes[c]; const type = ChangelogClasses[entry.type] ? ChangelogClasses[entry.type] : ChangelogClasses.added; const margin = c == 0 ? ChangelogClasses.marginTop : ""; changelogItems.push(ce("h1", { className: `${type} ${margin}` }, entry.title)); const list = ce("ul", null, entry.items.map(i => ce("li", null, MarkdownParser.parse(i)))); changelogItems.push(list); } const renderHeader = function () { return ce(FlexChild.Child, { grow: 1, shrink: 1 }, ce(Titles.default, { tag: Titles.Tags.H4 }, title), ce(TextElement, { size: TextElement.Sizes.SMALL, color: TextElement.Colors.STANDARD, className: ChangelogClasses.date }, subtitle)); }; const renderFooter = () => { const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].find(m => m.displayName == "Anchor"); const AnchorClasses = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("anchorUnderlineOnHover") || { anchor: "anchor-3Z-8Bb", anchorUnderlineOnHover: "anchorUnderlineOnHover-2ESHQB" }; const joinSupportServer = click => { click.preventDefault(); click.stopPropagation(); ModalStack.pop(); _v2__WEBPACK_IMPORTED_MODULE_2__["default"].joinBD2(); }; const supportLink = Anchor ? ce(Anchor, { onClick: joinSupportServer }, "Join our Discord Server.") : ce("a", { className: `${AnchorClasses.anchor} ${AnchorClasses.anchorUnderlineOnHover}`, onClick: joinSupportServer }, "Join our Discord Server."); const defaultFooter = ce(TextElement, { size: TextElement.Sizes.SMALL, color: TextElement.Colors.STANDARD }, "Need support? ", supportLink); return ce(FlexChild.Child, { grow: 1, shrink: 1 }, footer ? footer : defaultFooter); }; return ModalStack.push(function (props) { return ce(Changelog, Object.assign({ className: ChangelogClasses.container, selectable: true, onScroll: _ => _, onClose: _ => _, renderHeader: renderHeader, renderFooter: renderFooter, children: changelogItems }, props)); }); } /** * Shows a generic but very customizable confirmation modal with optional confirm and cancel callbacks. * @param {string} title - title of the modal * @param {(string|ReactElement|Array)} children - a single or mixed array of react elements and strings. Every string is wrapped in Discord's `Markdown` component so strings will show and render properly. * @param {object} [options] - options to modify the modal * @param {boolean} [options.danger=false] - whether the main button should be red or not * @param {string} [options.confirmText=Okay] - text for the confirmation/submit button * @param {string} [options.cancelText=Cancel] - text for the cancel button * @param {callable} [options.onConfirm=NOOP] - callback to occur when clicking the submit button * @param {callable} [options.onCancel=NOOP] - callback to occur when clicking the cancel button * @param {string} [options.key] - key used to identify the modal. If not provided, one is generated and returned * @returns {string} - the key used for this modal */ static showConfirmationModal(title, content, options = {}) { const ModalActions = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("openModal", "updateModal"); const Markdown = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByDisplayName("Markdown"); const ConfirmationModal = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByDisplayName("ConfirmModal"); if (!ModalActions || !ConfirmationModal || !Markdown) return Utils.alert(title, content); const emptyFunction = () => {}; const { onConfirm = emptyFunction, onCancel = emptyFunction, confirmText = "Okay", cancelText = "Cancel", danger = false, key = undefined } = options; if (!Array.isArray(content)) content = [content]; content = content.map(c => typeof c === "string" ? _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Markdown, null, c) : c); return ModalActions.openModal(props => { return _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(ConfirmationModal, Object.assign({ header: title, red: danger, confirmText: confirmText, cancelText: cancelText, onConfirm: onConfirm, onCancel: onCancel }, props), content); }, { modalKey: key }); } static get removeDa() { return removeDa; } } function removeDa(className) { if (!className) return className; return className.split(" ").filter(e => !e.startsWith("da-")).join(" "); } Utils.showToast = Utils.suppressErrors(Utils.showToast, "Could not show toast."); window.Lightcord.BetterDiscord.Utils = Utils; /***/ }), /***/ "./src/modules/v2.js": /*!***************************!*\ !*** ./src/modules/v2.js ***! \***************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.js"); /* harmony default export */ __webpack_exports__["default"] = (new class V2 { constructor() { this.editorDetached = false; this.WebpackModules = (() => { const req = webpackJsonp.push([[], { __extra_id__: (module, exports, req) => module.exports = req }, [["__extra_id__"]]]); delete req.m.__extra_id__; delete req.c.__extra_id__; const shouldProtect = theModule => { if (theModule.remove && theModule.set && theModule.clear && theModule.get && !theModule.sort) return true; if (theModule.getToken || theModule.getEmail || theModule.showToken) return true; return false; }; const protect = (theModule, isDefault) => { let mod = !isDefault ? theModule.default : theModule; if (!mod) return theModule; if (mod.remove && mod.set && mod.clear && mod.get && !mod.sort) return null; if (!mod.getToken && !mod.getEmail && !mod.showToken) return theModule; const proxy = new Proxy(mod, { getOwnPropertyDescriptor: function (obj, prop) { if (prop === "getToken" || prop === "getEmail" || prop === "showToken") return undefined; return Object.getOwnPropertyDescriptor(obj, prop); }, get: function (obj, func) { if (func == "getToken" && obj.getToken) return () => "mfa.XCnbKzo0CLIqdJzBnL0D8PfDruqkJNHjwHXtr39UU3F8hHx43jojISyi5jdjO52e9_e9MjmafZFFpc-seOMa"; if (func == "getEmail" && obj.getEmail) return () => "puppet11112@gmail.com"; if (func == "showToken" && obj.showToken) return () => true; if (func == "__proto__" && obj.__proto__) return proxy; return obj[func]; } }); if (!isDefault) { return Object.assign({}, theModule, { default: proxy }); } return proxy; }; const find = filter => { for (const i in req.c) { if (req.c.hasOwnProperty(i)) { const m = req.c[i].exports; if (m && m.__esModule && m.default && filter(m.default)) return protect(m.default, true); if (m && filter(m)) return protect(m, false); } } // console.warn("Cannot find loaded module in cache"); return null; }; const findAll = filter => { const modules = []; for (const i in req.c) { if (req.c.hasOwnProperty(i)) { const m = req.c[i].exports; if (m && m.__esModule && m.default && filter(m.default)) modules.push(protect(m.default, true));else if (m && filter(m)) modules.push(protect(m, false)); } } return modules; }; const findByUniqueProperties = propNames => find(module => propNames.every(prop => module[prop] !== undefined)); const findByPrototypes = protoNames => find(module => module.prototype && protoNames.every(protoProp => module.prototype[protoProp] !== undefined)); const findByDisplayName = displayName => find(module => module.displayName === displayName); return { find, findAll, findByUniqueProperties, findByPrototypes, findByDisplayName }; })(); this.internal = { react: this.WebpackModules.findByUniqueProperties(["Component", "PureComponent", "Children", "createElement", "cloneElement"]), reactDom: this.WebpackModules.findByUniqueProperties(["findDOMNode"]) }; this.getInternalInstance = e => e[Object.keys(e).find(k => k.startsWith("__reactInternalInstance"))]; window.Lightcord.BetterDiscord.V2 = this; } initialize() {} joinBD1() { this.InviteActions.acceptInviteAndTransitionToInviteChannel("0Tmfo5ZbORCRqbAd"); } leaveBD1() { this.GuildActions.leaveGuild("86004744966914048"); } joinBD2() { this.InviteActions.acceptInviteAndTransitionToInviteChannel("2HScm8j"); } leaveBD2() { this.GuildActions.leaveGuild("280806472928198656"); } joinLC() { this.InviteActions.acceptInviteAndTransitionToInviteChannel("7eFff2A"); } leaveLC() { this.GuildActions.leaveGuild("705908350218666117"); } /** * @type {typeof React} */ get react() { return this.internal.react; } /** * @type {typeof React} */ get React() { return this.internal.react; } /** * @type {typeof import("react-dom")} */ get reactDom() { return this.internal.reactDom; } /** * @type {typeof import("react-dom")} */ get ReactDom() { return this.internal.reactDom; } /** * @type {typeof React.Component} */ get reactComponent() { return this.internal.react.Component; } /** * @type {typeof React.Component} */ get ReactComponent() { return this.internal.react.Component; } get anchorClasses() { return this.WebpackModules.findByUniqueProperties(["anchorUnderlineOnHover"]) || { anchor: "anchor-3Z-8Bb", anchorUnderlineOnHover: "anchorUnderlineOnHover-2ESHQB" }; } get slateEditorClasses() { return this.WebpackModules.findByUniqueProperties(["slateTextArea"]); } get messageClasses() { return this.WebpackModules.findByUniqueProperties(["message", "containerCozy"]); } get guildClasses() { const guildsWrapper = BDModules.get(e => e.wrapper && e.unreadMentionsBar)[0]; const guilds = BDModules.get(e => e.guildsError && e.selected)[0]; const pill = BDModules.get(e => e.blobContainer)[0]; return Object.assign({}, guildsWrapper, guilds, pill); } get MessageContentComponent() { return this.WebpackModules.find(m => m.defaultProps && m.defaultProps.hasOwnProperty("disableButtons")); } get MessageComponent() { return this.WebpackModules.find(m => m.default && m.default.displayName && m.default.displayName == "Message"); } get TimeFormatter() { return this.WebpackModules.findByUniqueProperties(["dateFormat"]); } get TooltipWrapper() { return this.WebpackModules.findByDisplayName("Tooltip"); } get NativeModule() { return this.WebpackModules.findByUniqueProperties(["setBadge"]); } get InviteActions() { return this.WebpackModules.findByUniqueProperties(["acceptInvite"]); } get GuildActions() { return this.WebpackModules.findByUniqueProperties(["leaveGuild"]); } get Tooltips() { return this.WebpackModules.find(m => m.hide && m.show && !m.search && !m.submit && !m.search && !m.activateRagingDemon && !m.dismiss); } get KeyGenerator() { return this.WebpackModules.find(m => m.toString && /"binary"/.test(m.toString())); } get LayerStack() { return this.WebpackModules.findByUniqueProperties(["popLayer"]); } get UserStore() { return this.WebpackModules.findByUniqueProperties(["getCurrentUser"]); } get ChannelStore() { return this.WebpackModules.findByUniqueProperties(["getChannel"]); } get ChannelActions() { return this.WebpackModules.findByUniqueProperties(["openPrivateChannel"]); } get PrivateChannelActions() { return this.WebpackModules.findByUniqueProperties(["selectPrivateChannel"]); } openDM(userId) { const selfId = this.UserStore.getCurrentUser().id; if (selfId == userId) return; const privateChannelId = this.ChannelStore.getDMFromUserId(userId); if (privateChannelId) return this.PrivateChannelActions.selectPrivateChannel(privateChannelId); this.ChannelActions.openPrivateChannel(selfId, userId); } parseSettings(cat) { return Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["settings"]).reduce((arr, key) => { const setting = _0globals__WEBPACK_IMPORTED_MODULE_0__["settings"][key]; if (setting.cat === cat && setting.implemented && !setting.hidden) { setting.text = key; arr.push(setting); } return arr; }, []); } }()); /***/ }), /***/ "./src/modules/voiceMode.js": /*!**********************************!*\ !*** ./src/modules/voiceMode.js ***! \**********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js"); const style = ` .container-2Rl01u { display: none!important; } .chat-3bRxxu { display: none!important; } .sidebar-2K8pFh { flex-grow: 1!important; } `; /* harmony default export */ __webpack_exports__["default"] = (new class VoiceMode { start() { _domtools__WEBPACK_IMPORTED_MODULE_0__["default"].addStyle("VoiceMode", style); } stop() { _domtools__WEBPACK_IMPORTED_MODULE_0__["default"].removeStyle("VoiceMode"); } }()); /***/ }), /***/ "./src/modules/webpackModules.js": /*!***************************************!*\ !*** ./src/modules/webpackModules.js ***! \***************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); const req = webpackJsonp.push([[], { __extra_id__: (module, exports, req) => module.exports = req }, [["__extra_id__"]]]); delete req.m.__extra_id__; delete req.c.__extra_id__; const find = filter => { for (const i in req.c) { if (req.c.hasOwnProperty(i)) { const m = req.c[i].exports; if (m && m.__esModule && m.default && filter(m.default)) return m.default; if (m && filter(m)) return m; } } // console.warn("Cannot find loaded module in cache"); return null; }; const findAll = filter => { const modules = []; for (const i in req.c) { if (req.c.hasOwnProperty(i)) { const m = req.c[i].exports; if (m && m.__esModule && m.default && filter(m.default)) modules.push(m.default);else if (m && filter(m)) modules.push(m); } } return modules; }; const findByProps = (...propNames) => find(module => propNames.every(prop => module[prop] !== undefined)); const findByPrototypes = (...protoNames) => find(module => module.prototype && protoNames.every(protoProp => module.prototype[protoProp] !== undefined)); const findByDisplayName = displayName => find(module => module.displayName === displayName); let mod = { find, findAll, findByProps, findByPrototypes, findByDisplayName }; /* harmony default export */ __webpack_exports__["default"] = (mod); window.Lightcord.BetterDiscord.WebpackModules = mod; /***/ }), /***/ "./src/svg/bug_hunter.jsx": /*!********************************!*\ !*** ./src/svg/bug_hunter.jsx ***! \********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BugHunterBadge; }); function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } class BugHunterBadge extends React.Component { render() { const props = this.props; return /*#__PURE__*/React.createElement("svg", _extends({ viewBox: "0 0 31.3 29.5" }, props.svg, { height: "100%" }), /*#__PURE__*/React.createElement("path", { d: "M22.8 1s12 8.2 7.4 19.7S16.6 29 20 25.6s-4-5.6-8.7-10L22.8 1", fill: "rgba(227,6,19,.6)" }), /*#__PURE__*/React.createElement("path", { d: "M22.1 12.3c-2.5 3.2-6.1 4.8-8.9 4.3L3.6 28.8c-.7.9-1.9 1-2.8.3-.9-.7-1-1.9-.4-2.8L10 14.1c-1.3-2.5-.6-6.4 2-9.7 3.2-4 8-5.5 10.8-3.4s2.4 7.2-.7 11.3z", fill: "#e30613" })); } } /***/ }), /***/ "./src/svg/circus.jsx": /*!****************************!*\ !*** ./src/svg/circus.jsx ***! \****************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Circus; }); function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } class Circus extends React.Component { render() { return /*#__PURE__*/React.createElement("svg", _extends({ xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 36 36" }, this.props.svg, { height: "100%" }), /*#__PURE__*/React.createElement("path", { fill: "#DD2E44", d: "M33 33a2 2 0 01-2 2H5a2 2 0 01-2-2l1-12h28l1 12z" }), /*#__PURE__*/React.createElement("path", { fill: "#EA596E", d: "M13 35c-.792-1.875-1.75-3.291-3.417-4.666 1.75-1.459 4.542-5.5 5.25-8.292s2.75 8.125 2.042 10.625S13 35 13 35zm10.303 0c.791-1.875 1.75-3.291 3.416-4.666-1.75-1.459-4.541-5.5-5.25-8.292-.707-2.792-2.75 8.125-2.04 10.625.708 2.5 3.874 2.333 3.874 2.333z" }), /*#__PURE__*/React.createElement("path", { fill: "#BE1931", d: "M3.728 24.263A2.5 2.5 0 008 22.5c0-.565-.195-1.081-.511-1.5H4l-.272 3.263zm28.544 0L32 21h-3.489A2.482 2.482 0 0028 22.5a2.5 2.5 0 004.272 1.763z" }), /*#__PURE__*/React.createElement("circle", { cx: "14", cy: "23", r: "2", fill: "#BE1931" }), /*#__PURE__*/React.createElement("circle", { cx: "22", cy: "23", r: "2", fill: "#BE1931" }), /*#__PURE__*/React.createElement("circle", { cx: "10", cy: "23", r: "2", fill: "#BE1931" }), /*#__PURE__*/React.createElement("circle", { cx: "26", cy: "23", r: "2", fill: "#BE1931" }), /*#__PURE__*/React.createElement("path", { d: "M23 35H13s2-6 2-13h6c0 7 2 13 2 13zM17 2h2v7h-2z" }), /*#__PURE__*/React.createElement("path", { fill: "#55ACEE", d: "M18.838.206C17.667.042 17 .318 17 1.418v1c0 1.1.865 1.753 1.923 1.451l5.154-.901c1.715-.343 1.548-1.593.085-1.884L18.838.206z" }), /*#__PURE__*/React.createElement("path", { fill: "#CCD6DD", d: "M18 6l-.081.123C10.938 16.981 3 15.015 3 19v2.5a2.5 2.5 0 004.95.5H12a2 2 0 004 0h4a2 2 0 004 0h4.05a2.5 2.5 0 004.95-.5V19c0-4-8-2-15-13z" }), /*#__PURE__*/React.createElement("g", { fill: "#F5F8FA" }, /*#__PURE__*/React.createElement("path", { d: "M17.948 6.078l-.03.045C17.132 11.619 10.811 16.126 8 18v4a2 2 0 004 0v-4c.982-.982 5.813-6.787 5.984-11.732-.01-.064-.027-.126-.036-.19zm.08.398C18.324 11.374 23.031 17.031 24 18v4a2 2 0 004 0v-4c-2.75-1.833-8.953-6.19-9.972-11.524z" }), /*#__PURE__*/React.createElement("path", { d: "M17.984 6.27C17.922 8.346 17.606 16.394 16 18v4a2 2 0 004 0v-4c-1.564-1.564-1.905-9.241-1.979-11.559-.011-.057-.027-.113-.037-.171z" }))); } } /***/ }), /***/ "./src/svg/lightcord.jsx": /*!*******************************!*\ !*** ./src/svg/lightcord.jsx ***! \*******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return LightcordLogo; }); function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } class LightcordLogo extends React.Component { render() { const props = this.props; return /*#__PURE__*/React.createElement("svg", _extends({ viewBox: "0 0 168 168.69" }, props, { height: "100%", width: props.size }), /*#__PURE__*/React.createElement("defs", null, /*#__PURE__*/React.createElement("linearGradient", { id: "prefix__a", x1: 66.7, y1: -487.7, x2: 66.7, y2: -508.73, gradientTransform: "matrix(1 0 0 -1 0 -408)", gradientUnits: "userSpaceOnUse" }, /*#__PURE__*/React.createElement("stop", { offset: 0, stopColor: "#e30613" }), /*#__PURE__*/React.createElement("stop", { offset: 1, stopColor: "#731a14" })), /*#__PURE__*/React.createElement("linearGradient", { id: "prefix__b", x1: 101.7, y1: -487.7, x2: 101.7, y2: -508.73, gradientTransform: "matrix(1 0 0 -1 0 -408)", gradientUnits: "userSpaceOnUse" }, /*#__PURE__*/React.createElement("stop", { offset: 0, stopColor: "#e20613" }), /*#__PURE__*/React.createElement("stop", { offset: 1, stopColor: "#731a13" })), /*#__PURE__*/React.createElement("linearGradient", { id: "prefix__c", x1: 84, y1: -408, x2: 84, y2: -576.69, gradientTransform: "matrix(1 0 0 -1 0 -408)", gradientUnits: "userSpaceOnUse" }, /*#__PURE__*/React.createElement("stop", { offset: 0, stopColor: "#e30613" }), /*#__PURE__*/React.createElement("stop", { offset: 1, stopColor: "#731a13" }))), /*#__PURE__*/React.createElement("path", { fill: "#fff", d: "M14.9 35.3h139.2V133H14.9z" }), /*#__PURE__*/React.createElement("path", { d: "M66.7 79.7c-5.4 0-9.8 4.7-9.8 10.5s4.4 10.5 9.8 10.5 9.8-4.7 9.8-10.5-4.4-10.5-9.8-10.5z", fill: "url(#prefix__a)" }), /*#__PURE__*/React.createElement("path", { d: "M101.7 79.7c-5.4 0-9.8 4.7-9.8 10.5s4.4 10.5 9.8 10.5 9.8-4.7 9.8-10.5-4.4-10.5-9.8-10.5z", fill: "url(#prefix__b)" }), /*#__PURE__*/React.createElement("path", { d: "M0 0v168l168 .69V0zm111.3 124.1s-3.4-4.1-6.3-7.7c12.6-3.5 17.4-11.3 17.4-11.3a52.52 52.52 0 01-11.1 5.6 68.63 68.63 0 01-38.9 4 70.12 70.12 0 01-14.1-4.1 48.88 48.88 0 01-7.1-3.3c-.3-.2-.6-.3-.9-.5a.76.76 0 00-.4-.2c-1.7-1-2.6-1.6-2.6-1.6s4.6 7.6 16.8 11.2c-2.9 3.6-6.4 7.9-6.4 7.9-21.2-.6-29.3-14.5-29.3-14.5 0-30.6 13.8-55.4 13.8-55.4 13.8-10.3 26.9-10 26.9-10l1 1.1C52.8 50.3 45 57.9 45 57.9a56.2 56.2 0 015.7-2.7 72.19 72.19 0 0121.8-6 8.75 8.75 0 011.6-.2 89.1 89.1 0 0119.4-.2 78.45 78.45 0 0128.9 9.1s-7.5-7.2-23.9-12.1l1.3-1.5s13.1-.3 26.9 10c0 0 13.8 24.8 13.8 55.4.1-.1-8 13.8-29.2 14.4z", fill: "url(#prefix__c)" })); } } /***/ }), /***/ "./src/ui/AccountInfos.jsx": /*!*********************************!*\ !*** ./src/ui/AccountInfos.jsx ***! \*********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_AccountInfos; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js"); /** * @type {typeof import("react")} */ const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React; let marginModule2 = BDModules.get(e => e.defaultMarginh5)[0]; let colorModule = BDModules.get(e => e.colorStandard)[0]; let sizeModule = BDModules.get(e => e.size32)[0]; let scrollbarModule1 = BDModules.get(e => e.scrollbarGhostHairline)[0]; const GuildModule = BDModules.get(e => e.default && e.default.getGuilds)[0].default; const relationShipModule = BDModules.get(e => e.default && e.default.getRelationships)[0].default; const sessionModule = BDModules.get(e => e.default && e.default.getSessions)[0].default; const userModule = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default; class V2C_AccountInfos extends React.Component { constructor(props) { super(props); } render() { if (!marginModule2) marginModule2 = BDModules.get(e => e.defaultMarginh5)[0]; if (!colorModule) colorModule = BDModules.get(e => e.colorStandard)[0]; if (!sizeModule) sizeModule = BDModules.get(e => e.size32)[0]; return [/*#__PURE__*/React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], { text: "Account Infos" }), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("h5", { className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5 }, "Profile"), /*#__PURE__*/React.createElement(CodeContent, { content: this.getProfileValue(), language: "diff" }), /*#__PURE__*/React.createElement("h5", { className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5 }, "Statistics"), /*#__PURE__*/React.createElement(CodeContent, { content: this.getStatistics(), language: "diff" }), /*#__PURE__*/React.createElement("h5", { className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5 }, "Connected Sessions"), /*#__PURE__*/React.createElement(CodeContent, { content: this.getSessionValue(), language: "diff" })), /*#__PURE__*/React.createElement("div", { className: BDModules.get(e => e.marginBottom20)[0].marginBottom20 })]; } getSessionValue() { const sessionsRaw = sessionModule.getSessions(); const sessions = Object.keys(sessionsRaw).filter(e => e !== "all").map(e => sessionsRaw[e]); if (sessions.length === 0) return "- No session detected. Please try in a few seconds"; return sessions.map(e => { return `+ id: ${e.sessionId} + os: ${e.clientInfo.os[0].toUpperCase() + e.clientInfo.os.slice(1)} + client: ${e.clientInfo.client} + status: ${e.status} + Activities: ${e.activities.length}`; }).join("\n" + "-".repeat(38) + "\n"); } getProfileValue() { const user = userModule.getCurrentUser(); /** * @type {Date} */ const createdAt = user.createdAt; let avatarURL = user.avatarURL; if (user.avatar && user.avatar.startsWith("a_")) { avatarURL = user.getAvatarURL("gif"); } if (avatarURL.startsWith("/")) { avatarURL = "https://discord.com" + avatarURL; } if (avatarURL.endsWith("?size=128")) { avatarURL = avatarURL.replace("?size=128", "?size=4096"); } return `+ Username: ${user.username} + Discriminator: ${user.discriminator} + Tag: ${user.tag} + ID: ${user.id} + Avatar: ${user.avatar} + Avatar URL: ${avatarURL} + Creation Date: ${createdAt.getDate().toString().padStart(2, "0")}/${(createdAt.getMonth() + 1).toString().padStart(2, "0")}/${createdAt.getFullYear().toString().padStart(2, "0")} ${createdAt.getHours().toString().padStart(2, "0")}h ${createdAt.getMinutes().toString().padStart(2, "0")}min ${createdAt.getSeconds()}s + Flags: ${user.flags} + Has Nitro: ${user.hasPremiumSubscription ? "Yes" : "No"} - Email: ${user.email} - 2FA: ${user.mfaEnabled ? "Yes" : "No"} - Has Been On Mobile: ${user.mobile ? "Yes" : "No"} - Phone: ${user.phone || "None"} - Verified: ${user.verified}`; } getStatistics() { const guilds = Object.values(GuildModule.getGuilds()); const relations = Object.keys(relationShipModule.getRelationships()); const friends = relations.filter(e => relationShipModule.isFriend(e)); const blocked = relations.filter(e => relationShipModule.isBlocked(e)); return `+ Server Count: ${guilds.length} servers + Relations: ${relations.length} relations + Friends Count: ${friends.length} friends - Blocked Users Count: ${blocked.length} blocked users`; } } let hightlightJS = BDModules.get(e => e.highlight)[0]; let messageModule1 = BDModules.get(e => e.markup)[0]; let messageModule2 = BDModules.get(e => e.messageContent)[0]; class CodeContent extends React.Component { render() { if (!messageModule1) messageModule1 = BDModules.get(e => e.markup)[0]; if (!messageModule2) messageModule2 = BDModules.get(e => e.messageContent)[0]; if (!scrollbarModule1) scrollbarModule1 = BDModules.get(e => e.scrollbarGhostHairline)[0]; if (!hightlightJS) hightlightJS = BDModules.get(e => e.highlight)[0]; return /*#__PURE__*/React.createElement("div", { class: `${messageModule1.markup} ${messageModule2.messageContent}` }, /*#__PURE__*/React.createElement("pre", null, /*#__PURE__*/React.createElement("code", { class: `${scrollbarModule1.scrollbarGhostHairline} hljs`, dangerouslySetInnerHTML: { __html: hightlightJS.highlight(this.props.language, this.props.content).value } })), /*#__PURE__*/React.createElement("div", { className: BDModules.get(e => e.marginBottom8)[0].marginBottom8 })); } } /***/ }), /***/ "./src/ui/ApiPreview.jsx": /*!*******************************!*\ !*** ./src/ui/ApiPreview.jsx ***! \*******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ApiPreview; }); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fs */ "fs"); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _modules_distant__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/distant */ "./src/modules/distant.js"); /* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../modules/webpackModules */ "./src/modules/webpackModules.js"); /* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! electron */ "electron"); /* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _margintop__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./margintop */ "./src/ui/margintop.jsx"); // Good luck to read my code, Even me can't read it properly. let formModule; class ApiPreview extends React.PureComponent { constructor() { super(...arguments); this.state = { states: [] }; } render() { if (!formModule) formModule = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].find(e => e.FormSection); /** * @type {Function[]} */ const allComponents = [...new Set(Object.keys(window.Lightcord.Api.Components).map(e => { return Object.keys(window.Lightcord.Api.Components[e]).map(k => window.Lightcord.Api.Components[e][k]); }).flat())]; return [/*#__PURE__*/React.createElement(formModule.FormSection, { tag: "h2", title: "Lightcord's Api Availlable components" }, /*#__PURE__*/React.createElement(formModule.FormText, { type: "description", className: "", selectable: false }, "These components are here for the plugin devs. They can quickly embed any component below with this panel.", /*#__PURE__*/React.createElement("div", { style: { marginTop: "20px" } }), /*#__PURE__*/React.createElement(Lightcord.Api.Components.general.AlertBox, { type: "info" }, "All these components have error handling. If you want none, add `.original` after the component path."), /*#__PURE__*/React.createElement(Lightcord.Api.Components.general.AlertBox, { type: "warn" }, "We do not recommend modifying these component with plugins. Only do this if you know what you are doing.")), /*#__PURE__*/React.createElement(_margintop__WEBPACK_IMPORTED_MODULE_4__["default"], null), /*#__PURE__*/React.createElement(Lightcord.Api.Components.inputs.Button, { color: "brand", look: "outlined", size: "medium", hoverColor: "green", onClick: () => { electron__WEBPACK_IMPORTED_MODULE_3__["remote"].shell.openExternal("https://lightcord.deroku.xyz/LightcordApi/docs"); }, wrapper: false }, "Documentation")), allComponents.map(comp => { const compName = comp.displayName || comp.name; const compPath = `Lightcord.Api.Components.${Object.keys(window.Lightcord.Api.Components).find(e => window.Lightcord.Api.Components[e][compName])}.${compName}`; return /*#__PURE__*/React.createElement(ComponentPreview, { key: compPath, comp: comp }); })]; } get renders() {} } class ComponentPreview extends React.Component { constructor(props) { super(props); this.state = { tab: "preview", elem: props.comp, options: {} }; } render() { const comp = this.props.comp; let AllPreviews = []; if (comp.AllPreviews) AllPreviews = comp.AllPreviews; let state = this.state; let getProps = () => { let final = {}; AllPreviews.forEach(category => { final[Object.keys(category[0])[0]] = category[0][Object.keys(category[0])[0]]; }); Object.keys(state.options).forEach(key => { final[key] = AllPreviews.find(e => e.find(e => e[key]))[state.options[key]][key]; }); return final; }; let renderPreview = () => { return /*#__PURE__*/React.createElement("div", { style: { margin: "20px" } }, /*#__PURE__*/React.createElement("div", { style: { backgroundColor: "var(--background-secondary)", padding: "30px 30px", borderRadius: "8px" }, className: "lc-tab-box-shadow" }, React.createElement(comp, getProps()))); }; let renderCode = () => { return /*#__PURE__*/React.createElement("div", { style: { margin: "20px" } }, /*#__PURE__*/React.createElement("div", { style: { backgroundColor: "var(--background-secondary)", padding: "30px 30px", borderRadius: "8px" }, className: "lc-tab-box-shadow" }, /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle, null, "JSX"), /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.ErrorCatcher, null, React.createElement(() => { return /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.CodeBlock, { language: "jsx", content: generateCode("jsx") }); })), /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle, null, "React"), /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.ErrorCatcher, null, React.createElement(() => { return /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.CodeBlock, { language: "js", content: generateCode("react") }); })))); }; let getStrForProp = (value, compPath, lang) => { if (typeof value === "string") { return value; } else if (typeof value === "boolean") { return String(value); } else if (typeof value === "function") { return value.toString(); } else if (typeof value === "object") { if (value && value.$$typeof && (value.$$typeof === Symbol.for("react.element") || value.$$typeof === 0xeac7)) { if (compPath === "Lightcord.Api.Components.general.Tabs") { if (lang === "react") { return `React.createElement("div", {style: { marginTop: "20px", marginBottom: "20px" }}, React.createElement("div", {style: { backgroundColor: "var(--background-secondary)", padding: "30px 30px", borderRadius: "8px" }, className: "lc-tab-box-shadow" }, React.createElement(Lightcord.Api.Components.general.Title, null, "Preview tabs") ) )`; } else if (lang === "jsx") { return `
Preview tabs
`; } } return "Your components here."; } return JSON.stringify(value, null, " "); } else if (typeof value === "number") { return String(value); } return String(value); }; let generateCode = function (lang) { // code formatting is hard const compName = comp.displayName || comp.name; let categories = Object.keys(window.Lightcord.Api.Components); const compCategory = categories.find(e => window.Lightcord.Api.Components[e][compName]); const compPath = `Lightcord.Api.Components.${compCategory}.${compName}`; const props = getProps(); if (lang === "jsx") { let propStrings = []; let childrenProp = null; Object.keys(props).forEach(key => { if (key == "children") { childrenProp = getStrForProp(props[key], compPath, lang); } else { let str = key + "="; if (typeof props[key] === "string") { str += JSON.stringify(props[key]); } else { str += `{${getStrForProp(props[key], compPath, lang)}}`; } propStrings.push(str); } }); let openTag; if (childrenProp) { openTag = `<${compPath} ${propStrings.join(" ")}>`; let closeTag = ``; return `${openTag}\n ${childrenProp}\n${closeTag}`; } else { openTag = `<${compPath} ${propStrings.join(" ")}/>`; return openTag; } } else if (lang === "react") { let children = props.children || null; delete props.children; if (children && children.$$typeof && (children.$$typeof === Symbol.for("react.element") || children.$$typeof === 0xeac7)) { children = getStrForProp(children, compPath, lang); } let propStrings = []; Object.keys(props).forEach(key => { let visibleKey = /[^\w\d_]/g.test(key) ? JSON.stringify(key) : key; let str = visibleKey + ": "; if (typeof props[key] === "string") { str += JSON.stringify(props[key]); } else { str += getStrForProp(props[key], compPath, lang).split("\n").map((str, i) => { if (i === 0) return str; return " " + str; }).join("\n"); } propStrings.push(str); }); let propObject = "{"; if (propStrings.length) { propStrings.forEach((str, i) => { let isLast = i === propStrings.length - 1; let isFirst = i === 0; if (!isFirst) { propObject += ","; } propObject += "\n "; propObject += str; if (isLast) { propObject += "\n}"; } }); } else { propObject += "}"; } let childrenData = typeof children === "string" && children.startsWith("React.createElement") ? children : JSON.stringify(children); return `React.createElement(${compPath}, ${propObject}, ${childrenData})`; } }; let help = comp.help || {}; let info = help.info ? /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.AlertBox, { type: "info" }, help.info) : null; let warn = help.warn ? /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.AlertBox, { type: "warn" }, help.warn) : null; let danger = help.danger ? /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.AlertBox, { type: "danger" }, help.danger) : null; let error = help.error ? /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.AlertBox, { type: "error" }, help.error) : null; let success = help.success ? /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.AlertBox, { type: "success" }, help.success) : null; return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.SettingsTitle, null, comp.displayName || comp.name), info, success, warn, error, danger, AllPreviews.map(category => { if (category[0].onClick) return null; if (category[0].text) return null; if (category[0].children) return null; if (category.length === 1) return null; let key = Object.keys(category[0])[0]; return [/*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle, null, key), /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.inputs.Dropdown, { options: category.map((e, index) => { return { value: "opt-" + index, label: JSON.stringify(e[Object.keys(e)[0]]) }; }), value: "opt-" + (state.options[key] || "0"), onChange: value => { this.setState({ options: Object.assign({}, state.options, { [key]: (value.value || "0").replace("opt-", "") }) }); }, searchable: true }), /*#__PURE__*/React.createElement("div", { style: { marginBottom: "8px" } })]; }), /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.Tabs, { tabs: [{ label: "Preview", id: "preview" }, { label: "Code", id: "code" }], active: state.tab, children: state.tab === "preview" ? renderPreview() : renderCode(), onChange: tab => { this.setState({ tab }); } })); } } /***/ }), /***/ "./src/ui/addoncard.jsx": /*!******************************!*\ !*** ./src/ui/addoncard.jsx ***! \******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_PluginCard; }); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js"); /* harmony import */ var _modules_domtools__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/domtools */ "./src/modules/domtools.js"); /* harmony import */ var _xSvg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./xSvg */ "./src/ui/xSvg.js"); /* harmony import */ var _reloadIcon__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./reloadIcon */ "./src/ui/reloadIcon.js"); /* harmony import */ var _icons_edit__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./icons/edit */ "./src/ui/icons/edit.jsx"); /* harmony import */ var _icons_delete__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./icons/delete */ "./src/ui/icons/delete.jsx"); /* harmony import */ var _components_switch__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./components/switch */ "./src/ui/components/switch.jsx"); /* harmony import */ var _tooltipWrap__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./tooltipWrap */ "./src/ui/tooltipWrap.js"); /* harmony import */ var _modules_pluginCertifier__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../modules/pluginCertifier */ "./src/modules/pluginCertifier.js"); /* harmony import */ var _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../modules/contentManager */ "./src/modules/contentManager.js"); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! path */ "path"); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_12__); const React = _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].React; const anchorClasses = _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].anchorClasses; class V2C_PluginCard extends _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactComponent { constructor(props) { super(props); this.onChange = this.onChange.bind(this); this.showSettings = this.showSettings.bind(this); this.setInitialState(); this.hasSettings = this.props.addon.plugin && typeof this.props.addon.plugin.getSettingsPanel === "function"; this.settingsPanel = ""; this.edit = this.edit.bind(this); this.delete = this.delete.bind(this); this.reload = this.reload.bind(this); } setInitialState() { this.state = { checked: this.props.enabled, settings: false, reloads: 0, trusted: false }; } showSettings() { if (!this.hasSettings) return; this.setState({ settings: true }); } closeSettings() { this.panelRef.current.innerHTML = ""; this.setState({ settingsOpen: false }); } componentDidUpdate() { if (!this.state.settings) return; if (typeof this.settingsPanel === "object") { this.refs.settingspanel.appendChild(this.settingsPanel); } if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-3"]) return; setImmediate(() => { const isHidden = (container, element) => { if (!container) { console.error(new Error(`Container is undefined.`)); return false; } const cTop = container.scrollTop; const cBottom = cTop + container.clientHeight; const eTop = element.offsetTop; const eBottom = eTop + element.clientHeight; return eTop < cTop || eBottom > cBottom; }; const thisNode = this.refs.cardNode; const container = thisNode.closest("div[class*=\"contentRegionScroller-\"]"); if (!isHidden(container, thisNode)) return; const thisNodeOffset = _modules_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].offset(thisNode); const containerOffset = _modules_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].offset(container); const original = container.scrollTop; const endPoint = thisNodeOffset.top - containerOffset.top + container.scrollTop - 30; _modules_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].animate({ duration: 300, update: function (progress) { if (endPoint > original) container.scrollTop = original + progress * (endPoint - original);else container.scrollTop = original - progress * (original - endPoint); } }); }); } getString(value) { if (!value) return "???"; return typeof value == "string" ? value : value.toString(); } get settingsComponent() { try { this.settingsPanel = this.props.addon.plugin.getSettingsPanel(); } catch (err) { _modules_utils__WEBPACK_IMPORTED_MODULE_2__["default"].err("Plugins", "Unable to get settings panel for " + this.name + ".", err); } return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", { className: "bd-card bd-addon-card settings-open ui-switch-item", ref: "cardNode" }, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", { style: { "float": "right", "cursor": "pointer" }, onClick: () => { this.refs.settingspanel.innerHTML = ""; this.setState({ settings: false }); } }, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_xSvg__WEBPACK_IMPORTED_MODULE_4__["default"], null)), typeof this.settingsPanel === "object" && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", { id: `plugin-settings-${this.name}`, className: "plugin-settings", ref: "settingspanel" }), typeof this.settingsPanel !== "object" && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", { id: `plugin-settings-${this.name}`, className: "plugin-settings", ref: "settingspanel", dangerouslySetInnerHTML: { __html: this.settingsPanel } })); } buildTitle(name, version, author) { const title = "{{name}} v{{version}} by {{author}}".split(/({{[A-Za-z]+}})/); const nameIndex = title.findIndex(s => s == "{{name}}"); if (nameIndex) title[nameIndex] = React.createElement("span", { className: "name bda-name" }, name); const versionIndex = title.findIndex(s => s == "{{version}}"); if (nameIndex) title[versionIndex] = React.createElement("span", { className: "version bda-version" }, version); const authorIndex = title.findIndex(s => s == "{{author}}"); if (nameIndex) { const props = { className: "author bda-author" }; if (author.link || author.id) { props.className += ` ${anchorClasses.anchor} ${anchorClasses.anchorUnderlineOnHover}`; props.target = "_blank"; if (author.link) props.href = author.link; if (author.id) props.onClick = () => { _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].LayerStack.popLayer(); _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].openDM(author.id); }; } title[authorIndex] = React.createElement(author.link || author.id ? "a" : "span", props, author.name); } return title.flat(); } makeLink(title, url) { const props = { className: "bda-link bda-link-website", target: "_blank" }; if (typeof url == "string") props.href = url; if (typeof url == "function") props.onClick = event => { event.preventDefault(); event.stopPropagation(); url(); }; return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("a", props, title); } makeButton(title, children, action) { return /*#__PURE__*/React.createElement(_tooltipWrap__WEBPACK_IMPORTED_MODULE_9__["default"], { color: "black", side: "top", text: title }, /*#__PURE__*/React.createElement("div", { className: "bd-addon-button", onClick: action }, children)); } componentWillUnmount() { this.unmounted = true; } get links() { const links = []; const addon = this.props.addon; if (addon.website) links.push(this.makeLink("Website", addon.website)); if (addon.source) links.push(this.makeLink("Source", addon.source)); if (addon.invite) { links.push(this.makeLink("Support Server", () => { const tester = /\.gg\/(.*)$/; let code = addon.invite; if (tester.test(code)) code = code.match(tester)[1]; _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].LayerStack.popLayer(); _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].InviteActions.acceptInviteAndTransitionToInviteChannel(code); })); } if (addon.donate) links.push(this.makeLink("Donate", addon.donate)); if (addon.patreon) links.push(this.makeLink("Patreon", addon.patreon)); return links; } get footer() { const links = this.links; return (links.length || this.hasSettings) && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", { className: "bd-card-footer bda-footer" }, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("span", { className: "bd-addon-links bda-links" }, ...links.map((element, index) => index < links.length - 1 ? [element, " | "] : element).flat()), this.hasSettings && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("button", { onClick: this.showSettings, className: "bd-button bda-settings-button", disabled: !this.state.checked }, "Settings")); } onChange() { this.props.toggle && this.props.toggle(this.name); this.setState({ checked: !this.state.checked }); } edit() { this.props.edit(this.name); } delete() { this.props.remove(this.name); } reload() { this.props.reload(this.name); } get name() { return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getName() : this.props.addon.name); } get author() { return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getAuthor() : this.props.addon.author); } get description() { return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getDescription() : this.props.addon.description); } get version() { return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getVersion() : this.props.addon.version); } render() { if (this.state.settings) return this.settingsComponent; const { authorId, authorLink } = this.props.addon; const style = {}; if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-6"]) { if (!this.isScanning) { this.isScanning = true; Object(_modules_pluginCertifier__WEBPACK_IMPORTED_MODULE_10__["processFile"])(Object(path__WEBPACK_IMPORTED_MODULE_12__["resolve"])(this.props.addon.filename.endsWith(".plugin.js") ? _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__["default"].pluginsFolder : _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__["default"].themesFolder, this.props.addon.filename), result => { if (this.unmounted) return; this.setState({ isTrusted: result.suspect ? "suspect" : true }); }, () => {}); } else { if (this.state.isTrusted === true) { style.borderColor = "#4087ed"; } if (this.state.isTrusted === "suspect") { style.borderColor = "rgb(240, 71, 71)"; } } } return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", { className: "bd-card bd-addon-card settings-closed ui-switch-item", style }, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", { className: "bd-addon-header bda-header" }, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", { className: "bd-card-title bda-header-title" }, this.buildTitle(this.name, this.version, { name: this.author, id: authorId, link: authorLink })), _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", { className: "bd-addon-controls bda-controls" }, this.props.edit && this.makeButton("Edit", /*#__PURE__*/React.createElement(_icons_edit__WEBPACK_IMPORTED_MODULE_6__["default"], { className: "bd-icon" }), this.edit), this.props.remove && this.makeButton("Delete", /*#__PURE__*/React.createElement(_icons_delete__WEBPACK_IMPORTED_MODULE_7__["default"], { className: "bd-icon" }), this.delete), this.props.reload && this.makeButton("Reload", /*#__PURE__*/React.createElement(_reloadIcon__WEBPACK_IMPORTED_MODULE_5__["default"], { className: "bd-icon" }), this.reload), React.createElement(_components_switch__WEBPACK_IMPORTED_MODULE_8__["default"], { onChange: this.onChange, checked: this.state.checked }))), _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", { className: "bd-scroller-wrap bda-description-wrap scroller-wrap fade" }, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", { className: "bd-scroller bd-addon-description bda-description scroller" }, this.description)), this.footer); } } const originalRender = V2C_PluginCard.prototype.render; Object.defineProperty(V2C_PluginCard.prototype, "render", { enumerable: false, configurable: false, set: function () { console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins"); }, get: () => originalRender }); /***/ }), /***/ "./src/ui/addonlist.jsx": /*!******************************!*\ !*** ./src/ui/addonlist.jsx ***! \******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CardList; }); /* harmony import */ var _errorBoundary__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./errorBoundary */ "./src/ui/errorBoundary.js"); /* harmony import */ var _contentColumn__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contentColumn */ "./src/ui/contentColumn.js"); /* harmony import */ var _reloadIcon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./reloadIcon */ "./src/ui/reloadIcon.js"); /* harmony import */ var _addoncard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./addoncard */ "./src/ui/addoncard.jsx"); /* harmony import */ var _components_dropdown__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/dropdown */ "./src/ui/components/dropdown.jsx"); /* harmony import */ var _components_search__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/search */ "./src/ui/components/search.jsx"); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _modules_contentManager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../modules/contentManager */ "./src/modules/contentManager.js"); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _modules_pluginModule__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../modules/pluginModule */ "./src/modules/pluginModule.js"); /* harmony import */ var _modules_themeModule__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../modules/themeModule */ "./src/modules/themeModule.js"); /* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../modules/webpackModules */ "./src/modules/webpackModules.js"); /* harmony import */ var _modules_bdApi__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../modules/bdApi */ "./src/modules/bdApi.js"); /* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js"); /* harmony import */ var _tooltipWrap__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./tooltipWrap */ "./src/ui/tooltipWrap.js"); /* harmony import */ var _modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../modules/bdEvents */ "./src/modules/bdEvents.js"); /* harmony import */ var _tooltip__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./tooltip */ "./src/ui/tooltip.js"); function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } const Tooltip = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_11__["default"].findByDisplayName("Tooltip"); const React = _modules_v2__WEBPACK_IMPORTED_MODULE_8__["default"].react; class CardList extends _modules_v2__WEBPACK_IMPORTED_MODULE_8__["default"].reactComponent { constructor(props) { super(props); this.state = { sort: "name", ascending: true, query: "" }; this.isPlugins = this.props.type == "plugins"; this.cookie = this.isPlugins ? _0globals__WEBPACK_IMPORTED_MODULE_6__["pluginCookie"] : _0globals__WEBPACK_IMPORTED_MODULE_6__["themeCookie"]; this.manager = this.isPlugins ? _modules_pluginModule__WEBPACK_IMPORTED_MODULE_9__["default"] : _modules_themeModule__WEBPACK_IMPORTED_MODULE_10__["default"]; this.sort = this.sort.bind(this); this.reverse = this.reverse.bind(this); this.search = this.search.bind(this); this.onAddonChanges = function () { this.forceUpdate(); }; this.onAddonChanges = this.onAddonChanges.bind(this); } componentDidMount() { const type = (this.isPlugins ? "plugin" : "theme") + "-"; _modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].on(`${type}loaded`, this.onAddonChanges); _modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].on(`${type}unloaded`, this.onAddonChanges); _modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].on(`${type}reloaded`, this.onAddonChanges); } componentWillUnmount() { const type = (this.isPlugins ? "plugin" : "theme") + "-"; _modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].off(`${type}loaded`, this.onAddonChanges); _modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].off(`${type}unloaded`, this.onAddonChanges); _modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].off(`${type}reloaded`, this.onAddonChanges); } openFolder() { const shell = __webpack_require__(/*! electron */ "electron").shell; const open = shell.openPath || shell.openItem; open(this.isPlugins ? _modules_contentManager__WEBPACK_IMPORTED_MODULE_7__["default"].pluginsFolder : _modules_contentManager__WEBPACK_IMPORTED_MODULE_7__["default"].themesFolder); } edit(name) { console.log(name); this.manager.edit(name); } async delete(name) { const shouldDelete = await this.confirmDelete(name); if (!shouldDelete) return; this.manager.delete(name); } confirmDelete(name) { return new Promise(resolve => { _modules_bdApi__WEBPACK_IMPORTED_MODULE_12__["default"].showConfirmationModal("Are You Sure?", `Are you sure you want to delete ${name}?`, { danger: true, confirmText: "Delete", onConfirm: () => { resolve(true); }, onCancel: () => { resolve(false); } }); }); } get sortOptions() { return [{ label: "Name", value: "name" }, { label: "Author", value: "author" }, { label: "Version", value: "version" }, { label: "Recently Added", value: "added" }, { label: "Last Modified", value: "modified" }, { label: "File Size", value: "size" }]; } get directions() { return [{ label: "Ascending", value: true }, { label: "Descending", value: false }]; } reverse(value) { this.setState({ ascending: value }); } sort(value) { this.setState({ sort: value }); } search(event) { this.setState({ query: event.target.value.toLocaleLowerCase() }); } getProps(addon) { return { key: this.getName(addon), enabled: this.cookie[this.getName(addon)], toggle: this.manager.toggle.bind(this.manager), edit: _0globals__WEBPACK_IMPORTED_MODULE_6__["settingsCookie"]["fork-ps-7"] ? this.edit.bind(this) : null, remove: this.delete.bind(this), addon: addon, hash: addon.hash }; } getString(value) { if (!value) return "???"; return typeof value == "string" ? value : value.toString(); } get list() { return this.props.type === "plugins" ? Object.values(_0globals__WEBPACK_IMPORTED_MODULE_6__["bdplugins"]) : Object.values(_0globals__WEBPACK_IMPORTED_MODULE_6__["bdthemes"]); } getAddons() { const sortedAddons = this.list.sort((a, b) => { const cap = this.state.sort.charAt(0).toUpperCase() + this.state.sort.slice(1); const first = a.plugin && a.plugin[`get${cap}`] ? this.getString(a.plugin[`get${cap}`]()) : this.getString(a[this.state.sort]); const second = b.plugin && b.plugin[`get${cap}`] ? this.getString(b.plugin[`get${cap}`]()) : this.getString(b[this.state.sort]); if (typeof first == "string") return first.toLocaleLowerCase().localeCompare(second.toLocaleLowerCase()); if (first > second) return 1; if (second > first) return -1; return 0; }); if (!this.state.ascending) sortedAddons.reverse(); const rendered = []; for (let a = 0; a < sortedAddons.length; a++) { const addon = sortedAddons[a]; if (this.state.query) { let matches = null; const name = this.getName(addon); const author = this.getAuthor(addon); const description = this.getDescription(addon); const version = this.getVersion(addon); if (name) matches = name.toLocaleLowerCase().includes(this.state.query); if (author) matches = matches || author.toLocaleLowerCase().includes(this.state.query); if (description) matches = matches || description.toLocaleLowerCase().includes(this.state.query); if (version) matches = matches || version.toLocaleLowerCase().includes(this.state.query); if (!matches) continue; } const props = this.getProps(addon); rendered.push( /*#__PURE__*/React.createElement(_errorBoundary__WEBPACK_IMPORTED_MODULE_0__["default"], null, /*#__PURE__*/React.createElement(_addoncard__WEBPACK_IMPORTED_MODULE_3__["default"], _extends({}, props, { reload: !_0globals__WEBPACK_IMPORTED_MODULE_6__["settingsCookie"]["fork-ps-5"] && this.manager.reload.bind(this.manager) })))); } return rendered; } getName(addon) { return this.getString(addon.plugin ? addon.plugin.getName() : addon.name); } getAuthor(addon) { return this.getString(addon.plugin ? addon.plugin.getAuthor() : addon.author); } getDescription(addon) { return this.getString(addon.plugin ? addon.plugin.getDescription() : addon.description); } getVersion(addon) { return this.getString(addon.plugin ? addon.plugin.getVersion() : addon.version); } renderCheckUpdates() { if (!window.ZeresPluginLibrary) return null; if (!window.PluginUpdates) return null; if (typeof window.PluginUpdates.checkAll !== "function") return null; if (!this.isPlugins) return null; let tooltipIsShowing = false; let tooltip; return /*#__PURE__*/React.createElement(_tooltipWrap__WEBPACK_IMPORTED_MODULE_14__["default"], { text: "Checks for updates of plugins that support this feature. Right-click for a list." }, /*#__PURE__*/React.createElement("span", { style: { marginLeft: "10px" }, onMouseLeave: () => { tooltipIsShowing = false; tooltip.hide(); } }, /*#__PURE__*/React.createElement(Lightcord.Api.Components.inputs.Button, { ref: "checkUpdateButton", color: "brand", look: "filled", size: "min", hoverColor: "default", onClick: () => { try { _modules_utils__WEBPACK_IMPORTED_MODULE_13__["default"].showToast("Plugin update check in progress.", { type: "info" }); window.PluginUpdates.checkAll().then(() => { _modules_utils__WEBPACK_IMPORTED_MODULE_13__["default"].showToast("Plugin update check complete.", { type: "success" }); }).catch(err => { console.error(err); _modules_utils__WEBPACK_IMPORTED_MODULE_13__["default"].showToast("An error occured while checking update.", { type: "error" }); }); } catch (e) { console.error(e); _modules_utils__WEBPACK_IMPORTED_MODULE_13__["default"].showToast("An error occured while checking update.", { type: "error" }); } }, wrapper: false, disabled: false, onRightClick: () => { if (!this.refs.checkUpdateButton) return; if (!window.PluginUpdates || !window.PluginUpdates.plugins) return; if (tooltipIsShowing) return; tooltip = new _tooltip__WEBPACK_IMPORTED_MODULE_16__["default"](this.refs.checkUpdateButton.refs.original.refs.button, Object.values(window.PluginUpdates.plugins).map(p => p.name).join(", "), { side: "bottom", attachEvents: false }); tooltip.show(); tooltipIsShowing = true; } }, "Check for Updates"))); } render() { const refreshIcon = /*#__PURE__*/React.createElement(Tooltip, { color: "black", position: "top", text: "Reload List" }, props => /*#__PURE__*/React.createElement(_reloadIcon__WEBPACK_IMPORTED_MODULE_2__["default"], _extends({}, props, { className: "bd-icon bd-reload bd-reload-header", size: "18px", onClick: async () => { if (this.isPlugins) _modules_pluginModule__WEBPACK_IMPORTED_MODULE_9__["default"].updatePluginList();else _modules_themeModule__WEBPACK_IMPORTED_MODULE_10__["default"].updateThemeList(); this.forceUpdate(); } }))); const addonCards = this.getAddons(); return /*#__PURE__*/React.createElement(_contentColumn__WEBPACK_IMPORTED_MODULE_1__["default"], { title: `${this.props.type.toUpperCase()}—${addonCards.length}` }, /*#__PURE__*/React.createElement(Lightcord.Api.Components.inputs.Button, { key: "folder-button", color: "brand", look: "filled", size: "min", hoverColor: "default", onClick: this.openFolder.bind(this), wrapper: false, style: { marginLeft: "10px" } }, "Open ", this.isPlugins ? "Plugin" : "Theme", " Folder"), this.renderCheckUpdates(), !_0globals__WEBPACK_IMPORTED_MODULE_6__["settingsCookie"]["fork-ps-5"] && refreshIcon, /*#__PURE__*/React.createElement("div", { className: "bd-controls bd-addon-controls" }, /*#__PURE__*/React.createElement(_components_search__WEBPACK_IMPORTED_MODULE_5__["default"], { onChange: this.search, placeholder: `Search ${this.props.type}...` }), /*#__PURE__*/React.createElement("div", { className: "bd-addon-dropdowns" }, /*#__PURE__*/React.createElement("div", { className: "bd-select-wrapper" }, /*#__PURE__*/React.createElement("label", { className: "bd-label" }, "Sort by:"), /*#__PURE__*/React.createElement(_components_dropdown__WEBPACK_IMPORTED_MODULE_4__["default"], { options: this.sortOptions, onChange: this.sort, style: "transparent" })), /*#__PURE__*/React.createElement("div", { className: "bd-select-wrapper" }, /*#__PURE__*/React.createElement("label", { className: "bd-label" }, "Order:"), /*#__PURE__*/React.createElement(_components_dropdown__WEBPACK_IMPORTED_MODULE_4__["default"], { options: this.directions, onChange: this.reverse, style: "transparent" })))), /*#__PURE__*/React.createElement("div", { className: "bda-slist bd-addon-list" }, addonCards)); } } const originalRender = CardList.prototype.render; Object.defineProperty(CardList.prototype, "render", { enumerable: false, configurable: false, set: function () { console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins"); }, get: () => originalRender }); /***/ }), /***/ "./src/ui/bdLogo.js": /*!**************************!*\ !*** ./src/ui/bdLogo.js ***! \**************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BDLogo; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); class BDLogo extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { render() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("svg", { height: "100%", width: this.props.size || "16px", className: "bd-logo " + this.props.className, style: { fillRule: "evenodd", clipRule: "evenodd", strokeLinecap: "round", strokeLinejoin: "round" }, viewBox: "0 0 2000 2000" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("metadata", null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("defs", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("filter", { id: "shadow1" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("feDropShadow", { "dx": "20", "dy": "0", "stdDeviation": "20", "flood-color": "rgba(0,0,0,0.35)" })), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("filter", { id: "shadow2" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("feDropShadow", { "dx": "15", "dy": "0", "stdDeviation": "20", "flood-color": "rgba(255,255,255,0.15)" })), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("filter", { id: "shadow3" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("feDropShadow", { "dx": "10", "dy": "0", "stdDeviation": "20", "flood-color": "rgba(0,0,0,0.35)" }))), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("g", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", { style: { filter: "url(#shadow3)" }, d: "M1195.44+135.442L1195.44+135.442L997.6+136.442C1024.2+149.742+1170.34+163.542+1193.64+179.742C1264.34+228.842+1319.74+291.242+1358.24+365.042C1398.14+441.642+1419.74+530.642+1422.54+629.642L1422.54+630.842L1422.54+632.042C1422.54+773.142+1422.54+1228.14+1422.54+1369.14L1422.54+1370.34L1422.54+1371.54C1419.84+1470.54+1398.24+1559.54+1358.24+1636.14C1319.74+1709.94+1264.44+1772.34+1193.64+1821.44C1171.04+1837.14+1025.7+1850.54+1000+1863.54L1193.54+1864.54C1539.74+1866.44+1864.54+1693.34+1864.54+1296.64L1864.54+716.942C1866.44+312.442+1541.64+135.442+1195.44+135.442Z", fill: "#171717", opacity: "1" }), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", { style: { filter: "url(#shadow2)" }, d: "M1695.54+631.442C1685.84+278.042+1409.34+135.442+1052.94+135.442L361.74+136.442L803.74+490.442L1060.74+490.442C1335.24+490.442+1335.24+835.342+1060.74+835.342L1060.74+1164.84C1150.22+1164.84+1210.53+1201.48+1241.68+1250.87C1306.07+1353+1245.76+1509.64+1060.74+1509.64L361.74+1863.54L1052.94+1864.54C1409.24+1864.54+1685.74+1721.94+1695.54+1368.54C1695.54+1205.94+1651.04+1084.44+1572.64+999.942C1651.04+915.542+1695.54+794.042+1695.54+631.442Z", fill: "#3E82E5", opacity: "1" }), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", { style: { filter: "url(#shadow1)" }, d: "M1469.25+631.442C1459.55+278.042+1183.05+135.442+826.65+135.442L135.45+135.442L135.45+1004C135.45+1004+135.427+1255.21+355.626+1255.21C575.825+1255.21+575.848+1004+575.848+1004L577.45+490.442L834.45+490.442C1108.95+490.442+1108.95+835.342+834.45+835.342L664.65+835.342L664.65+1164.84L834.45+1164.84C923.932+1164.84+984.244+1201.48+1015.39+1250.87C1079.78+1353+1019.47+1509.64+834.45+1509.64L135.45+1509.64L135.45+1864.54L826.65+1864.54C1182.95+1864.54+1459.45+1721.94+1469.25+1368.54C1469.25+1205.94+1424.75+1084.44+1346.35+999.942C1424.75+915.542+1469.25+794.042+1469.25+631.442Z", fill: "#FFFFFF", opacity: "1" }))); } } /***/ }), /***/ "./src/ui/checkbox.js": /*!****************************!*\ !*** ./src/ui/checkbox.js ***! \****************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Checkbox; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); class V2C_Checkbox extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); this.onClick = this.onClick.bind(this); this.setInitialState(); } setInitialState() { this.state = { checked: this.props.checked || false }; } render() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("li", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "checkbox " + BDModules.get(e => e.checkboxElement)[0].checkbox, onClick: this.onClick }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "checkbox-inner " + BDModules.get(e => e.checkboxInner)[0].checkboxInner }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("input", { className: BDModules.get(e => e.checkboxElement)[0].checkboxElement, checked: this.state.checked, onChange: () => {}, type: "checkbox" }), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null)), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null, this.props.text))); } onClick() { this.props.onChange(this.props.id, !this.state.checked); this.setState({ checked: !this.state.checked }); } } /***/ }), /***/ "./src/ui/components/dropdown.jsx": /*!****************************************!*\ !*** ./src/ui/components/dropdown.jsx ***! \****************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Select; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _icons_downarrow__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../icons/downarrow */ "./src/ui/icons/downarrow.jsx"); const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React; class Select extends React.Component { constructor(props) { super(props); this.state = { open: false, value: this.props.value || this.props.options[0].value }; this.dropdown = React.createRef(); this.onChange = this.onChange.bind(this); this.showMenu = this.showMenu.bind(this); this.hideMenu = this.hideMenu.bind(this); } showMenu(event) { event.preventDefault(); this.setState({ open: true }, () => { document.addEventListener("click", this.hideMenu); }); } hideMenu() { this.setState({ open: false }, () => { document.removeEventListener("click", this.hideMenu); }); } onChange(value) { this.setState({ value }); if (this.props.onChange) this.props.onChange(value); } get selected() { return this.props.options.find(o => o.value == this.state.value); } get options() { const selected = this.selected; return /*#__PURE__*/React.createElement("div", { className: "bd-select-options" }, this.props.options.map(opt => /*#__PURE__*/React.createElement("div", { className: `bd-select-option${selected.value == opt.value ? " selected" : ""}`, onClick: this.onChange.bind(this, opt.value) }, opt.label))); } render() { const style = this.props.style == "transparent" ? " bd-select-transparent" : ""; const isOpen = this.state.open ? " menu-open" : ""; return /*#__PURE__*/React.createElement("div", { className: `bd-select${style}${isOpen}`, onClick: this.showMenu, ref: this.dropdown }, /*#__PURE__*/React.createElement("div", { className: "bd-select-value" }, this.selected.label), /*#__PURE__*/React.createElement(_icons_downarrow__WEBPACK_IMPORTED_MODULE_1__["default"], { className: "bd-select-arrow" }), this.state.open && this.options); } } // return
// //
//
//
{this.selected.label}
// //
//
// {this.state.open && this.options} //
; /***/ }), /***/ "./src/ui/components/search.jsx": /*!**************************************!*\ !*** ./src/ui/components/search.jsx ***! \**************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Search; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _icons_search__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../icons/search */ "./src/ui/icons/search.jsx"); const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React; class Search extends React.Component { constructor(props) { super(props); this.state = { focused: false }; } render() { const className = ["bd-search-wrapper"]; if (this.state.focused) className.push("focused"); return /*#__PURE__*/React.createElement("div", { className: className.join(" ") }, /*#__PURE__*/React.createElement("input", { onChange: this.props.onChange, onKeyDown: this.props.onKeyDown, type: "text", className: "bd-search", placeholder: this.props.placeholder, maxLength: "50", onFocus: () => { this.setState({ focused: true }); }, onBlur: () => { this.setState({ focused: false }); } }), /*#__PURE__*/React.createElement(_icons_search__WEBPACK_IMPORTED_MODULE_1__["default"], null)); } } /***/ }), /***/ "./src/ui/components/switch.jsx": /*!**************************************!*\ !*** ./src/ui/components/switch.jsx ***! \**************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Switch; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React; class Switch extends React.Component { constructor(props) { super(props); this.state = { checked: this.props.checked }; this.onChange = this.onChange.bind(this); this.switch = /*#__PURE__*/React.createElement(Lightcord.Api.Components.inputs.Switch, { onChange: this.onChange, value: this.state.checked }); } onChange(value) { if (this.props.disabled) return; this.props.onChange(value); this.setState({ checked: value }); } render() { return this.switch; } } /***/ }), /***/ "./src/ui/contentColumn.js": /*!*********************************!*\ !*** ./src/ui/contentColumn.js ***! \*********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_ContentColumn; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); class V2C_ContentColumn extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); } static get displayName() { return "ContentColumn"; } render() { //let contentModule = BDModules.get(e => e.contentColumn)[0] let title = this.props.title ? _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h2", { className: "ui-form-title h2 margin-reset margin-bottom-20" }, this.props.title) : null; return [title, this.props.children]; return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: contentModule.contentColumn + " " + contentModule.contentColumnDefault + " content-column default", style: { padding: "60px 40px 0px" } }, title, this.props.children); } } /***/ }), /***/ "./src/ui/cssEditor.js": /*!*****************************!*\ !*** ./src/ui/cssEditor.js ***! \*****************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_CssEditor; }); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/settingsPanel */ "./src/modules/settingsPanel.js"); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/dataStore */ "./src/modules/dataStore.js"); /* harmony import */ var _modules_domtools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../modules/domtools */ "./src/modules/domtools.js"); /* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js"); /* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js"); /* harmony import */ var _checkbox__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./checkbox */ "./src/ui/checkbox.js"); /* harmony import */ var _cssEditorDetached__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./cssEditorDetached */ "./src/ui/cssEditorDetached.js"); class V2C_CssEditor extends _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactComponent { constructor(props) { super(props); const self = this; self.props.lines = 0; self.setInitialState(); self.attach = self.attach.bind(self); self.detachedEditor = _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_cssEditorDetached__WEBPACK_IMPORTED_MODULE_8__["default"], { attach: self.attach }); self.onClick = self.onClick.bind(self); self.updateCss = self.updateCss.bind(self); self.saveCss = self.saveCss.bind(self); self.detach = self.detach.bind(self); } setInitialState() { this.state = { detached: this.props.detached || _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].editorDetached }; } componentDidMount() { // this.updateLineCount(); this.editor = ace.edit("bd-customcss-editor"); this.editor.setTheme("ace/theme/discord"); this.editor.session.setMode("ace/mode/css"); this.editor.setShowPrintMargin(false); this.editor.setFontSize(14); this.editor.on("change", () => { if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"]) return; this.saveCss(); this.updateCss(); }); } componentWillUnmount() { this.editor.destroy(); } componentDidUpdate(prevProps, prevState) { const self = this; if (prevState.detached && !self.state.detached) { _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.unmountComponentAtNode(self.detachedRoot); } } codeMirror() {} get options() { return { lineNumbers: true, mode: "css", indentUnit: 4, theme: "material", scrollbarStyle: "simple" }; } get css() { const _ccss = _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].getBDData("bdcustomcss"); let ccss = ""; if (_ccss && _ccss !== "") { ccss = Buffer.from(_ccss, "base64").toString("utf8"); } return ccss; } updateLineCount() { const lineCount = this.refs.editor.value.split("\n").length; if (lineCount == this.props.lines) return; this.refs.lines.textContent = Array.from(new Array(lineCount), (_, i) => i + 1).join(".\n") + "."; this.props.lines = lineCount; } render() { const self = this; const { detached } = self.state; return [detached && _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { id: "editor-detached" }, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_6__["default"], { text: "Custom CSS Editor" }), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("h3", null, "Editor Detached"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", { className: "btn btn-primary", onClick: () => { self.attach(); } }, "Attach")), !detached && _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", null, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_6__["default"], { text: "Custom CSS Editor" }), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { className: "editor-wrapper" }, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { id: "bd-customcss-editor", className: "editor", ref: "editor" }, self.css)), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { id: "bd-customcss-attach-controls" }, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("ul", { className: "checkbox-group" }, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_checkbox__WEBPACK_IMPORTED_MODULE_7__["default"], { id: "live-update", text: "Live Update", onChange: this.onChange, checked: _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"] })), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { id: "bd-customcss-detach-controls-button" }, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", { style: { borderRadius: "3px 0 0 3px", borderRight: "1px solid #3f4146" }, className: "btn btn-primary", onClick: () => { self.onClick("update"); } }, "Update"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", { style: { borderRadius: "0", borderLeft: "1px solid #2d2d2d", borderRight: "1px solid #2d2d2d" }, className: "btn btn-primary", onClick: () => { self.onClick("save"); } }, "Save"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", { style: { borderRadius: "0 3px 3px 0", borderLeft: "1px solid #3f4146" }, className: "btn btn-primary", onClick: () => { self.onClick("detach"); } }, "Detach"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", { style: { fontSize: "10px", marginLeft: "5px" } }, "Unsaved changes are lost on detach"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { className: "help-text" }, "Press ", _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("code", { className: "inline" }, "ctrl"), "+", _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", { className: "inline" }, ","), " with the editor focused to access the editor's settings."))))]; } onClick(arg) { const self = this; switch (arg) { case "update": self.updateCss(); break; case "save": self.saveCss(); break; case "detach": self.detach(); break; } } onChange(id, checked) { switch (id) { case "live-update": _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"] = checked; _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_1__["default"].saveSettings(); break; } } updateCss() { _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].removeStyle("customcss"); _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].addStyle("customcss", this.editor.session.getValue()); } saveCss() { _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].setBDData("bdcustomcss", Buffer.from(this.editor.session.getValue(), "utf-8").toString("base64")); } detach() { const self = this; self.setState({ detached: true }); const droot = self.detachedRoot; if (!droot) { console.log("FAILED TO INJECT ROOT: .app"); return; } _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.render(self.detachedEditor, droot); } get detachedRoot() { const _root = _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-customcss-detach-container"); if (!_root) { if (!this.injectDetachedRoot()) return null; return this.detachedRoot; } return _root; } injectDetachedRoot() { const app = _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(".app, ." + _modules_utils__WEBPACK_IMPORTED_MODULE_5__["default"].removeDa(BDModules.get(e => e.app && e.layers)[0].app)); if (!app) return false; _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].insertAfter(_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`
`), app); return true; } attach() { const self = this; self.setState({ detached: false }); } } /***/ }), /***/ "./src/ui/cssEditorDetached.js": /*!*************************************!*\ !*** ./src/ui/cssEditorDetached.js ***! \*************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_CssEditorDetached; }); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/settingsPanel */ "./src/modules/settingsPanel.js"); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/dataStore */ "./src/modules/dataStore.js"); /* harmony import */ var _modules_domtools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../modules/domtools */ "./src/modules/domtools.js"); /* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js"); /* harmony import */ var _checkbox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./checkbox */ "./src/ui/checkbox.js"); class V2C_CssEditorDetached extends _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactComponent { constructor(props) { super(props); const self = this; self.onClick = self.onClick.bind(self); self.updateCss = self.updateCss.bind(self); self.saveCss = self.saveCss.bind(self); self.onChange = self.onChange.bind(self); } componentDidMount() { _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].addClass(_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#app-mount"), "bd-detached-editor"); _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].editorDetached = true; // this.updateLineCount(); this.editor = ace.edit("bd-customcss-editor-detached"); this.editor.setTheme("ace/theme/discord"); this.editor.session.setMode("ace/mode/css"); this.editor.setShowPrintMargin(false); this.editor.setFontSize(14); this.editor.on("change", () => { if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"]) return; this.saveCss(); this.updateCss(); }); } componentWillUnmount() { _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].removeClass(_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#app-mount"), "bd-detached-editor"); _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].editorDetached = false; this.editor.destroy(); } updateLineCount() { const lineCount = this.refs.editor.value.split("\n").length; if (lineCount == this.props.lines) return; this.refs.lines.textContent = Array.from(new Array(lineCount), (_, i) => i + 1).join(".\n") + "."; this.props.lines = lineCount; } get options() { return { lineNumbers: true, mode: "css", indentUnit: 4, theme: "material", scrollbarStyle: "simple" }; } get css() { const _ccss = _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].getBDData("bdcustomcss"); let ccss = ""; if (_ccss && _ccss !== "") { ccss = Buffer.from(_ccss, "base64").toString("utf8"); } return ccss; } get root() { const _root = _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-customcss-detach-container"); if (!_root) { if (!this.injectRoot()) return null; return this.detachedRoot; } return _root; } injectRoot() { const app = _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(".app, ." + _modules_utils__WEBPACK_IMPORTED_MODULE_5__["default"].removeDa(BDModules.get(e => e.app && e.layers)[0].app)); if (!app) return false; _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].insertAfter(_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`
`), app); return true; } render() { const self = this; return _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { className: "bd-detached-css-editor", id: "bd-customcss-detach-editor" }, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { id: "bd-customcss-innerpane" }, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { className: "editor-wrapper" }, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { id: "bd-customcss-editor-detached", className: "editor", ref: "editor" }, self.css)), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { id: "bd-customcss-attach-controls" }, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("ul", { className: "checkbox-group" }, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_checkbox__WEBPACK_IMPORTED_MODULE_6__["default"], { id: "live-update", text: "Live Update", onChange: self.onChange, checked: _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"] })), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { id: "bd-customcss-detach-controls-button" }, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", { style: { borderRadius: "3px 0 0 3px", borderRight: "1px solid #3f4146" }, className: "btn btn-primary", onClick: () => { self.onClick("update"); } }, "Update"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", { style: { borderRadius: "0", borderLeft: "1px solid #2d2d2d", borderRight: "1px solid #2d2d2d" }, className: "btn btn-primary", onClick: () => { self.onClick("save"); } }, "Save"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", { style: { borderRadius: "0 3px 3px 0", borderLeft: "1px solid #3f4146" }, className: "btn btn-primary", onClick: () => { self.onClick("attach"); } }, "Attach"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", { style: { fontSize: "10px", marginLeft: "5px" } }, "Unsaved changes are lost on attach"))))); } onChange(id, checked) { switch (id) { case "live-update": _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"] = checked; _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_1__["default"].saveSettings(); break; } } onClick(id) { const self = this; switch (id) { case "attach": if (_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#editor-detached")) self.props.attach(); _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.unmountComponentAtNode(self.root); self.root.remove(); break; case "update": self.updateCss(); break; case "save": self.saveCss(); break; } } updateCss() { _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].removeStyle("customcss"); _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].addStyle("customcss", this.editor.session.getValue()); } saveCss() { _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].setBDData("bdcustomcss", Buffer.from(this.editor.session.getValue(), "utf-8").toString("base64")); } } /***/ }), /***/ "./src/ui/errorBoundary.js": /*!*********************************!*\ !*** ./src/ui/errorBoundary.js ***! \*********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BDErrorBoundary; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); class BDErrorBoundary extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); this.state = { hasError: false }; } componentDidCatch() { this.setState({ hasError: true }); } render() { if (this.state.hasError) return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "react-error" }, "Component Error"); return this.props.children; } } const originalRender = BDErrorBoundary.prototype.render; Object.defineProperty(BDErrorBoundary.prototype, "render", { enumerable: false, configurable: false, set: function () { console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins"); }, get: () => originalRender }); /***/ }), /***/ "./src/ui/icons/delete.jsx": /*!*********************************!*\ !*** ./src/ui/icons/delete.jsx ***! \*********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Delete; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React; class Delete extends React.Component { render() { const size = this.props.size || "24px"; return /*#__PURE__*/React.createElement("svg", { className: this.props.className || "", fill: "var(--text-normal)", viewBox: "0 0 24 24", style: { width: size, height: size }, onClick: this.props.onClick }, /*#__PURE__*/React.createElement("path", { fill: "none", d: "M0 0h24v24H0V0z" }), /*#__PURE__*/React.createElement("path", { d: "M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zm2.46-7.12l1.41-1.41L12 12.59l2.12-2.12 1.41 1.41L13.41 14l2.12 2.12-1.41 1.41L12 15.41l-2.12 2.12-1.41-1.41L10.59 14l-2.13-2.12zM15.5 4l-1-1h-5l-1 1H5v2h14V4z" }), /*#__PURE__*/React.createElement("path", { fill: "none", d: "M0 0h24v24H0z" })); } } /***/ }), /***/ "./src/ui/icons/downarrow.jsx": /*!************************************!*\ !*** ./src/ui/icons/downarrow.jsx ***! \************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DownArrow; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React; class DownArrow extends React.Component { render() { const size = this.props.size || "16px"; return /*#__PURE__*/React.createElement("svg", { className: this.props.className || "", fill: "var(--text-normal)", viewBox: "0 0 24 24", style: { width: size, height: size } }, /*#__PURE__*/React.createElement("path", { d: "M8.12 9.29L12 13.17l3.88-3.88c.39-.39 1.02-.39 1.41 0 .39.39.39 1.02 0 1.41l-4.59 4.59c-.39.39-1.02.39-1.41 0L6.7 10.7c-.39-.39-.39-1.02 0-1.41.39-.38 1.03-.39 1.42 0z" })); } } /***/ }), /***/ "./src/ui/icons/edit.jsx": /*!*******************************!*\ !*** ./src/ui/icons/edit.jsx ***! \*******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Edit; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React; class Edit extends React.Component { render() { const size = this.props.size || "24px"; return /*#__PURE__*/React.createElement("svg", { className: this.props.className || "", viewBox: "0 0 24 24", fill: "var(--text-normal)", style: { width: size, height: size }, onClick: this.props.onClick }, /*#__PURE__*/React.createElement("path", { d: "M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z" }), /*#__PURE__*/React.createElement("path", { d: "M0 0h24v24H0z", fill: "none" })); } } /***/ }), /***/ "./src/ui/icons/history.jsx": /*!**********************************!*\ !*** ./src/ui/icons/history.jsx ***! \**********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return History; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); { /* */ } const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React; class History extends React.Component { render() { const size = this.props.size || "18px"; return /*#__PURE__*/React.createElement("svg", { viewBox: "0 0 24 24", fill: "var(--text-normal)", className: this.props.className || "", style: { width: size, height: size }, onClick: this.props.onClick }, /*#__PURE__*/React.createElement("path", { d: "M0 0h24v24H0z", fill: "none" }), /*#__PURE__*/React.createElement("path", { d: "M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z" })); } } /***/ }), /***/ "./src/ui/icons/search.jsx": /*!*********************************!*\ !*** ./src/ui/icons/search.jsx ***! \*********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Search; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React; class Search extends React.Component { render() { const size = this.props.size || "16px"; return /*#__PURE__*/React.createElement("svg", { className: this.props.className || "", fill: "var(--text-normal)", viewBox: "0 0 24 24", style: { width: size, height: size } }, /*#__PURE__*/React.createElement("path", { fill: "none", d: "M0 0h24v24H0V0z" }), /*#__PURE__*/React.createElement("path", { d: "M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" })); } } /***/ }), /***/ "./src/ui/margintop.jsx": /*!******************************!*\ !*** ./src/ui/margintop.jsx ***! \******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return MarginTop; }); let marginModule = BDModules.get(e => e.marginTop60)[0]; class MarginTop extends React.Component { render() { if (!marginModule) marginModule = BDModules.get(e => e.marginTop60)[0]; return /*#__PURE__*/React.createElement("div", { className: marginModule.marginTop60 }); } } /***/ }), /***/ "./src/ui/presenceSettings.jsx": /*!*************************************!*\ !*** ./src/ui/presenceSettings.jsx ***! \*************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_PresenceSettings; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js"); /* harmony import */ var _settingsGroup__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsGroup */ "./src/ui/settingsGroup.js"); /* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/dataStore */ "./src/modules/dataStore.js"); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../modules/CustomRichPresence */ "./src/modules/CustomRichPresence.js"); /* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! electron */ "electron"); /* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var _margintop__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./margintop */ "./src/ui/margintop.jsx"); /* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js"); const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React; let V2C_PresenceSettingsModules; class V2C_PresenceSettings extends React.Component { constructor(props) { super(props); this.state = { data: _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].getSettingGroup("rpc") || _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"], assets: [] }; this.preview = null; this.isfetching = false; if (this.state.data.application_id) { this.fetchAssets(); } this.assetComponents = new Set(); } updateWhenFetched(comp) { this.assetComponents.add(comp); } /** * * @param {InputText} setting */ onChange(setting, value) { let defaultSetting = RPCProps.find(e => e.id === setting.props.id); this.setState({ data: Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_4__["settingsRPC"], this.state.data, { [defaultSetting.id]: !!value ? value : null }), assets: this.state.assets }); if (setting.props.id === "application_id") { this.fetchAssets(); } _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].setSettingGroup("rpc", _0globals__WEBPACK_IMPORTED_MODULE_4__["settingsRPC"]); this.preview.forceUpdate(); _modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__["default"].set(_0globals__WEBPACK_IMPORTED_MODULE_4__["settingsRPC"]); } fetchAssets() { if (this.isfetching === true) { let app = this.state.data.application_id; setTimeout(() => { if (this.state.data.application_id !== app) { return; } this.fetchAssets(); }, 5000); } if (!this.state.data.application_id) { this.setState({ data: this.state.data, assets: [] }); this.forceUpdate(); this.assetComponents.forEach(e => e.forceUpdate()); return; } this.isfetching = true; _modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__["default"].fetchAssets(this.state.data.application_id).then(assets => { this.isfetching = false; this.setState({ data: this.state.data, assets: Object.keys(assets).map(k => { let asset = assets[k]; return { id: asset.id, name: asset.name, type: asset.type }; }) }); this.forceUpdate(); this.assetComponents.forEach(e => e.forceUpdate()); }).catch(() => { this.isfetching = false; this.setState({ data: this.state.data, assets: [] }); this.forceUpdate(); this.assetComponents.forEach(e => e.forceUpdate()); }); } updatePreview(data) { this.setState({ data }); } get modules() { return V2C_PresenceSettingsModules || (V2C_PresenceSettingsModules = [BDModules.get(e => e.marginBottom20)[0]]); } render() { let [marginModule] = this.modules; return [/*#__PURE__*/React.createElement(_settingsGroup__WEBPACK_IMPORTED_MODULE_2__["default"], { title: "RichPresence Settings", settings: this.props.settings, onChange: this.props.onChange }), /*#__PURE__*/React.createElement(_margintop__WEBPACK_IMPORTED_MODULE_7__["default"], null), /*#__PURE__*/React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], { text: "RichPresence" }), /*#__PURE__*/React.createElement("div", null, this.optionsComponents), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(_margintop__WEBPACK_IMPORTED_MODULE_7__["default"], null), /*#__PURE__*/React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], { text: "Preview" }), /*#__PURE__*/React.createElement(RpcPreview, { settings: this })), /*#__PURE__*/React.createElement("div", { className: marginModule.marginBottom20 }), /*#__PURE__*/React.createElement("button", { style: { opacity: 0.01 }, onClick: window.ohgodohfuck }, "Oh god Oh fuck"), /*#__PURE__*/React.createElement("button", { style: { opacity: 0.01 }, onClick: () => { electron__WEBPACK_IMPORTED_MODULE_6__["remote"].shell.openExternal("https://www.youtube.com/watch?v=LkYa7rps_g4"); } }, "See ? I pulled a litle sneaky on ya")]; } get optionsComponents() { return this._optionsComponents || (this._optionsComponents = RPCProps.map(e => { if (e.type === "text") { return /*#__PURE__*/React.createElement(InputText, { setting: e, manager: this, id: e.id }); } else if (e.type === "number") { let array = [/*#__PURE__*/React.createElement(InputNumber, { setting: e, manager: this, id: e.id })]; /* if(e.id === "timestamps.start"){ array.unshift( { DiscordNative.clipboard.copy(Date.now()+"") }} />) }*/ return array; } else if (e.type === "choice") { if (["assets.small", "assets.large"].includes(e.id)) { return /*#__PURE__*/React.createElement(InputChoice, { setting: e, manager: this, id: e.id, choices: [{ value: "none", label: "No assets" }].concat(this.state.assets.map(e => { return { value: "asset-" + e.id, label: e.name }; })) }); } else { return "Unknown choice."; } } })); } } const RPCProps = [{ title: "Application ID", id: "application_id", type: "number", placeholder: "711416957718757418" }, { title: "Name", id: "name", type: "text", placeholder: "Lightcord" }, { title: "Details", id: "details", type: "text", placeholder: "Browsing Discord" }, { title: "State", id: "state", type: "text", placeholder: "Lightcord Client" }, { title: "Timestamp Start", id: "timestamps.start", type: "number", get placeholder() { return Date.now(); } }, { title: "LargeAsset", id: "assets.large", type: "choice" }, { title: "SmallAsset", id: "assets.small", type: "choice" }]; let inputTextModules; class InputText extends React.PureComponent { get modules() { if (inputTextModules && inputTextModules[0]) return inputTextModules; return inputTextModules = [BDModules.get(e => e.removeKeybind)[0], BDModules.get(e => e.marginBottom20)[0], BDModules.get(e => e.defaultMarginh5)[0], BDModules.get(e => e.colorStandard)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e._horizontal)[0], BDModules.get(e => e.inputMini)[0], BDModules.get(e => e.size16 && e.size20)[0]]; } constructor(props) { super(props); let setting = this.props.setting; this.state = { data: this.props.manager.state.data[setting.id] }; this.input = /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.inputs.TextInput, { placeholder: setting.placeholder, name: setting.id, value: this.state.data, onChange: value => { this.setState({ data: value }); if (!this.lastEdited || this.lastEdited < Date.now() - 500) { this.props.manager.onChange(this, value); this.lastEdited = Date.now(); } else if (!this.isTiming) { this.isTiming = setTimeout(() => { this.props.manager.onChange(this, this.state.data); this.isTiming = null; this.lastEdited = Date.now(); }, 500); } }, type: "text" }); } render() { let setting = this.props.setting; let [rowModule, marginModule, marginModule2, colorModule, sizeModule, flexModule, inputModule, sizeModule2] = this.modules; return /*#__PURE__*/React.createElement("div", { className: rowModule.row + " " + marginModule.marginBottom20 }, /*#__PURE__*/React.createElement("div", { className: `${rowModule.item} ${flexModule.flexChild}` }, /*#__PURE__*/React.createElement("h5", { className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5 }, setting.title), this.input), /*#__PURE__*/React.createElement(Divider, null)); } } let InputNumberModules; class InputNumber extends React.PureComponent { get modules() { return InputNumberModules || (InputNumberModules = [BDModules.get(e => e.removeKeybind)[0], BDModules.get(e => e.marginBottom20)[0], BDModules.get(e => e.defaultMarginh5)[0], BDModules.get(e => e.colorStandard)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e._horizontal)[0], BDModules.get(e => e.inputMini)[0], BDModules.get(e => e.size16 && e.size20)[0], BDModules.get(e => e.colorTransparent)[0]]); } constructor(props) { super(props); let setting = this.props.setting; this.state = { data: this.props.manager.state.data[setting.id] }; this.input = /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.inputs.TextInput, { placeholder: setting.placeholder, name: setting.id, value: this.state.data, type: "number", onChange: (value, name, input) => { value = value.replace(/[^\d]+/g, ""); if (value == this.state.data) { input.setValue(value); return; } if (!this.lastEdited || this.lastEdited < Date.now() - 500) { this.props.manager.onChange(this, value); this.lastEdited = Date.now(); } else if (!this.isTiming) { this.isTiming = setTimeout(() => { this.props.manager.onChange(this, this.state.data); this.isTiming = null; this.lastEdited = Date.now(); }, 500); } this.setState({ data: value }); }, type: "text" }); } render() { let setting = this.props.setting; let [rowModule, marginModule, marginModule2, colorModule, sizeModule, flexModule] = this.modules; return /*#__PURE__*/React.createElement("div", { className: rowModule.row + " " + marginModule.marginBottom20 }, /*#__PURE__*/React.createElement("div", { className: `${rowModule.item} ${flexModule.flexChild}` }, /*#__PURE__*/React.createElement("h5", { className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5 }, setting.title), this.input, setting.id === "timestamps.start" ? /*#__PURE__*/React.createElement(Lightcord.Api.Components.inputs.Button, { onClick: () => { DiscordNative.clipboard.copy(Date.now() + ""); }, color: "brand" }, "Copy current timestamp") : null), /*#__PURE__*/React.createElement(Divider, null)); } } let InputChoiceModules; class InputChoice extends React.PureComponent { constructor(props) { super(props); let setting = this.props.setting; this.state = { data: this.props.manager.state.data[setting.id] ? "asset-" + this.props.manager.state.data[setting.id] : "none" }; this.props.manager.updateWhenFetched(this); } onChange(data) { let value = data.value; if (!this.lastEdited || this.lastEdited < Date.now() - 500) { this.props.manager.onChange(this, value === "none" ? null : value.replace("asset-", "")); this.lastEdited = Date.now(); } else if (!this.isTiming) { this.isTiming = setTimeout(() => { this.props.manager.onChange(this, this.state.data === "none" ? null : this.state.data.replace("asset-", "")); this.isTiming = null; this.lastEdited = Date.now(); }, 500); } this.setState({ data: value }); this.forceUpdate(); } get modules() { return InputChoiceModules || (InputChoiceModules = [BDModules.get(e => e.removeKeybind)[0], BDModules.get(e => e.marginBottom20)[0], BDModules.get(e => e.defaultMarginh5)[0], BDModules.get(e => e.colorStandard)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e._horizontal)[0]]); } render() { let setting = this.props.setting; let [rowModule, marginModule, marginModule2, colorModule, sizeModule, flexModule] = this.modules; let options = this.props.manager.state.assets.map(e => { return { value: "asset-" + e.id, label: e.name }; }); options.unshift({ value: "none", label: "No assets" }); return /*#__PURE__*/React.createElement("div", { className: rowModule.row + " " + marginModule.marginBottom20 }, /*#__PURE__*/React.createElement("div", { className: `${rowModule.item} ${flexModule.flexChild}` }, /*#__PURE__*/React.createElement("h5", { className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5 }, setting.title), /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.inputs.Dropdown, { value: this.state.data, options: options, onChange: this.onChange.bind(this) })), /*#__PURE__*/React.createElement(Divider, null)); } } let DividerModules = []; class Divider extends React.PureComponent { get modules() { return DividerModules && DividerModules[0] ? DividerModules : DividerModules = [BDModules.get(e => e.divider && Object.keys(e).length === 1)[0], BDModules.get(e => e.dividerDefault)[0]]; } render() { let [divider, dividerDefault] = this.modules; return /*#__PURE__*/React.createElement("div", { class: `${divider.divider} ${dividerDefault.dividerDefault}` }); } } class DiscordButton extends React.Component { render() { let rowModule = BDModules.get(e => e.removeKeybind)[0]; let marginModule = BDModules.get(e => e.marginBottom20)[0]; let flexModule = BDModules.get(e => e._horizontal)[0]; return /*#__PURE__*/React.createElement("div", { className: rowModule.row + " " + marginModule.marginBottom20 }, /*#__PURE__*/React.createElement("div", { className: `${rowModule.item} ${flexModule.flexChild}` }, /*#__PURE__*/React.createElement(Lightcord.Api.Components.inputs.Button, { onClick: this.props.onClick, color: "brand" }, this.props.title))); } } class RpcPreview extends React.Component { constructor(props = {}) { super(props); this.state = { active: "profile" }; this.tabs = []; this.props.settings.preview = this; } changeTab(tab) { let ancientTab = this.state.active; if (ancientTab === tab.props.id) return; this.tabs.forEach(e => { e.setActive(false); }); tab.setActive(true); this.setState({ active: tab.props.id }); } render() { return /*#__PURE__*/React.createElement("div", { className: "lc-tabWrapper" }, /*#__PURE__*/React.createElement("div", { className: "lc-tabnav", style: { flex: "0 1 auto" } }, /*#__PURE__*/React.createElement(Tab, { preview: this, title: "Full Profile", id: "profile" }), /*#__PURE__*/React.createElement(Tab, { preview: this, title: "User Popout", id: "popout" })), /*#__PURE__*/React.createElement(PresenceErrorCatcher, { preview: this.preview, state: this.state.rpc, props: { preview: this }, key: this.state.active })); } isActive(tab) { return this.state.active === tab; } get preview() { if (this.state.active === "profile") return Profile; return Popout; } } class Tab extends React.Component { constructor(props) { super(props); this.state = { active: props.preview.isActive(props.id) }; props.preview.tabs.push(this); } setActive(isActive) { this.setState({ active: !!isActive }); } render() { let className = `lc-navItem`; if (this.state.active) { className += ` lc-navItemActive`; } else { className += ` lc-navItemInactive`; } return /*#__PURE__*/React.createElement("div", { className: className, onClick: () => { this.props.preview.changeTab(this); } }, this.props.title); } } let emptyClasses; class PresenceErrorCatcher extends React.Component { componentDidCatch(err, errInfo) { console.error(err, errInfo); this.setState({ error: true }); } render() { if (!this.state) { this.state = { error: false }; } if (!this.state.error) { try { const preview = new this.props.preview(this.props.props); preview.setState(this.props.state); return preview.render(); } catch (err) { console.error(err); this.state.error = true; return this.render(); } } else { emptyClasses = emptyClasses || _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.find(e => e.emptyStateImage && e.emptyState); if (!emptyClasses) { _modules_utils__WEBPACK_IMPORTED_MODULE_8__["default"].showToast("An error occured. Please check the console for more informations."); return null; } return /*#__PURE__*/React.createElement("div", { style: { margin: "20px" } }, /*#__PURE__*/React.createElement("div", { style: { backgroundColor: "var(--background-primary)", padding: "30px 30px", borderRadius: "8px" }, className: `lc-tab-box-shadow ${emptyClasses.emptyState}` }, /*#__PURE__*/React.createElement("div", { className: emptyClasses.emptyStateImage, style: { marginTop: "20px" } }), /*#__PURE__*/React.createElement("div", { className: emptyClasses.emptyStateHeader }, "An error occured"), /*#__PURE__*/React.createElement("p", { className: emptyClasses.emptyStateSubtext }, "Please check the console for more informations. Join our \xAD", /*#__PURE__*/React.createElement("a", { className: `${_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].anchorClasses.anchor} ${_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].anchorClasses.anchorUnderlineOnHover}`, role: "button", tabindex: 0, onClick: () => { _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].joinLC(); } }, "support server"), "\xAD for help."))); } } } let popoutModules; let UserPopoutComponent; let PopoutProps; class Popout extends React.Component { get modules() { return popoutModules || (popoutModules = [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.find(e => e.default && e.default.displayName === "FluxContainer(ForwardRef(SubscribeGuildMembersContainer(UserPopout)))"), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.find(e => e.default && e.default.getCurrentUser)]); } render() { let [UserPopout, userModule] = this.modules; const user = userModule.default.getCurrentUser(); if (!UserPopoutComponent) { if (!UserPopout) throw new Error(`Couldn't find the UserPopout component.`); const render1 = new UserPopout.default({ userId: user.id, guildId: null, channelId: null, disableUserProfileLink: true }).render(); PopoutProps = render1.props; const render2 = render1.type.render(PopoutProps, null); const render3 = new render2.type(render2.props).render(); UserPopoutComponent = render3.type; } if (!UserPopoutComponent) throw new Error(`Couldn't find the UserPopoutComponent component.`); let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"], this.props.preview.props.settings.state.data); const activity = function () { if (!this.game) return null; let game = { name: this.game.name || _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"].name, application_id: this.game.application_id || _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"].application_id, details: this.game.details || undefined, state: this.game.state || undefined, timestamps: this.game["timestamps.start"] ? { start: this.game["timestamps.start"] } : undefined, assets: this.game["assets.large"] ? { large_image: this.game["assets.large"], small_image: this.game["assets.small"] || undefined } : undefined, type: 0 }; return game; }.call({ game: data }); PopoutProps = new UserPopout.default({ userId: user.id, guildId: null, channelId: null, disableUserProfileLink: true }).render().props; const popout = new UserPopoutComponent(Object.assign({}, PopoutProps, { activity: activity })).render().props.children; // bypass tracking // remove the stop propagation shit. const container = /*#__PURE__*/React.createElement("div", window.Lightcord.Api._.excludeProperties(popout.props, ["onClick", "onContextMenu"])); return /*#__PURE__*/React.createElement("div", { className: "lc-userPopout lc-tab-box-shadow" }, container); } } let profileModules; let UserProfileComponent; let ProfileProps; let connectedProfileStore; class Profile extends React.Component { get modules() { return profileModules || (profileModules = [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.find(e => e.default && e.default.displayName === "UserProfile"), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.find(e => e.default && e.default.getCurrentUser)]); } render() { let [UserProfile, userModule] = this.modules; const user = userModule.default.getCurrentUser(); if (!UserProfileComponent) { const render1 = new UserProfile.default({ user: user }).render(); connectedProfileStore = render1.type; const render2 = new render1.type(render1.props).render(); const render3 = render2.type.render(render2.props, null); const render4 = new render3.type(render3.props).render(); UserProfileComponent = render4.type; } if (!UserProfileComponent) throw new Error(`Couldn't find the UserProfileComponent component.`); let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"], this.props.preview.props.settings.state.data); const activity = function () { if (!this.game) return null; let game = { name: this.game.name || _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"].name, application_id: this.game.application_id || _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"].application_id, details: this.game.details || undefined, state: this.game.state || undefined, timestamps: this.game["timestamps.start"] ? { start: this.game["timestamps.start"] } : undefined, assets: this.game["assets.large"] ? { large_image: this.game["assets.large"], small_image: this.game["assets.small"] || undefined } : undefined, type: 0 }; return game; }.call({ game: data }); ProfileProps = new connectedProfileStore({ user: user, close: () => {} }).render().props; const profile = new UserProfileComponent(Object.assign({}, ProfileProps, { activity: activity })).render().props.children; // bypass tracking profile.props.style = { width: "auto" }; return /*#__PURE__*/React.createElement("div", { className: "lc-tab lc-tab-box-shadow" }, profile); } } /***/ }), /***/ "./src/ui/publicservers/layer.js": /*!***************************************!*\ !*** ./src/ui/publicservers/layer.js ***! \***************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Layer; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _modules_domtools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../modules/domtools */ "./src/modules/domtools.js"); class V2C_Layer extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); this.keyupListener = this.keyupListener.bind(this); } keyupListener(e) { if (e.which === 27) { _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactDom.unmountComponentAtNode(this.refs.root.parentNode); } } componentDidMount() { window.addEventListener("keyup", this.keyupListener); const thisNode = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query(`#${this.props.id}`); _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({ duration: 200, update: function (progress) { thisNode.style.transform = `scale(${1.1 - 0.1 * progress}) translateZ(0px)`; thisNode.style.opacity = progress; if (progress == 1) { setImmediate(() => { thisNode.style.transform = ""; thisNode.style.opacity = ""; }); } } }); } componentWillUnmount() { window.removeEventListener("keyup", this.keyupListener); const thisNode = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query(`#${this.props.id}`); _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({ duration: 200, update: function (progress) { thisNode.style.transform = `scale(${1.1 - 0.1 * (1 - progress)}) translateZ(0px)`; thisNode.style.opacity = 1 - progress; if (progress == 1) { setImmediate(() => { thisNode.remove(); }); } } }); const layer = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query(".publicServersOpen"); layer.classList.remove("publicServersOpen"); _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({ duration: 200, update: function (progress) { layer.style.transform = `scale(${0.07 * progress + 0.93}) translateZ(0px)`; layer.style.opacity = progress; if (progress == 1) { setImmediate(() => { layer.style.transform = ""; layer.style.opacity = ""; }); } } }); } componentWillMount() { const layer = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query("[class*=\"layer-\"]"); layer.classList.add("publicServersOpen"); _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({ duration: 200, update: function (progress) { layer.style.transform = `scale(${0.07 * (1 - progress) + 0.93}) translateZ(0px)`; layer.style.opacity = 1 - progress; } }); } render() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "layer bd-layer " + BDModules.get(e => e.layer && e.animating)[0].layer, id: this.props.id, ref: "root", style: { opacity: 0, transform: "scale(1.1) translateZ(0px)" } }, this.props.children); } } /***/ }), /***/ "./src/ui/publicservers/publicServers.js": /*!***********************************************!*\ !*** ./src/ui/publicservers/publicServers.js ***! \***********************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_PublicServers; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools */ "./src/ui/tools.js"); /* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../settingsTitle */ "./src/ui/settingsTitle.js"); /* harmony import */ var _tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../tabBarSeparator */ "./src/ui/tabBarSeparator.js"); /* harmony import */ var _tabBarHeader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../tabBarHeader */ "./src/ui/tabBarHeader.js"); /* harmony import */ var _tabBarItem__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../tabBarItem */ "./src/ui/tabBarItem.js"); /* harmony import */ var _serverCard__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./serverCard */ "./src/ui/publicservers/serverCard.js"); /* harmony import */ var _sidebarView__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./sidebarView */ "./src/ui/publicservers/sidebarView.js"); class V2C_PublicServers extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); this.setInitialState(); this.close = this.close.bind(this); this.changeCategory = this.changeCategory.bind(this); this.search = this.search.bind(this); this.searchKeyDown = this.searchKeyDown.bind(this); this.checkConnection = this.checkConnection.bind(this); this.join = this.join.bind(this); this.connect = this.connect.bind(this); this.GuildStore = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["getGuilds"]); this.AvatarDefaults = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["getUserAvatarURL", "DEFAULT_AVATARS"]); this.InviteActions = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["acceptInvite"]); this.SortedGuildStore = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["getSortedGuilds"]); } componentDidMount() { this.checkConnection(); } setInitialState() { this.state = { selectedCategory: -1, title: "Loading...", loading: true, servers: [], next: null, connection: { state: 0, user: null } }; } close() { _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactDom.unmountComponentAtNode(document.getElementById(this.props.rootId)); } search(query, clear) { const self = this; fetch(`${self.endPoint}${query}${query ? "&schema=new" : "?schema=new"}`, { method: "get" }).then(async res => { if (res.status !== 200) throw await res.text(); let data = await res.json(); let servers = data.results.reduce((arr, server) => { server.joined = false; arr.push(server); // arr.push(); return arr; }, []); if (!clear) { servers = self.state.servers.concat(servers); } else {//servers.unshift(self.bdServer); } let end = data.size + data.from; data.next = `?from=${end}`; if (self.state.term) data.next += `&term=${self.state.term}`; if (self.state.selectedCategory) data.next += `&category=${self.categoryButtons[self.state.selectedCategory]}`; if (end >= data.total) { end = data.total; data.next = null; } let title = `Showing 1-${end} of ${data.total} results in ${self.categoryButtons[self.state.selectedCategory]}`; if (self.state.term) title += ` for ${self.state.term}`; self.setState({ loading: false, title: title, servers: servers, next: data.next }); if (clear) { //console.log(self); self.refs.sbv.refs.contentScroller.scrollTop = 0; } }).catch(err => { console.error(err); return self.setState({ loading: false, title: "Failed to load servers. Check console for details" }); }); } async join(serverCard) { if (serverCard.props.pinned) return this.InviteActions.acceptInvite(serverCard.props.invite_code); await fetch(`${this.joinEndPoint}/${serverCard.props.server.identifier}`, { method: "GET", credentials: "include", mode: "cors", headers: { "Accept": "application/json", "Content-Type": "application/json" } }); serverCard.setState({ joined: true }); } connect() { const self = this; const options = self.windowOptions; options.x = Math.round(window.screenX + window.innerWidth / 2 - options.width / 2); options.y = Math.round(window.screenY + window.innerHeight / 2 - options.height / 2); self.joinWindow = new (window.require("electron").remote.BrowserWindow)(options); const url = "https://auth.discordservers.com/connect?scopes=guilds.join&previousUrl=https://auth.discordservers.com/info"; self.joinWindow.webContents.on("did-navigate", (event, url) => { if (url != "https://auth.discordservers.com/info") return; self.joinWindow.close(); self.checkConnection(); }); self.joinWindow.loadURL(url); } get windowOptions() { return { width: 500, height: 550, backgroundColor: "#282b30", show: true, resizable: false, maximizable: false, minimizable: false, alwaysOnTop: true, frame: false, center: false, webPreferences: { nodeIntegration: false } }; } get bdServer() { const server = { name: "BetterDiscord", online: "7500+", members: "20000+", categories: ["community", "programming", "support"], description: "Official BetterDiscord server for support etc", identifier: "86004744966914048", iconUrl: "https://cdn.discordapp.com/icons/86004744966914048/292e7f6bfff2b71dfd13e508a859aedd.webp", nativejoin: true, invite_code: "0Tmfo5ZbORCRqbAd", pinned: true }; const server2 = { name: "Lightcord", online: "30+", members: "50+", categories: ["community", "programming", "support"], description: "Official Lightcord server for support etc", identifier: "86004744966914048", iconUrl: "https://avatars3.githubusercontent.com/u/65690058?s=200&v=4", nativejoin: true, invite_code: "7eFff2A", pinned: true }; const guildList = this.SortedGuildStore.getFlattenedGuildIds(); const defaultList = this.AvatarDefaults.DEFAULT_AVATARS; return [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_serverCard__WEBPACK_IMPORTED_MODULE_6__["default"], { server: server2, pinned: true, join: this.join, guildList: guildList, fallback: defaultList[Math.floor(Math.random() * 5)] }), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_serverCard__WEBPACK_IMPORTED_MODULE_6__["default"], { server: server, pinned: true, join: this.join, guildList: guildList, fallback: defaultList[Math.floor(Math.random() * 5)] })]; } get endPoint() { return "https://search.discordservers.com"; } get joinEndPoint() { return "https://j.discordservers.com"; } get connectEndPoint() { return "https://join.discordservers.com/connect"; } async checkConnection() { const self = this; try { const response = await fetch(`https://auth.discordservers.com/info`, { method: "GET", credentials: "include", mode: "cors", headers: { "Accept": "application/json", "Content-Type": "application/json" } }); const data = await response.json(); self.setState({ selectedCategory: 0, connection: { state: 2, user: data } }); self.search("", true); } catch (error) { console.error(error); self.setState({ title: "Not connected to discordservers.com!", loading: true, selectedCategory: -1, connection: { state: 1, user: null } }); } } render() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_sidebarView__WEBPACK_IMPORTED_MODULE_7__["default"], { ref: "sbv" }, this.component); } get component() { return { sidebar: { component: this.sidebar }, content: { component: this.content }, tools: { component: _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tools__WEBPACK_IMPORTED_MODULE_1__["default"], { key: "pt", ref: "tools", onClick: this.close }) } }; } get sidebar() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "sidebar", key: "ps" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-tab-bar SIDE" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-tab-bar-header", style: { fontSize: "16px" } }, "Public Servers"), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), this.searchInput, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarHeader__WEBPACK_IMPORTED_MODULE_4__["default"], { text: "Categories" }), this.categoryButtons.map((value, index) => { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarItem__WEBPACK_IMPORTED_MODULE_5__["default"], { id: index, onClick: this.changeCategory, key: index, text: value, selected: this.state.selectedCategory === index }); }), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), this.footer, this.connection)); } get searchInput() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-form-item" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-text-input flex-vertical", style: { width: "172px", marginLeft: "10px" } }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("input", { ref: "searchinput", onKeyDown: this.searchKeyDown, onChange: () => {}, type: "text", className: "input default", placeholder: "Search...", maxLength: "50" }))); } searchKeyDown(e) { const self = this; if (self.state.loading || e.which !== 13) return; self.setState({ loading: true, title: "Loading...", term: e.target.value }); let query = `?term=${e.target.value}`; if (self.state.selectedCategory !== 0) { query += `&category=${self.categoryButtons[self.state.selectedCategory]}`; } self.search(query, true); } get categoryButtons() { return ["All", "FPS Games", "MMO Games", "Strategy Games", "MOBA Games", "RPG Games", "Tabletop Games", "Sandbox Games", "Simulation Games", "Music", "Community", "Language", "Programming", "Other"]; } changeCategory(id) { const self = this; if (self.state.loading) return; self.refs.searchinput.value = ""; self.setState({ loading: true, selectedCategory: id, title: "Loading...", term: null }); if (id === 0) { self.search("", true); return; } self.search(`?category=${self.categoryButtons[id]}`, true); } get content() { const self = this; const guildList = this.SortedGuildStore.getFlattenedGuildIds(); const defaultList = this.AvatarDefaults.DEFAULT_AVATARS; if (self.state.connection.state === 1) return self.notConnected; let columnModule = BDModules.get(e => e.contentColumnDefault)[0]; return [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { ref: "content", key: "pc", className: columnModule.contentColumn + " " + columnModule.contentColumn + " content-column default" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], { text: self.state.title }), self.bdServer, self.state.servers.map(server => { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_serverCard__WEBPACK_IMPORTED_MODULE_6__["default"], { key: server.identifier, server: server, join: self.join, guildList: guildList, fallback: defaultList[Math.floor(Math.random() * 5)] }); }), self.state.next && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", { type: "button", onClick: () => { if (self.state.loading) return; self.setState({ loading: true }); self.search(self.state.next, false); }, className: "ui-button filled brand small grow", style: { width: "100%", marginTop: "10px", marginBottom: "10px" } }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-button-contents" }, self.state.loading ? "Loading" : "Load More")), self.state.servers.length > 0 && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], { text: self.state.title }))]; } get notConnected() { const self = this; //return BDV2.react.createElement(SettingsTitle, { text: self.state.title }); let columnModule = BDModules.get(e => e.contentColumnDefault)[0]; return [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { key: "ncc", ref: "content", className: columnModule.contentColumn + " " + columnModule.contentColumn + " content-column default" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h2", { className: "ui-form-title h2 margin-reset margin-bottom-20" }, "Not connected to discordservers.com!", _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", { onClick: self.connect, type: "button", className: "ui-button filled brand small grow", style: { display: "inline-block", minHeight: "18px", marginLeft: "10px", lineHeight: "14px" } }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-button-contents" }, "Connect"))), self.bdServer)]; } get footer() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-tab-bar-header" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("a", { href: "https://discordservers.com", target: "_blank" }, "Discordservers.com")); } get connection() { const self = this; const { connection } = self.state; if (connection.state !== 2) return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null); return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", { style: { color: "#b9bbbe", fontSize: "10px", marginLeft: "10px" } }, "Connected as: ", `${connection.user.username}#${connection.user.discriminator}`), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { style: { padding: "5px 10px 0 10px" } }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", { style: { width: "100%", minHeight: "20px" }, type: "button", className: "ui-button filled brand small grow" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-button-contents", onClick: self.connect }, "Reconnect")))); } } /***/ }), /***/ "./src/ui/publicservers/serverCard.js": /*!********************************************!*\ !*** ./src/ui/publicservers/serverCard.js ***! \********************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_ServerCard; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); class V2C_ServerCard extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); if (!this.props.server.iconUrl) this.props.server.iconUrl = this.props.fallback; this.state = { imageError: false, joined: this.props.guildList.includes(this.props.server.identifier) }; } render() { const { server } = this.props; let cardModule = BDModules.get(e => e.card && e.cardPrimary)[0]; let flexModule = BDModules.get(e => e.flexChild && e._horizontalReverse)[0]; let wrapModule = BDModules.get(e => e.noWrap && !e.streamerModeEnabled)[0]; return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", // cardPrimary-1Hv-to { className: `${cardModule.card} ${cardModule.cardPrimary} ${BDModules.get(e => e.marginBottom8)[0].marginBottom8} bd-server-card${server.pinned ? " bd-server-card-pinned" : ""}` }, // BDV2.react.createElement( // "div", // { className: "flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY flex-1O1GKY directionRow-3v3tfG justifyStart-2yIZo0 alignStretch-1hwxMa noWrap-3jynv6" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("img", { ref: "img", className: "bd-server-image", src: server.iconUrl, onError: this.handleError.bind(this), draggable: false }), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: flexModule.flexChild + " bd-server-content" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: flexModule.horizontal + " " + wrapModule.noWrap + " bd-server-header" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h5", { className: "h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-name" }, server.name), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h5", { className: "h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-member-count" }, server.members, " Members")), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: flexModule.horizontal + " " + wrapModule.noWrap }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "scrollerWrap-2lJEkd scrollerThemed-2oenus themeGhostHairline-DBD-2d scrollerFade-1Ijw5y bd-server-description-container" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "scroller-2FKFPG scroller bd-server-description" }, server.description))), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY directionRow-3v3tfG noWrap-3jynv6 bd-server-footer" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "flexChild-faoVW3 bd-server-tags", style: { flex: "1 1 auto" } }, server.categories.join(", ")), this.state.joined && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", { type: "button", className: "button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN colorGreen-29iAKY", style: { minHeight: "12px", marginTop: "4px", backgroundColor: "#3ac15c" } }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-button-contents" }, "Joined")), server.error && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", { type: "button", className: "button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN disabled-9aF2ug", style: { minHeight: "12px", marginTop: "4px", backgroundColor: "#c13a3a" } }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-button-contents" }, "Error")), !server.error && !this.state.joined && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", { type: "button", className: "button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN", style: { minHeight: "12px", marginTop: "4px" }, onClick: () => { this.join(); } }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-button-contents" }, "Join")))) // ) ); } handleError() { this.props.server.iconUrl = this.props.fallback; this.setState({ imageError: true }); } join() { this.props.join(this); //this.setState({joined: true}); } } /***/ }), /***/ "./src/ui/publicservers/sidebarView.js": /*!*********************************************!*\ !*** ./src/ui/publicservers/sidebarView.js ***! \*********************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SidebarView; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _scroller__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../scroller */ "./src/ui/scroller.js"); class V2C_SidebarView extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); } render() { const { sidebar, content, tools } = this.props.children; return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "standardSidebarView-3F1I7i ui-standard-sidebar-view" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "sidebarRegion-VFTUkN sidebar-region" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_scroller__WEBPACK_IMPORTED_MODULE_1__["default"], { key: "sidebarScroller", ref: "sidebarScroller", sidebar: true, fade: sidebar.fade || true, dark: sidebar.dark || true }, sidebar.component)), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "contentRegion-3nDuYy content-region" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "contentTransitionWrap-3hqOEW content-transition-wrap" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "scrollerWrap-2lJEkd firefoxFixScrollFlex-cnI2ix contentRegionScrollerWrap-3YZXdm content-region-scroller-wrap scrollerThemed-2oenus themeGhost-28MSn0 scrollerTrack-1ZIpsv" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "scroller-2FKFPG firefoxFixScrollFlex-cnI2ix contentRegionScroller-26nc1e content-region-scroller scroller", ref: "contentScroller" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "contentColumn-2hrIYH contentColumnDefault-1VQkGM content-column default" }, content.component), tools.component))))); } } /***/ }), /***/ "./src/ui/reloadIcon.js": /*!******************************!*\ !*** ./src/ui/reloadIcon.js ***! \******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_ReloadIcon; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); class V2C_ReloadIcon extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); } render() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "#dcddde", className: "bd-reload " + this.props.className, onClick: this.props.onClick, style: { width: this.props.size || "24px", height: this.props.size || "24px" } }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", { d: "M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z" }), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", { fill: "none", d: "M0 0h24v24H0z" })); } } /***/ }), /***/ "./src/ui/scroller.js": /*!****************************!*\ !*** ./src/ui/scroller.js ***! \****************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Scroller; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); class V2C_Scroller extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); } render() { //scrollerWrap-2lJEkd scrollerThemed-2oenus themeGhostHairline-DBD-2d scrollerFade-1Ijw5y let scrollerModule1 = BDModules.get(e => e.scrollerHorizontal)[0]; let scrollerModule2 = BDModules.get(e => e.sidebarRegionScroller)[0]; let wrapperClass = `${scrollerModule1.scrollerWrap} ${scrollerModule1.scrollerThemed} ${scrollerModule1.themeGhostHairline}${this.props.fade ? " " + scrollerModule1.scrollerFade : ""}`; let scrollerClass = scrollerModule1.scroller + " scroller"; /* fuck */ if (this.props.sidebar) scrollerClass += ` ${scrollerModule2.sidebarRegionScroller} sidebar-region-scroller`; if (this.props.contentColumn) { scrollerClass += " " + scrollerModule2.contentRegionScroller + " content-region-scroller"; /* fuck */ wrapperClass = `${scrollerModule1.scrollerWrap} ${scrollerModule2.contentRegionScrollerWrap} content-region-scroller-wrap ${scrollerModule1.scrollerThemed} ${scrollerModule1.themeGhost} ${scrollerModule1.scrollerTrack}`; } const { children } = this.props; return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { key: "scrollerwrap", className: wrapperClass }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { key: "scroller", ref: "scroller", className: scrollerClass }, children)); } } const originalRender = V2C_Scroller.prototype.render; Object.defineProperty(V2C_Scroller.prototype, "render", { enumerable: false, configurable: false, set: function () { console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins"); }, get: () => originalRender }); /***/ }), /***/ "./src/ui/sectionedSettingsPanel.js": /*!******************************************!*\ !*** ./src/ui/sectionedSettingsPanel.js ***! \******************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SectionedSettingsPanel; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _settingsGroup__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./settingsGroup */ "./src/ui/settingsGroup.js"); /* harmony import */ var _margintop__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./margintop */ "./src/ui/margintop.jsx"); class V2C_SectionedSettingsPanel extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); } render() { return this.props.sections.map((section, i) => { return [i !== 0 ? _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_margintop__WEBPACK_IMPORTED_MODULE_2__["default"], {}) : null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_settingsGroup__WEBPACK_IMPORTED_MODULE_1__["default"], Object.assign({}, section, { onChange: this.props.onChange }))]; }); } } /***/ }), /***/ "./src/ui/settingsGroup.js": /*!*********************************!*\ !*** ./src/ui/settingsGroup.js ***! \*********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SettingsGroup; }); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js"); /* harmony import */ var _switch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./switch */ "./src/ui/switch.js"); class V2C_SettingsGroup extends _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactComponent { constructor(props) { super(props); } render() { const { title, settings, button } = this.props; const buttonComponent = button ? _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("button", { key: "title-button", className: "bd-pfbtn", onClick: button.onClick }, button.title) : null; return [_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], { text: title }), buttonComponent, settings.map(setting => { return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_switch__WEBPACK_IMPORTED_MODULE_3__["default"], { id: setting.id, key: setting.id, data: setting, checked: _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting.id], onChange: (id, checked) => { this.props.onChange(id, checked); } }); })]; } } /***/ }), /***/ "./src/ui/settingsTitle.js": /*!*********************************!*\ !*** ./src/ui/settingsTitle.js ***! \*********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SettingsTitle; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); class V2C_SettingsTitle extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); } //h2-2gWE-o title-3sZWYQ size16-14cGz5 height20-mO2eIN weightSemiBold-NJexzi da-h2 da-title da-size16 da-height20 da-weightSemiBold defaultColor-1_ajX0 da-defaultColor marginTop60-3PGbtK da-marginTop60 marginBottom20-32qID7 da-marginBottom20 render() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h2", { className: "ui-form-title h2 margin-reset margin-bottom-20" }, this.props.text); } } /***/ }), /***/ "./src/ui/switch.js": /*!**************************!*\ !*** ./src/ui/switch.js ***! \**************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return SwitchItem; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _components_switch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/switch */ "./src/ui/components/switch.jsx"); let classnames = []; function getClassName(name) { let className = classnames.find(e => e.startsWith(name + "-")); if (className) return className; className = BDModules.get(e => e[name])[0][name]; classnames.push(className); return className; } class SwitchItem extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); this.onChange = this.onChange.bind(this); } onChange() { this.props.checked = !this.props.checked; this.props.onChange(this.props.id, this.props.checked); } render() { let { text, info } = this.props.data; if (!classnames.find(e => e.startsWith("beta-"))) { classnames.push(BDModules.get(e => e.beta && !e.container && !e.userSettingsVoice)[0].beta); } if (this.props.data.experimental) { info = [info, React.createElement("sup", { className: getClassName("beta") }, "(EXPERIMENTAL)")]; } return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-flex flex-vertical flex-justify-start flex-align-stretch flex-nowrap ui-switch-item" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-flex flex-horizontal flex-justify-start flex-align-stretch flex-nowrap" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h3", { key: "title", className: "ui-form-title h3 margin-reset margin-reset ui-flex-child" }, text), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_components_switch__WEBPACK_IMPORTED_MODULE_1__["default"], { key: "switch", onChange: this.onChange, checked: this.props.checked })), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-form-text style-description margin-top-4", style: { flex: "1 1 auto" } }, info)); } } /***/ }), /***/ "./src/ui/tabBarHeader.js": /*!********************************!*\ !*** ./src/ui/tabBarHeader.js ***! \********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_TabBarHeader; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); class V2C_TabBarHeader extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); } render() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-tab-bar-header" }, this.props.text, this.props.button); } } /***/ }), /***/ "./src/ui/tabBarItem.js": /*!******************************!*\ !*** ./src/ui/tabBarItem.js ***! \******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_TabBarItem; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); class V2C_TabBarItem extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); this.setInitialState(); this.onClick = this.onClick.bind(this); } setInitialState() { this.state = { selected: this.props.selected || false }; } render() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: `ui-tab-bar-item${this.props.selected ? " selected" : ""}`, onClick: this.onClick }, this.props.text); } onClick() { if (this.props.onClick) { this.props.onClick(this.props.id); } } } /***/ }), /***/ "./src/ui/tabBarSeparator.js": /*!***********************************!*\ !*** ./src/ui/tabBarSeparator.js ***! \***********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_TabBarSeparator; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); class V2C_TabBarSeparator extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); } render() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-tab-bar-separator margin-top-8 margin-bottom-8" }); } } /***/ }), /***/ "./src/ui/tools.js": /*!*************************!*\ !*** ./src/ui/tools.js ***! \*************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Tools; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _xSvg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./xSvg */ "./src/ui/xSvg.js"); class V2C_Tools extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); this.onClick = this.onClick.bind(this); } render() { let toolsModule = BDModules.get(e => e.toolsContainer)[0]; let containerModule = BDModules.get(e => e.container && e.closeButton && e.closeButtonBold)[0]; return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "tools-container " + toolsModule.toolsContainer }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "tools " + toolsModule.tools }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: containerModule.container }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "btn-close " + containerModule.closeButton, onClick: this.onClick }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_xSvg__WEBPACK_IMPORTED_MODULE_1__["default"], null)), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "esc-text " + containerModule.keybind }, "ESC")))); } onClick() { if (this.props.onClick) { this.props.onClick(); } const closeButton = document.querySelector("." + BDModules.get(e => e.closeButton && e.keybindBold)[0].closeButton.split(" ")[0]); if (closeButton) closeButton.click(); } } /***/ }), /***/ "./src/ui/tooltip.js": /*!***************************!*\ !*** ./src/ui/tooltip.js ***! \***************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return EmulatedTooltip; }); /* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js"); /* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/webpackModules */ "./src/modules/webpackModules.js"); /** * Tooltip that automatically show and hide themselves on mouseenter and mouseleave events. * Will also remove themselves if the node to watch is removed from DOM through * a MutationObserver. * * Note this is not using Discord's internals but normal DOM manipulation and emulates * Discord's own tooltips as closely as possible. * * @module EmulatedTooltip * @version 0.0.1 */ let TooltipClasses; function getTooltipClasses() { if (TooltipClasses) return TooltipClasses; return TooltipClasses = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("tooltip", "tooltipBlack"); } let TooltipLayers; function getTooltipLayers() { if (TooltipLayers) return TooltipLayers; return TooltipLayers = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("layer", "layerContainer"); } const getClass = function (sideOrColor) { const upperCase = sideOrColor[0].toUpperCase() + sideOrColor.slice(1); const tooltipClass = getTooltipClasses()[`tooltip${upperCase}`]; if (tooltipClass) return tooltipClass; return null; }; const classExists = function (sideOrColor) { return getClass(sideOrColor) ? true : false; }; const toPx = function (value) { return `${value}px`; }; class EmulatedTooltip { /** * * @constructor * @param {(HTMLElement|jQuery)} node - DOM node to monitor and show the tooltip on * @param {string} tip - string to show in the tooltip * @param {object} options - additional options for the tooltip * @param {string} [options.style=black] - correlates to the discord styling/colors (black, brand, green, grey, red, yellow) * @param {string} [options.side=top] - can be any of top, right, bottom, left * @param {boolean} [options.preventFlip=false] - prevents moving the tooltip to the opposite side if it is too big or goes offscreen * @param {boolean} [options.disabled=false] - whether the tooltip should be disabled from showing on hover * @param {boolean} [options.attachEvents=true] - whether the tooltip should listen to mouseenter and mouseleave events. */ constructor(node, text, options = {}) { const { style = "black", side = "top", preventFlip = false, disabled = false, attachEvents = true } = options; this.node = node instanceof jQuery ? node[0] : node; this.label = text; this.style = style.toLowerCase(); this.side = side.toLowerCase(); this.preventFlip = preventFlip; this.disabled = disabled; if (!classExists(this.side)) return _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].err("EmulatedTooltip", `Side ${this.side} does not exist.`); if (!classExists(this.style)) return _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].err("EmulatedTooltip", `Style ${this.style} does not exist.`); this.element = document.createElement("div"); this.element.className = getTooltipLayers().layer + " " + getTooltipLayers().disabledPointerEvents; this.tooltipElement = document.createElement("div"); this.tooltipElement.className = `${getTooltipClasses().tooltip} ${getClass(this.style)}`; this.labelElement = document.createElement("div"); this.labelElement.className = getTooltipClasses().tooltipContent; const pointerElement = document.createElement("div"); pointerElement.className = getTooltipClasses().tooltipPointer; this.tooltipElement.append(pointerElement); this.tooltipElement.append(this.labelElement); this.element.append(this.tooltipElement); if (attachEvents) { this.node.addEventListener("mouseenter", () => { if (this.disabled) return; this.show(); const observer = new MutationObserver(mutations => { mutations.forEach(mutation => { const nodes = Array.from(mutation.removedNodes); const directMatch = nodes.indexOf(this.node) > -1; const parentMatch = nodes.some(parent => parent.contains(this.node)); if (directMatch || parentMatch) { this.hide(); observer.disconnect(); } }); }); observer.observe(document.body, { subtree: true, childList: true }); }); this.node.addEventListener("mouseleave", () => { this.hide(); }); } } /** Container where the tooltip will be appended. */ get container() { return document.querySelector("." + _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].removeDa(BDModules.get(e => e.popouts)[0].popouts) + " ~ ." + _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].removeDa(BDModules.get(e => e.layerContainer)[0].layerContainer)); } /** Boolean representing if the tooltip will fit on screen above the element */ get canShowAbove() { return this.node.getBoundingClientRect().top - this.element.offsetHeight >= 0; } /** Boolean representing if the tooltip will fit on screen below the element */ get canShowBelow() { return this.node.getBoundingClientRect().top + this.node.offsetHeight + this.element.offsetHeight <= _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].screenHeight; } /** Boolean representing if the tooltip will fit on screen to the left of the element */ get canShowLeft() { return this.node.getBoundingClientRect().left - this.element.offsetWidth >= 0; } /** Boolean representing if the tooltip will fit on screen to the right of the element */ get canShowRight() { return this.node.getBoundingClientRect().left + this.node.offsetWidth + this.element.offsetWidth <= _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].screenWidth; } /** Hides the tooltip. Automatically called on mouseleave. */ hide() { this.element.remove(); this.tooltipElement.className = this._className; } /** Shows the tooltip. Automatically called on mouseenter. Will attempt to flip if position was wrong. */ show() { this.tooltipElement.className = `${getTooltipClasses().tooltip} ${getClass(this.style)}`; this.labelElement.textContent = this.label; this.container.append(this.element); if (this.side == "top") { if (this.canShowAbove || !this.canShowAbove && this.preventFlip) this.showAbove();else this.showBelow(); } if (this.side == "bottom") { if (this.canShowBelow || !this.canShowBelow && this.preventFlip) this.showBelow();else this.showAbove(); } if (this.side == "left") { if (this.canShowLeft || !this.canShowLeft && this.preventFlip) this.showLeft();else this.showRight(); } if (this.side == "right") { if (this.canShowRight || !this.canShowRight && this.preventFlip) this.showRight();else this.showLeft(); } } /** Force showing the tooltip above the node. */ showAbove() { this.tooltipElement.classList.add(getClass("top")); this.element.style.setProperty("top", toPx(this.node.getBoundingClientRect().top - this.element.offsetHeight - 10)); this.centerHorizontally(); } /** Force showing the tooltip below the node. */ showBelow() { this.tooltipElement.classList.add(getClass("bottom")); this.element.style.setProperty("top", toPx(this.node.getBoundingClientRect().top + this.node.offsetHeight + 10)); this.centerHorizontally(); } /** Force showing the tooltip to the left of the node. */ showLeft() { this.tooltipElement.classList.add(getClass("left")); this.element.style.setProperty("left", toPx(this.node.getBoundingClientRect().left - this.element.offsetWidth - 10)); this.centerVertically(); } /** Force showing the tooltip to the right of the node. */ showRight() { this.tooltipElement.classList.add(getClass("right")); this.element.style.setProperty("left", toPx(this.node.getBoundingClientRect().left + this.node.offsetWidth + 10)); this.centerVertically(); } centerHorizontally() { const nodecenter = this.node.getBoundingClientRect().left + this.node.offsetWidth / 2; this.element.style.setProperty("left", toPx(nodecenter - this.element.offsetWidth / 2)); } centerVertically() { const nodecenter = this.node.getBoundingClientRect().top + this.node.offsetHeight / 2; this.element.style.setProperty("top", toPx(nodecenter - this.element.offsetHeight / 2)); } } /***/ }), /***/ "./src/ui/tooltipWrap.js": /*!*******************************!*\ !*** ./src/ui/tooltipWrap.js ***! \*******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _tooltip__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tooltip */ "./src/ui/tooltip.js"); /* harmony default export */ __webpack_exports__["default"] = (class extends React.Component { constructor(props) { super(props); } async componentDidMount() { const { style = "black", side = "top", text = "" } = this.props; this.node = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactDom.findDOMNode(this); this.tooltip = new _tooltip__WEBPACK_IMPORTED_MODULE_1__["default"](this.node, text, { style, side }); } componentWillUnmount() { this.tooltip.hide(); delete this.tooltip; } render() { return this.props.children; } }); /***/ }), /***/ "./src/ui/xSvg.js": /*!************************!*\ !*** ./src/ui/xSvg.js ***! \************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_XSvg; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); class V2C_XSvg extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); } render() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 12 12", style: { width: "18px", height: "18px" } }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("g", { className: "background", fill: "none", fillRule: "evenodd" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", { d: "M0 0h12v12H0" }), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", { className: "fill", fill: "#dcddde", d: "M9.5 3.205L8.795 2.5 6 5.295 3.205 2.5l-.705.705L5.295 6 2.5 8.795l.705.705L6 6.705 8.795 9.5l.705-.705L6.705 6" }))); } } /***/ }), /***/ "crypto": /*!*************************!*\ !*** external "crypto" ***! \*************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("crypto"); /***/ }), /***/ "electron": /*!***************************!*\ !*** external "electron" ***! \***************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("electron"); /***/ }), /***/ "events": /*!*************************!*\ !*** external "events" ***! \*************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("events"); /***/ }), /***/ "fs": /*!*********************!*\ !*** external "fs" ***! \*********************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("fs"); /***/ }), /***/ "module": /*!*************************!*\ !*** external "module" ***! \*************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("module"); /***/ }), /***/ "node-fetch": /*!*****************************!*\ !*** external "node-fetch" ***! \*****************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("node-fetch"); /***/ }), /***/ "path": /*!***********************!*\ !*** external "path" ***! \***********************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("path"); /***/ }) /******/ }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvMGdsb2JhbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL2xvYWRpbmdJY29uLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbG9jYWxTdG9yYWdlRml4LmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy8yNGhvdXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL0FudGlBZERNLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9DdXN0b21SaWNoUHJlc2VuY2UuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2JkQXBpLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9iZEV2ZW50cy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvYmx1clByaXZhdGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NsYXNzTm9ybWFsaXplci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvY29sb3JlZFRleHQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9jb3JlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9kYXRhU3RvcmUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rldk1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc2FibGVUeXBpbmcuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc3RhbnQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2RvbXRvb2xzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9lbW9qaU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvcGx1Z2luQ2VydGlmaWVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9wbHVnaW5Nb2R1bGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3B1YmxpY1NlcnZlcnMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWwuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWxTaWRlYmFyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy90aGVtZU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3YyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy92b2ljZU1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL2J1Z19odW50ZXIuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL2NpcmN1cy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9zdmcvbGlnaHRjb3JkLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL0FjY291bnRJbmZvcy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9BcGlQcmV2aWV3LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2FkZG9uY2FyZC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9hZGRvbmxpc3QuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvYmRMb2dvLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY2hlY2tib3guanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jb21wb25lbnRzL2Ryb3Bkb3duLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbXBvbmVudHMvc2VhcmNoLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbXBvbmVudHMvc3dpdGNoLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbnRlbnRDb2x1bW4uanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jc3NFZGl0b3IuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jc3NFZGl0b3JEZXRhY2hlZC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2Vycm9yQm91bmRhcnkuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9kZWxldGUuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvaWNvbnMvZG93bmFycm93LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2ljb25zL2VkaXQuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvaWNvbnMvaGlzdG9yeS5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9zZWFyY2guanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvbWFyZ2ludG9wLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3ByZXNlbmNlU2V0dGluZ3MuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcHVibGljc2VydmVycy9sYXllci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3B1YmxpY3NlcnZlcnMvcHVibGljU2VydmVycy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3B1YmxpY3NlcnZlcnMvc2VydmVyQ2FyZC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3B1YmxpY3NlcnZlcnMvc2lkZWJhclZpZXcuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9yZWxvYWRJY29uLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2Nyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zZWN0aW9uZWRTZXR0aW5nc1BhbmVsLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2V0dGluZ3NHcm91cC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3NldHRpbmdzVGl0bGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zd2l0Y2guanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90YWJCYXJIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90YWJCYXJJdGVtLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdGFiQmFyU2VwYXJhdG9yLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdG9vbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90b29sdGlwLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdG9vbHRpcFdyYXAuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS94U3ZnLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJjcnlwdG9cIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwiZWxlY3Ryb25cIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwiZXZlbnRzXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcImZzXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcIm1vZHVsZVwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJub2RlLWZldGNoXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcInBhdGhcIiJdLCJuYW1lcyI6WyJtaW5pbXVtRGlzY29yZFZlcnNpb24iLCJjdXJyZW50RGlzY29yZFZlcnNpb24iLCJ3aW5kb3ciLCJEaXNjb3JkTmF0aXZlIiwicmVtb3RlQXBwIiwiZ2V0VmVyc2lvbiIsIm1pblN1cHBvcnRlZFZlcnNpb24iLCJiYmRWZXJzaW9uIiwiYmJkQ2hhbmdlbG9nIiwiZGVzY3JpcHRpb24iLCJjaGFuZ2VzIiwidGl0bGUiLCJ0eXBlIiwiaXRlbXMiLCJzZXR0aW5ncyIsImlkIiwiaW5mbyIsImltcGxlbWVudGVkIiwiaGlkZGVuIiwiY2F0IiwiY2F0ZWdvcnkiLCJleHBlcmltZW50YWwiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJkZWZhdWx0Q29va2llIiwic2V0dGluZ3NDb29raWUiLCJzZXR0aW5nc1JQQyIsImRlZmF1bHRSUEMiLCJEYXRlIiwibm93IiwiYmRwbHVnaW5FcnJvcnMiLCJiZHRoZW1lRXJyb3JzIiwiYmRDb25maWciLCJPYmplY3QiLCJjcmVhdGUiLCJCZXR0ZXJEaXNjb3JkQ29uZmlnIiwiYmR0aGVtZXMiLCJiZHBsdWdpbnMiLCJwbHVnaW5Db29raWUiLCJ0aGVtZUNvb2tpZSIsImxvY2FsU3RvcmFnZUZpeCIsImxvYWRpbmdJY29uIiwiZGVwcmVjYXRlR2xvYmFsIiwia2V5IiwidmFsdWUiLCJkZWZpbmVQcm9wZXJ0eSIsImdldCIsIlV0aWxzIiwid2FybiIsImdsb2JhbEtleXMiLCJrZXlzIiwiR2xvYmFscyIsIkJEVjIiLCJwbHVnaW5Nb2R1bGUiLCJ0aGVtZU1vZHVsZSIsIkJERXZlbnRzIiwic2V0dGluZ3NQYW5lbCIsIkRhdGFTdG9yZSIsIkNvbnRlbnRNYW5hZ2VyIiwiQ2xhc3NOb3JtYWxpemVyIiwiQmRBcGkiLCJDb3JlIiwiQ29yZVdyYXBwZXIiLCJjb25zdHJ1Y3RvciIsIm1ldGhvZHMiLCJzZXRDb25maWciLCJzZXRNZXRob2RzIiwiaW5pdCIsInYyTG9hZGVyIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwiYm9keSIsImFwcGVuZENoaWxkIiwiY29udGVudFdpbmRvd0dldHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIkhUTUxJRnJhbWVFbGVtZW50IiwicHJvdG90eXBlIiwiY29udGVudFdpbmRvdyIsIlJlZmxlY3QiLCJhcHBseSIsImFyZ3VtZW50cyIsIlByb3h5Iiwib2JqIiwicHJvcCIsInVuZGVmaW5lZCIsInZhbCIsImJpbmQiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsIkZ1bmN0aW9uIiwib09wZW4iLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJ1cmwiLCJ0b0xvd2VyQ2FzZSIsImluY2x1ZGVzIiwiVEZIb3VyIiwiaW5qZWN0MjRIb3VyIiwiY2FuY2VsMjRIb3VyIiwidHdlbHZlSG91ciIsIlJlZ0V4cCIsImNvbnZlcnQiLCJkYXRhIiwibWF0Y2hlZCIsInJldHVyblZhbHVlIiwibWF0Y2giLCJsZW5ndGgiLCJyZXBsYWNlIiwicGFkU3RhcnQiLCJwYXJzZUludCIsImNhbmNlbENvenkiLCJtb25rZXlQYXRjaCIsIlRpbWVGb3JtYXR0ZXIiLCJhZnRlciIsImNhbmNlbENvbXBhY3QiLCJyZW1vdmUyNEhvdXIiLCJkaXNwYXRjaGVyIiwiTGlnaHRjb3JkIiwiRGlzY29yZE1vZHVsZXMiLCJDaGFubmVsTW9kdWxlIiwiQkRNb2R1bGVzIiwiZSIsImRlZmF1bHQiLCJnZXRDaGFubmVsIiwiaGFzQ2hhbm5lbCIsInJlbGF0aW9uU2hpcE1vZHVsZSIsImFkZFJlbGF0aW9uc2hpcCIsIkRNTW9kdWxlIiwiY2xvc2VQcml2YXRlQ2hhbm5lbCIsImJsb2NrZWQiLCJ1c2VyTW9kdWxlIiwiZ2V0Q3VycmVudFVzZXIiLCJBbnRpQm90RE0iLCJhbnRpRE0iLCJlbmFibGVkIiwiZW5hYmxlIiwic3Vic2NyaWJlIiwiZGlzYWJsZSIsInVuc3Vic2NyaWJlIiwiZXYiLCJtZXNzYWdlIiwiYXV0aG9yIiwiYm90IiwiZ3VpbGRfaWQiLCJjaGFubmVsIiwiY2hhbm5lbF9pZCIsInNjYW5NZXNzYWdlIiwic2hvd1RvYXN0IiwidXNlcm5hbWUiLCJkaXNjcmltaW5hdG9yIiwibG9jYXRpb24iLCJ0ZXN0IiwiY29udGVudCIsIkVtYmVkc0NvbnRhaW5zIiwic2VhcmNoIiwiZW1iZWRzIiwibWFwIiwiZW1iZWQiLCJmb290ZXIiLCJ0ZXh0IiwiZmllbGRzIiwibmFtZSIsIm0iLCJEaXNwYXRjaGVyIiwiZGlzcGF0Y2giLCJBY3Rpb25UeXBlcyIsInNvY2tldElkIiwicGlkIiwiQ3VzdG9tUmljaFByZXNlbmNlIiwiZ2FtZSIsImZvcm1hdGVkR2FtZSIsImFwcGxpY2F0aW9uX2lkIiwiZGV0YWlscyIsInN0YXRlIiwidGltZXN0YW1wcyIsInN0YXJ0IiwiYXNzZXRzIiwibGFyZ2VfaW1hZ2UiLCJzbWFsbF9pbWFnZSIsInNlbmRHYW1lIiwiTE9DQUxfQUNUSVZJVFlfVVBEQVRFIiwiYWN0aXZpdHkiLCJjb25zb2xlIiwibG9nIiwic2V0IiwiZmV0Y2hBc3NldHMiLCJhcHBsaWNhdGlvbklkIiwiZ2V0QXNzZXRzIiwiRXJyb3IiLCJSZWFjdCIsIlJlYWN0RE9NIiwiUmVhY3REb20iLCJSZWFjdENvbXBvbmVudCIsIldpbmRvd0NvbmZpZ0ZpbGUiLCJlbW90ZXMiLCJzY3JlZW5XaWR0aCIsIk1hdGgiLCJtYXgiLCJkb2N1bWVudEVsZW1lbnQiLCJjbGllbnRXaWR0aCIsImlubmVyV2lkdGgiLCJzY3JlZW5IZWlnaHQiLCJjbGllbnRIZWlnaHQiLCJpbm5lckhlaWdodCIsImdldEFsbFdpbmRvd1ByZWZlcmVuY2VzIiwiZ2V0V2luZG93UHJlZmVyZW5jZSIsInNldFdpbmRvd1ByZWZlcmVuY2UiLCJpbmplY3RDU1MiLCJjc3MiLCJET00iLCJhZGRTdHlsZSIsImVzY2FwZUlEIiwiY2xlYXJDU1MiLCJyZW1vdmVTdHlsZSIsImxpbmtKUyIsImFkZFNjcmlwdCIsInVubGlua0pTIiwicmVtb3ZlU2NyaXB0IiwiZ2V0UGx1Z2luIiwiaGFzT3duUHJvcGVydHkiLCJwbHVnaW4iLCJnZXRDb3JlIiwibWFpbkNvcmUiLCJhbGVydCIsInNob3dDb25maXJtYXRpb25Nb2RhbCIsImNhbmNlbFRleHQiLCJvcHRpb25zIiwiZmluZE1vZHVsZSIsImZpbHRlciIsIldlYnBhY2tNb2R1bGVzIiwiZmluZCIsImZpbmRBbGxNb2R1bGVzIiwiZmluZEFsbCIsImZpbmRNb2R1bGVCeVByb3BzIiwicHJvcHMiLCJmaW5kQnlVbmlxdWVQcm9wZXJ0aWVzIiwiZmluZE1vZHVsZUJ5UHJvdG90eXBlcyIsInByb3RvcyIsImZpbmRCeVByb3RvdHlwZXMiLCJmaW5kTW9kdWxlQnlEaXNwbGF5TmFtZSIsImZpbmRCeURpc3BsYXlOYW1lIiwiZ2V0SW50ZXJuYWxJbnN0YW5jZSIsIm5vZGUiLCJqUXVlcnkiLCJFbGVtZW50IiwibG9hZERhdGEiLCJwbHVnaW5OYW1lIiwiZ2V0UGx1Z2luRGF0YSIsImdldERhdGEiLCJzYXZlRGF0YSIsInNldFBsdWdpbkRhdGEiLCJzZXREYXRhIiwiZGVsZXRlRGF0YSIsImRlbGV0ZVBsdWdpbkRhdGEiLCJ3aGF0IiwibWV0aG9kTmFtZSIsIm9uUmVtb3ZlZCIsImNhbGxiYWNrIiwic3VwcHJlc3NFcnJvcnMiLCJtZXRob2QiLCJ0ZXN0SlNPTiIsImlzUGx1Z2luRW5hYmxlZCIsImlzVGhlbWVFbmFibGVkIiwiaXNTZXR0aW5nRW5hYmxlZCIsImVuYWJsZVNldHRpbmciLCJvbkNoYW5nZSIsImRpc2FibGVTZXR0aW5nIiwidG9nZ2xlU2V0dGluZyIsImdldEJERGF0YSIsInNldEJERGF0YSIsIm1ha2VBZGRvbkFQSSIsImNvb2tpZSIsImxpc3QiLCJtYW5hZ2VyIiwiQWRkb25BUEkiLCJmb2xkZXIiLCJpc0VuYWJsZWQiLCJ0b2dnbGUiLCJyZWxvYWQiLCJnZXRBbGwiLCJrIiwiYSIsIlBsdWdpbnMiLCJUaGVtZXMiLCJCZXR0ZXJEaXNjb3JkIiwiRXZlbnRFbWl0dGVyIiwicmVxdWlyZSIsImV2ZW50TmFtZSIsImFyZ3MiLCJlbWl0Iiwib2ZmIiwiZXZlbnRBY3Rpb24iLCJyZW1vdmVMaXN0ZW5lciIsInNlbGVjdG9ycyIsInJlbW92ZURhIiwiZ2V0U2VsZWN0b3JzIiwic3RhbmRhcmRTaWRlYmFyVmlldyIsImRlZmF1bHRDbGFzc05hbWUiLCJzZWxlY3RzIiwidXNlclNldHRpbmdzQWNjb3VudCIsImNoaWxkcmVuIiwicHVzaCIsInBheW1lbnRTb3VyY2VSb3ciLCJzdWJUZXh0IiwiZGVzY3JpcHRpb25XcmFwcGVyIiwidmlld0JvZHkiLCJ1c2VyU2V0dGluZ3NTZWN1cml0eSIsIkJsdXJQcml2YXRlIiwiZXJyb3IiLCJET01Ub29scyIsImpvaW4iLCJub3JtYWxpemVkUHJlZml4IiwicmFuZENsYXNzIiwic3RvcCIsImhhc1BhdGNoZWQiLCJ1bnBhdGNoQ2xhc3NNb2R1bGVzIiwibW9kdWxlRmlsdGVyIiwicmV2ZXJ0RWxlbWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJwYXRjaENsYXNzTW9kdWxlcyIsIm5vcm1hbGl6ZUVsZW1lbnQiLCJwYXRjaERPTU1ldGhvZHMiLCJtb2R1bGVzIiwibW9kdWxlIiwicGF0Y2hDbGFzc01vZHVsZSIsInVucGF0Y2hDbGFzc01vZHVsZSIsInNob3VsZElnbm9yZSIsImlzTmFOIiwiZW5kc1dpdGgiLCJzdGFydHNXaXRoIiwiQXJyYXkiLCJpc0FycmF5IiwiX19lc01vZHVsZSIsImJhc2VDbGFzc05hbWUiLCJzcGxpdCIsImNvbXBvbmVudE5hbWUiLCJjbGFzc05hbWVzIiwiY2xhc3NMaXN0Iiwibm9ybWFsQ2xhc3MiLCJjYW1lbENhc2UiLCJzIiwiaSIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJuZXdTdHJpbmciLCJ0cmltIiwiZWxlbWVudCIsImNsYXNzZXMiLCJjIiwiY2xlbiIsIm5ld0NsYXNzIiwiYWRkIiwiY2hpbGQiLCJuZXh0RWxlbWVudFNpYmxpbmciLCJ0b1JlbW92ZSIsInJlbW92ZSIsImNvbnRhaW5zIiwiRE9NVG9rZW5MaXN0IiwidG9rZW4iLCJ0b2tlbnMiLCJ0IiwiQ29sb3JlZFRleHQiLCJpbmplY3RDb2xvcmVkVGV4dCIsImNhbmNlbENvbG9yZWRUZXh0IiwiTWVzc2FnZUNvbXBvbmVudCIsImJlZm9yZSIsIm1ldGhvZEFyZ3VtZW50cyIsImNoaWxkcmVuTWVzc2FnZUNvbnRlbnQiLCJtZXNzYWdlQ29udGVudCIsImRpc3BsYXlOYW1lIiwib3JpZ2luYWxUeXBlIiwiX19vcmlnaW5hbE1ldGhvZCIsInJvbGVDb2xvciIsImNvbG9yU3RyaW5nIiwic3R5bGUiLCJjb2xvciIsImFzc2lnbiIsInJlbW92ZUNvbG9yZWRUZXh0IiwiY2xhc3NOYW1lTWFya3VwIiwibWFya3VwIiwicXVlcnlTZWxlY3RvckFsbCIsImZvckVhY2giLCJlbGVtIiwic2V0UHJvcGVydHkiLCJwYXRoIiwiZnMiLCJNb2R1bGUiLCJnbG9iYWxQYXRocyIsInJlc29sdmUiLCJyZW1vdGUiLCJhcHAiLCJnZXRBcHBQYXRoIiwiTWV0YUVycm9yIiwib3JpZ2luYWxKU1JlcXVpcmUiLCJfZXh0ZW5zaW9ucyIsIm9yaWdpbmFsQ1NTUmVxdWlyZSIsInNwbGl0UmVnZXgiLCJlc2NhcGVkQXRSZWdleCIsImFkZG9uQ2FjaGUiLCJ0aW1lQ2FjaGUiLCJ3YXRjaGVycyIsInBhdGNoRXh0ZW5zaW9ucyIsImdldENvbnRlbnRSZXF1aXJlIiwicGx1Z2luc0ZvbGRlciIsIl9wbHVnaW5zRm9sZGVyIiwicmVhbHBhdGhTeW5jIiwiZGF0YVBhdGgiLCJ0aGVtZXNGb2xkZXIiLCJfdGhlbWVzRm9sZGVyIiwibG9hZEFkZG9uQ2VydGlmaWVyQ2FjaGUiLCJkYXRhU3RvcmUiLCJnZXRTZXR0aW5nR3JvdXAiLCJzZXRTZXR0aW5nR3JvdXAiLCJlbmNyeXB0U2V0dGluZ3NDYWNoZSIsIkpTT04iLCJwYXJzZSIsImRlY3J5cHRTZXR0aW5nc0NhY2hlIiwiaGFzaCIsInJlc3VsdCIsInN1c3BlY3QiLCJzYXZlQWRkb25DYWNoZSIsInN0cmluZ2lmeSIsIndhdGNoQ29udGVudCIsImNvbnRlbnRUeXBlIiwiaXNQbHVnaW4iLCJiYXNlRm9sZGVyIiwiZmlsZUVuZGluZyIsIndhdGNoIiwicGVyc2lzdGVudCIsImV2ZW50VHlwZSIsImZpbGVuYW1lIiwiUHJvbWlzZSIsInIiLCJzZXRUaW1lb3V0Iiwic3RhdFN5bmMiLCJlcnIiLCJjb2RlIiwidW5sb2FkUGx1Z2luIiwidW5sb2FkVGhlbWUiLCJpc0ZpbGUiLCJzdGF0cyIsIm10aW1lIiwiZ2V0VGltZSIsImxvYWRQbHVnaW4iLCJsb2FkVGhlbWUiLCJyZWxvYWRQbHVnaW4iLCJyZWxvYWRUaGVtZSIsInVud2F0Y2hDb250ZW50IiwiY2xvc2UiLCJleHRyYWN0TWV0YSIsImZpcnN0TGluZSIsImhhc09sZE1ldGEiLCJwYXJzZU9sZE1ldGEiLCJoYXNOZXdNZXRhIiwicGFyc2VOZXdNZXRhIiwibWV0YSIsInJhd01ldGEiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsImluZGV4T2YiLCJwYXJzZWQiLCJmb3JtYXQiLCJibG9jayIsIm91dCIsImZpZWxkIiwiYWNjdW0iLCJsaW5lIiwiY2hhckF0IiwibCIsInN1YnN0ciIsInNlbGYiLCJvcmlnaW5hbFJlcXVpcmUiLCJwb3NzaWJsZVBhdGgiLCJiYXNlbmFtZSIsImV4aXN0c1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJzdHJpcEJPTSIsImFkZGVkIiwiYXRpbWVNcyIsIm1vZGlmaWVkIiwibXRpbWVNcyIsInNpemUiLCJfY29tcGlsZSIsImRpZEV4cG9ydCIsImlzRW1wdHkiLCJleHBvcnRzIiwibWFrZVBsYWNlaG9sZGVyUGx1Z2luIiwiZ2V0TmFtZSIsImdldEF1dGhvciIsImdldERlc2NyaXB0aW9uIiwic291cmNlIiwid2Vic2l0ZSIsImxvYWRDb250ZW50IiwicHJvY2Vzc0ZpbGUiLCJ0aW1lc3RhbXAiLCJmaWxlIiwiaGFybSIsInN0YWNrIiwidW5sb2FkQ29udGVudCIsImNhY2hlIiwiaXNMb2FkZWQiLCJyZWxvYWRDb250ZW50IiwiY2FudFVubG9hZCIsImxvYWROZXdDb250ZW50IiwiYmFzZWRpciIsImZpbGVzIiwicmVhZGRpclN5bmMiLCJjb250ZW50TGlzdCIsInZhbHVlcyIsInJlbW92ZWQiLCJmIiwibG9hZEFsbENvbnRlbnQiLCJlcnJvcnMiLCJsb2FkUGx1Z2lucyIsImxvYWRUaGVtZXMiLCJjb25maWciLCJoYXNTdGFydGVkIiwiZmxhdCIsInZlcnNpb24iLCJFRCIsIldlYlNvY2tldCIsInBhdGNoQXR0cmlidXRlcyIsImluaXRTZXR0aW5ncyIsImNoZWNrRm9yR3VpbGRzIiwiaW5pdGlhbGl6ZSIsImluaXRpYWxpemVTZXR0aW5ncyIsImNvbnRlbnRNYW5hZ2VyIiwiQnVmZmVyIiwiZnJvbSIsInRvU3RyaW5nIiwiYWRkRXZlbnRMaXN0ZW5lciIsImNsaWNrIiwiUGx1Z2luQ2VydGlmaWVyIiwiZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSIsImluaXRPYnNlcnZlciIsInNob3dDb250ZW50RXJyb3JzIiwicGx1Z2lucyIsInRoZW1lcyIsInByZXZpb3VzVmVyc2lvbiIsInNob3dDaGFuZ2Vsb2dNb2RhbCIsIkVtb2ppTW9kdWxlIiwicGF0Y2hTb2NpYWwiLCJwYXRjaEd1aWxkUGlsbHMiLCJwYXRjaEd1aWxkTGlzdEl0ZW1zIiwicGF0Y2hHdWlsZFNlcGFyYXRvciIsInBhdGNoTWVzc2FnZUhlYWRlciIsInBhdGNoTWVtYmVyTGlzdCIsInBhdGNoQXR0YWNobWVudCIsInBhdGNoUG9wb3V0V2luZG93IiwiaGF2ZUluc3RhbGxlZERlZmF1bHQiLCJvbkNsb3NlIiwibG9nbyIsInRvcCIsImlubmVySFRNTCIsImNhbmNlbGVkIiwiY2FuY2VsUGF0Y2hQb3BvdXRXaW5kb3ciLCJBcGkiLCJlbnN1cmVFeHBvcnRlZCIsImdldFdpbmRvdyIsInRoZW4iLCJwb3BvdXRNb2R1bGUiLCJhdHRyaWJzUGF0Y2hzIiwiY2FuY2VsUGF0Y2hBdHRyaWJ1dGVzIiwidjIiLCJBbmNob3IiLCJEaXNjb3JkVGFnIiwiRGlzY29yZFRhZ0NvbXAiLCJ1dWlkdjQiLCJiYWRnZURpdiIsImRpc3BsYXkiLCJtYXJnaW5Ub3AiLCJ1c2VyIiwiVG9vbHRpcFdyYXAiLCJzaWRlIiwiaHJlZiIsInRhcmdldCIsIkJETG9nbyIsIkxpZ2h0Y29yZExvZ28iLCJkaXYiLCJhcHBseUJhZGdlcyIsInRpbWVzQ2hlY2tlZCIsIndyYXBwZXIiLCJndWlsZENsYXNzZXMiLCJndWlsZCIsImxpc3RJdGVtIiwiYmxvYiIsImJsb2JDb250YWluZXIiLCJkZWZlckxvYWRlZCIsInJlYWR5U3RhdGUiLCJpbmplY3RFeHRlcm5hbHMiLCJzYXZlU2V0dGluZ3MiLCJsb2FkU2V0dGluZ3MiLCJzZXR0aW5nIiwiZ2V0UHJlZGljYXRlU2VjdGlvbnMiLCJzZXR0aW5nTW9kdWxlIiwiY2FsbCIsInNlY3Rpb24iLCJwb3BlZCIsInBvcCIsInJlbmRlclNpZGViYXIiLCJjbGFzc05hbWVMYXllciIsImNsYXNzTmFtZVNvY2lhbExpbmtzIiwiY2xhc3NOYW1lTW9kYWwiLCJtYWluT2JzZXJ2ZXIiLCJNdXRhdGlvbk9ic2VydmVyIiwibXV0YXRpb25zIiwibWxlbiIsIm11dGF0aW9uIiwicmF3T2JzZXJ2ZXIiLCJhZGRlZE5vZGVzIiwibGF5ZXIiLCJhbmltYXRpbmciLCJzb2NpYWxMaW5rcyIsIm1vZGFsIiwiaW5uZXIiLCJyZXNwb25zaXZlV2lkdGhNb2JpbGUiLCJnZXRBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJwYXJlbnRFbGVtZW50Iiwib2JzZXJ2ZSIsImNoaWxkTGlzdCIsInN1YnRyZWUiLCJzb2NpYWxQYXRjaCIsIlRhYkJhciIsInNvY2lhbE1vZHVsZTEiLCJvcmlnaW5hbCIsIm5ld09uZSIsInJldHVyblZhbCIsImxpbmsiLCJjbGFzc05hbWVDb2xvck11dGVkIiwic2l6ZXMiLCJjbGFzc05hbWVWZXJzaW9uSGFzaCIsImNvbG9yTXV0ZWQiLCJzaXplMzIiLCJ2ZXJzaW9uSGFzaCIsImJyYW5jaCIsImFkZGl0aW9uYWwiLCJyZWFjdCIsInNpemUxMiIsImVsZWN0cm9uIiwiZ2V0R2xvYmFsIiwiY29tbWl0Iiwib3JpZ2luYWxWZXJzaW9ucyIsInNwbGljZSIsImdldEd1aWxkQ2xhc3NlcyIsImd1aWxkc1dyYXBwZXIiLCJmaW5kQnlQcm9wcyIsImd1aWxkcyIsInBpbGwiLCJndWlsZExpc3RJdGVtc1BhdGNoIiwiR3VpbGRDbGFzc2VzIiwibGlzdEl0ZW1DbGFzcyIsImJsb2JDbGFzcyIsInJlYWN0SW5zdGFuY2UiLCJHdWlsZENvbXBvbmVudCIsInJldHVybiIsInRoaXNPYmplY3QiLCJndWlsZERhdGEiLCJ1bnJlYWQiLCJzZWxlY3RlZCIsImF1ZGlvIiwidmlkZW8iLCJiYWRnZSIsImFuaW1hdGFibGUiLCJndWlsZFBpbGxQYXRjaCIsImd1aWxkUGlsbCIsImhvdmVyZWQiLCJndWlsZFNlcGFyYXRvclBhdGNoIiwiR3VpbGRzIiwiZ3VpbGRDb21wb25lbnRzIiwiR3VpbGRTZXBhcmF0b3IiLCJTZXBhcmF0b3IiLCJBdHRhY2htZW50UGF0Y2giLCJBdHRhY2htZW50IiwiYXR0YWNobWVudCIsImdldE5lc3RlZFByb3AiLCJwYXRjaCIsIm1lc3NhZ2VIZWFkZXJQYXRjaCIsIk1lc3NhZ2VIZWFkZXIiLCJjaGF0IiwibmV4dFRpY2siLCJnZXRFbGVtZW50QnlJZCIsImNoaWxkTm9kZXMiLCJibG9ja0RpdiIsImRpc3RhbnQiLCJnZXRCYWRnZXMiLCJiYWRnZXMiLCJzdmciLCJ3aWR0aCIsInNjb3BlcyIsInNjb3BlIiwiY29tcG9uZW50IiwiZGl2MiIsInJlYWN0RG9tIiwicmVuZGVyIiwibWVtYmVyTGlzdFBhdGNoIiwiTWVtYmVyTGlzdEl0ZW0iLCJyZW5kZXJEZWNvcmF0b3JzIiwidXBkYXRlSW5qZWN0b3IiLCJpbmplY3Rpb25QYXRoIiwiX19ub25fd2VicGFja19yZXF1aXJlX18iLCJyZWxlYXNlQ2hhbm5lbCIsImdsb2JhbHMiLCJnZXRSZWxlYXNlQ2hhbm5lbCIsImVudiIsIkFQUERBVEEiLCJIT01FIiwiWERHX0NPTkZJR19IT01FIiwic3RhYmxlIiwiY2FuYXJ5IiwicHRiIiwicGx1Z2luRGF0YSIsIkJERmlsZSIsIndyaXRlRmlsZVN5bmMiLCJzZXR0aW5nc0ZpbGUiLCJ1bmxpbmtTeW5jIiwiX2luamVjdGlvblBhdGgiLCJiYXNlIiwicm9hbWluZ0Jhc2UiLCJnZXRQYXRoIiwicm9hbWluZ0xvY2F0aW9uIiwicmVhbExvY2F0aW9uIiwiY29uZmlnRmlsZSIsIl9jb25maWdGaWxlIiwiX0JERmlsZSIsIl9zZXR0aW5nc0ZpbGUiLCJnZXRQbHVnaW5GaWxlIiwiRGV2TW9kZSIsImRlYnVnTGlzdGVuZXIiLCJjb3B5U2VsZWN0b3JMaXN0ZW5lciIsInN0YXJ0RGVidWdMaXN0ZW5lciIsInN0YXJ0Q29weVNlbGVjdG9yIiwic3RvcERlYnVnTGlzdGVuZXIiLCJzdG9wQ29weVNlbGVjdG9yIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIndoaWNoIiwicHJldmVudERlZmF1bHQiLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJzdG9wUHJvcGFnYXRpb24iLCJzZWxlY3RvciIsImdldFNlbGVjdG9yIiwiY2xhc3NMYXllciIsImNsYXNzSXRlbXMiLCJkaXNhYmxlZFBvaW50ZXJFdmVudHMiLCJtZW51IiwiYXR0YWNoIiwiY20iLCJxdWVyeSIsImNvbnRhaW5lciIsImxheWVyQ29udGFpbmVyIiwiY21XcmFwIiwic3R5bGVGbGV4aWJsZSIsImFjY29tbW9kYXRlU2Nyb2xsYmFyIiwiYXBwZW5kIiwiY2xpZW50WSIsImxlZnQiLCJjbGllbnRYIiwic2Nyb2xsZXJDbGFzc2VzIiwic2Nyb2xsZXJXcmFwIiwic2Nyb2xsZXJUaGVtZWQiLCJ0aGVtZUdob3N0SGFpcmxpbmUiLCJzY3JvbGxlciIsInJlbW92ZUNNIiwia2V5Q29kZSIsImNtZyIsImNtaSIsIml0ZW0iLCJsYWJlbENvbnRhaW5lciIsImNvbG9yRGVmYXVsdCIsImxhYmVsIiwiTmF0aXZlTW9kdWxlIiwiY29weSIsImVsZW1lbnRzIiwicXVlcnlBbGwiLCJmb2N1c2VkIiwic2VwYXJhdG9yIiwic2Nyb2xsSGVpZ2h0IiwiZnVsbFBhdGgiLCJlbCIsIm5hbWVzIiwicGFyZW50Tm9kZSIsInVuc2hpZnQiLCJvd25lckRvY3VtZW50IiwidGFnTmFtZSIsImVudHJpZXMiLCJwcmV2aW91c0VsZW1lbnRTaWJsaW5nIiwiRGlzYWJsZVR5cGluZyIsInN0YXJ0VHlwaW5nIiwidHlwaW5nTW9kdWxlIiwiZGlzYWJsZWQiLCJzdG9wVHlwaW5nIiwicmFuZG9tIiwidiIsImF3YWl0aW5nQmFkZ2VzUHJvbWlzZXMiLCJiYWRnZXNUb0ZldGNoIiwiRGlzdGFudFNlcnZlciIsIl9jYWNoZSIsIm5ld1Byb21pc2UiLCJyZXMiLCJDb25zdGFudHMiLCJkZWZhdWx0VXNlcnMiLCJmZXRjaGVkQmFkZ2VzIiwidXNlcnMiLCJoYW5kbGVSZXF1ZXN0IiwiUm91dGVzIiwic3RhdHVzIiwicmVzcG9uc2VCb2R5IiwianNvbiIsInByb21pc2UiLCJ1c2VyX2lkIiwiY2F0Y2giLCJMaWdodGNvcmRFcnJvciIsInJvdXRlIiwicmVqZWN0Iiwibm9kZUZldGNoIiwiU0VSVkVSX1VSTCIsImhlYWRlcnMiLCJBdXRob3JpemF0aW9uIiwiQnVnSHVudGVyQmFkZ2UiLCJDaXJjdXMiLCJoZWFkIiwic2NyaXB0Iiwic3JjIiwib25sb2FkIiwiYW5pbWF0ZSIsInRpbWluZyIsIl8iLCJ1cGRhdGUiLCJkdXJhdGlvbiIsInBlcmZvcm1hbmNlIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwidGltZSIsInRpbWVGcmFjdGlvbiIsInByb2dyZXNzIiwiUSIsInBhcnNlSFRNTCIsImlzSFRNTCIsIk5vZGVMaXN0Iiwic29tZSIsIm4iLCJub2RlVHlwZSIsImJhc2VFbGVtZW50IiwiaHRtbCIsImZyYWdtZW50IiwidGVtcGxhdGUiLCJjbG9uZU5vZGUiLCJlc2NhcGVIVE1MIiwidGV4dE5vZGUiLCJjcmVhdGVUZXh0Tm9kZSIsInNwYW5FbGVtZW50Iiwibm9kZVZhbHVlIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsInRvZ2dsZUNsYXNzIiwiY2xhc3NuYW1lIiwiaW5kaWNhdG9yIiwiaGFzQ2xhc3MiLCJldmVyeSIsInJlcGxhY2VDbGFzcyIsIm9sZE5hbWUiLCJuZXdOYW1lIiwiYXBwZW5kVG8iLCJ0aGlzTm9kZSIsInRoYXROb2RlIiwicHJlcGVuZFRvIiwicHJlcGVuZCIsImluc2VydEFmdGVyIiwidGFyZ2V0Tm9kZSIsImluc2VydEJlZm9yZSIsIm5leHRTaWJsaW5nIiwibmV3Tm9kZSIsIm5leHQiLCJuZXh0QWxsIiwibmV4dFVudGlsIiwibWF0Y2hlcyIsInByZXZpb3VzIiwicHJldmlvdXNBbGwiLCJwcmV2aW91c1VudGlsIiwiaW5kZXhJblBhcmVudCIsIm51bSIsImluZGV4IiwicGFyZW50IiwiZmluZENoaWxkIiwiZmluZENoaWxkcmVuIiwicGFyZW50cyIsImNsb3Nlc3QiLCJwYXJlbnRzVW50aWwiLCJzaWJsaW5ncyIsImF0dHJpYnV0ZSIsImdsb2JhbCIsImdldENvbXB1dGVkU3R5bGUiLCJoZWlnaHQiLCJ0ZXh0Q29udGVudCIsIm91dGVyV2lkdGgiLCJvZmZzZXRXaWR0aCIsIm91dGVySGVpZ2h0Iiwib2Zmc2V0SGVpZ2h0Iiwib2Zmc2V0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwibGlzdGVuZXJzIiwiX2xpc3RlbmVycyIsIm9uIiwiZXZlbnQiLCJkZWxlZ2F0ZSIsIm5hbWVzcGFjZSIsImhhc0RlbGVnYXRlIiwiZXZlbnRGdW5jIiwiY2FuY2VsIiwibmV3Q2FuY2VsIiwiZmluZEluZGV4Iiwib25jZSIsIl9fb2ZmQWxsIiwibWF0Y2hGaWx0ZXIiLCJsaXN0ZW5lciIsImRlZmF1bHRGaWx0ZXIiLCJvbk1vdW50Q2hhbmdlIiwib25Nb3VudCIsIndyYXBwZWRDYWxsYmFjayIsIm9ic2VydmVyIiwibm9kZXMiLCJyZW1vdmVkTm9kZXMiLCJkaXJlY3RNYXRjaCIsInBhcmVudE1hdGNoIiwib25Vbm1vdW50Iiwib25BZGRlZCIsIndyYXAiLCJkb21XcmFwcGVyIiwicmVzb2x2ZUVsZW1lbnQiLCJFbW9qaVJlZ2V4IiwiQ3VzdG9tRW1vamlNb2R1bGUiLCJDdXN0b21FbW9qaSIsIkVtb2ppTW9kdWxlQXBpIiwiZ2V0Q3VzdG9tRW1vamlCeUlkIiwiQXV0b2NvbXBsZXRlTW9kdWxlIiwiQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMiLCJnZXRBdXRvY29tcGxldGVPcHRpb25zIiwiRW1vamlNb2R1bGVRdWVyeSIsInF1ZXJ5RW1vamlSZXN1bHRzIiwiTWVzc2FnZXMiLCJFTU9KSV9NQVRDSElORyIsImd1aWxkTW9kdWxlIiwiZ2V0R3VpbGQiLCJnZXRHdWlsZHMiLCJpc0ZldGNoaW5nIiwiZW1vamlTZWFyY2giLCJnZXREaXNhbWJpZ3VhdGVkRW1vamlDb250ZXh0IiwiTElHSFRDT1JEX0VNT0pJUyIsImFyZzEiLCJhcmcyIiwiY29uZGl0aW9uIiwic2V0RW1vamlVc2FibGUiLCJxdWVyeVJlc3VsdHMiLCJyZXN1bHRzIiwicmVuZGVyUmVzdWx0cyIsIkQiLCJlbW9qaXMiLCJFTU9KSSIsIkVtb2ppIiwiZW1vamkiLCJ1bmlxdWVOYW1lIiwic2VudGluZWwiLCJndWlsZElkIiwiZ2V0UGxhaW5UZXh0IiwiaXNBbmltYXRlZCIsImFuaW1hdGVkIiwibWFuYWdlZCIsIm9yaWdpbmFsTmFtZSIsImdldFJhd1RleHQiLCJjYW5jZWxFbW9qaVJlbmRlciIsImNhbmNlbEVtb3RlUmVuZGVyIiwibmV3Q29udGVudCIsImhhc1BhcnNlZCIsImV4ZWMiLCJyYXciLCJ3b3JkcyIsIndvcmQiLCJhcnIiLCJlbW9qaUlkIiwianVtYm9hYmxlIiwicmVkdWNlIiwiY3VycmVudCIsInNoaWZ0IiwibyIsInUiLCJkIiwib25DbGljayIsIm9uSG92ZXIiLCJSIiwicHJlZml4IiwiVGl0bGUiLCJFbW9qaUZpbHRlck1vZHVsZSIsImlzRW1vamlEaXNhYmxlZCIsImlzVXNhYmxlIiwidXNhYmxlIiwic3Vycm9nYXRlcyIsImRpdmVyc2l0eSIsImNhY2hlMiIsInByb2Nlc3NBdHRhY2htZW50IiwiaXNUcnVzdGVkIiwiY2hlY2tWaXJ1c2VzIiwicmVzdWx0Q2FsbGJhY2siLCJyZW1vdmVDYWxsYmFjayIsImlzSGFybWZ1bCIsImtleXdvcmQiLCJvb2YiLCJub19jb21tZW50cyIsInJlZ2V4cHMiLCJyZWdleCIsImhhc2hUb1VybCIsImNoZWNrSGFzaCIsImdldEN1cnJlbnRXZWJDb250ZW50cyIsInVzZXJBZ2VudCIsIl9fcGF0aCIsImlzRnJvbUxvYWRlciIsImNyeXB0byIsImFsbG9jIiwiY3JlYXRlUmVhZFN0cmVhbSIsImNodW5rIiwiY29uY2F0IiwiaGFzaFJlc3VsdCIsImRpZ2VzdCIsInJlbmRlclRvRWxlbWVudHMiLCJmbG93ZXJTdGFyTW9kdWxlIiwiZmxvd2VyU3RhckNvbnRhaW5lciIsImNoaWxkTW9kdWxlIiwiY2hpbGRDb250YWluZXIiLCJib3JkZXJDb2xvciIsIm5leHROb2RlIiwiY29uZmlybVRleHQiLCJkYW5nZXIiLCJvbkNhbmNlbCIsIm9uQ29uZmlybSIsInNoZWxsIiwib3BlbkV4dGVybmFsIiwidG9vbHRpcFdyYXAiLCJ2aWV3Qm94IiwieCIsInkiLCJtYXNrIiwiZmlsbCIsInBvaW50ZXJFdmVudHMiLCJvZmZpY2lhbCIsInNwYW4iLCJmbG9hdCIsImZsb3dlclN0YXIiLCJnZXRLZXllZEFycmF5IiwiYnVmZmVyIiwiaW5zdGFsbFBhdGgiLCJjdXJzb3IiLCJzdHJva2UiLCJzYXZlIiwiT2JqZWN0U3RvcmFnZSIsImxvY2FsU3RvcmFnZU1vZHVsZSIsImxvY2FsU3RvcmFnZSIsImltcGwiLCJidG9hIiwic2V0SW50ZXJ2YWwiLCJzYWZlSlNPTlBhcnNlIiwiYXRvYiIsImdlbmVyYXRlS2V5IiwiZGVjaXBoZXIiLCJkZWNyeXB0ZWQiLCJmaW5hbCIsImNpcGhlciIsImVuY3J5cHRlZCIsIlBsdWdpbk1vZHVsZSIsImxvYWRQbHVnaW5EYXRhIiwibG9hZCIsInNhdmVQbHVnaW5EYXRhIiwiY2hhbm5lbFN3aXRjaCIsInN0YXJ0UGx1Z2luIiwic3RvcFBsdWdpbiIsImVuYWJsZVBsdWdpbiIsImRpc2FibGVQbHVnaW4iLCJ0b2dnbGVQbHVnaW4iLCJwIiwiZmlsZW5hbWVPck5hbWUiLCJiZHBsdWdpbiIsImRlbGV0ZSIsImVkaXQiLCJvcGVuSXRlbSIsInVwZGF0ZVBsdWdpbkxpc3QiLCJzYXZlZCIsIm5ld01lc3NhZ2UiLCJvbk1lc3NhZ2UiLCJvblN3aXRjaCIsIlYyX1B1YmxpY1NlcnZlcnMiLCJfYXBwZW5kQnV0dG9uIiwiTGF5ZXIiLCJyb290SWQiLCJWMkNfUHVibGljU2VydmVycyIsInJvb3QiLCJfcm9vdCIsImluamVjdFJvb3QiLCJjbGFzc05hbWVMYXllcnMiLCJsYXllcnMiLCJidXR0b24iLCJidG4iLCJjaXJjbGVCdXR0b25NYXNrIiwiY2xhc3NOYW1ldHV0b3JpYWxDb250YWluZXIiLCJkb3dubG9hZFByb2dyZXNzIiwidHV0b3JpYWxDb250YWluZXIiLCJhZGRCdXR0b24iLCJndWlsZFBhdGNoIiwiR3VpbGRMaXN0Iiwid2VicGFja01vZHVsZXMiLCJHdWlsZExpc3RPbGQiLCJyZW1vdmVCdXR0b24iLCJCRFNpZGViYXJIZWFkZXIiLCJQdXJlQ29tcG9uZW50Iiwic2lkZWJhckNvbXBvbmVudHMiLCJIZWFkZXIiLCJJdGVtIiwiY2hhbmdlbG9nQnV0dG9uIiwiSGlzdG9yeSIsInJlbmRlcmVkIiwiaXNDbGVhcmluZ0NhY2hlIiwiVjJfU2V0dGluZ3NQYW5lbCIsInVwZGF0ZVNldHRpbmdzIiwic2lkZWJhciIsIlYyX1NldHRpbmdzUGFuZWxfU2lkZWJhciIsInJlZ2lzdGVyQ29tcG9uZW50cyIsInJlZ2lzdGVyIiwibWFrZUNvbXBvbmVudCIsImxpZ2h0Y29yZENvbXBvbmVudCIsIlByZXNlbmNlQ29tcG9uZW50IiwiQWNjb3VudEluZm9zQ29tcG9uZW50IiwiQXBpUHJldmlld0NvbXBvbmVudCIsImNvcmVDb21wb25lbnQiLCJjdXN0b21Dc3NDb21wb25lbnQiLCJyZW5kZXJBZGRvblBhbmUiLCJjb3JlU2V0dGluZ3MiLCJnZXRTZXR0aW5ncyIsImNhdGVnb3JpZXMiLCJTZXQiLCJzZWN0aW9ucyIsImxpZ2h0Y29yZFNldHRpbmdzIiwiUHJlc2VuY2VTZXR0aW5ncyIsImNoZWNrZWQiLCJwdWJsaWNTZXJ2ZXJzTW9kdWxlIiwidm9pY2VNb2RlIiwidGZIb3VyIiwiY29sb3JlZFRleHQiLCJkTW9kZSIsInJlYWN0RGV2VG9vbHMiLCJTZXR0aW5ncyIsImRldk1vZGUiLCJmb3JjZVVwZGF0ZSIsImNhbGxSaW5naW5nQmVhdCIsInNldHRpbmdzU3RvcmUiLCJzaG93Q3VycmVudEdhbWUiLCJ1cGRhdGVSZW1vdGVTZXR0aW5ncyIsImdldEN1cnJlbnRXaW5kb3ciLCJzZXRBbHdheXNPblRvcCIsIkFudGlBZERNIiwiYmx1clByaXZhdGUiLCJkaXNhYmxlVHlwaW5nIiwiYXBwU2V0dGluZ3MiLCJyZWxhdW5jaCIsImV4aXQiLCJjb3JlIiwiTm90aWZpY2F0aW9uc1VzZVNoaW0iLCJTZWN0aW9uZWRTZXR0aW5nc1BhbmVsIiwiTWFyZ2luVG9wIiwiaXNDaGVja2VkIiwiU3dpdGNoIiwiQ29tcG9uZW50cyIsImlucHV0cyIsIkJ1dHRvbiIsImxvb2siLCJob3ZlckNvbG9yIiwiaXBjIiwic2VuZCIsImFyZ3YiLCJxdWl0Iiwic2Vzc2lvbiIsImNsZWFyQ2FjaGUiLCJWMkNfUHJlc2VuY2VTZXR0aW5ncyIsIlYyQ19BY2NvdW50SW5mb3MiLCJBcGlQcmV2aWV3IiwiQ3NzRWRpdG9yIiwiQ29udGVudExpc3QiLCJDb21wb25lbnQiLCJvcmlnaW5hbFJlbmRlciIsImVudW1lcmFibGUiLCJDYXJkTGlzdCIsIlNldHRpbmdDb21wb25lbnQiLCJwYW5lbHMiLCJwYW5lbCIsImdldENvbXBvbmVudCIsIkxDaXRlbXMiLCJMQ0Rldkl0ZW1zIiwiVGhlbWVNb2R1bGUiLCJsb2FkVGhlbWVEYXRhIiwidGhlbWUiLCJ1bmVzY2FwZSIsInNhdmVUaGVtZURhdGEiLCJlbmFibGVUaGVtZSIsImRpc2FibGVUaGVtZSIsInRvZ2dsZVRoZW1lIiwiYmR0aGVtZSIsInVwZGF0ZVRoZW1lTGlzdCIsIl93aW5kb3dDb25maWdGaWxlIiwidHJhbnNwYXJlbnQiLCJmcmFtZSIsImNoYXJDb2RlQXQiLCJnZXRUZXh0QXJlYSIsImNoYW5uZWxUZXh0QXJlYSIsInRpdGxlV3JhcHBlciIsImluc2VydFRleHQiLCJ0ZXh0YXJlYSIsImZvY3VzIiwic2VsZWN0aW9uU3RhcnQiLCJzZWxlY3Rpb25FbmQiLCJleGVjQ29tbWFuZCIsIm1vZHVsZU5hbWUiLCJncm91cENvbGxhcHNlZCIsImdyb3VwRW5kIiwiZm9ybWF0U3RyaW5nIiwic3RyaW5nIiwicmVwbGFjZW1lbnQiLCJlc2NhcGUiLCJwYXJhbXMiLCJpbnN0ZWFkIiwic2lsZW50IiwiZm9yY2UiLCJvcmlnTWV0aG9kIiwiY2FuY2VsUGF0Y2giLCJvcmlnaW5hbE1ldGhvZCIsImNhbGxPcmlnaW5hbE1ldGhvZCIsInRlbXBSZXQiLCJfX21vbmtleVBhdGNoZWQiLCJkaXNjb25uZWN0IiwiaGFzTm90aWNlIiwiZm9ybSIsImJvdHRvbSIsInRvYXN0V3JhcHBlciIsImljb24iLCJ0aW1lb3V0IiwidG9hc3RFbGVtIiwiaW5uZXJUZXh0IiwibW9kYWxNb2R1bGUiLCJoaWRlT25GdWxsc2NyZWVuIiwiaGVhZGVyTW9kdWxlIiwiaGVhZGVyIiwiZm9vdGVyMk1vZHVsZSIsImZvY3VzTG9jayIsImJhY2tkcm9wIiwiYmFja2Ryb3BXaXRoTGF5ZXIiLCJjbG9zaW5nTGlzdGVuZXJzIiwicGx1Z2luRXJyb3JzIiwidGhlbWVFcnJvcnMiLCJnZW5lcmF0ZVRhYiIsInRhYnMiLCJNb2RhbFN0YWNrIiwiQ2hhbmdlbG9nQ2xhc3NlcyIsIlRleHRFbGVtZW50IiwiRmxleENoaWxkIiwiVGl0bGVzIiwiQ2hhbmdlbG9nIiwiZGVmYXVsdFByb3BzIiwic2VsZWN0YWJsZSIsIk1hcmtkb3duUGFyc2VyIiwiaW1hZ2UiLCJzdWJ0aXRsZSIsImNlIiwiY2hhbmdlbG9nSXRlbXMiLCJlbnRyeSIsIm1hcmdpbiIsInJlbmRlckhlYWRlciIsIkNoaWxkIiwiZ3JvdyIsInNocmluayIsInRhZyIsIlRhZ3MiLCJINCIsIlNpemVzIiwiU01BTEwiLCJDb2xvcnMiLCJTVEFOREFSRCIsImRhdGUiLCJyZW5kZXJGb290ZXIiLCJBbmNob3JDbGFzc2VzIiwiYW5jaG9yIiwiYW5jaG9yVW5kZXJsaW5lT25Ib3ZlciIsImpvaW5TdXBwb3J0U2VydmVyIiwiam9pbkJEMiIsInN1cHBvcnRMaW5rIiwiZGVmYXVsdEZvb3RlciIsIm9uU2Nyb2xsIiwiTW9kYWxBY3Rpb25zIiwiTWFya2Rvd24iLCJDb25maXJtYXRpb25Nb2RhbCIsImVtcHR5RnVuY3Rpb24iLCJvcGVuTW9kYWwiLCJyZWQiLCJtb2RhbEtleSIsIlYyIiwiZWRpdG9yRGV0YWNoZWQiLCJyZXEiLCJ3ZWJwYWNrSnNvbnAiLCJfX2V4dHJhX2lkX18iLCJzaG91bGRQcm90ZWN0IiwidGhlTW9kdWxlIiwiY2xlYXIiLCJzb3J0IiwiZ2V0VG9rZW4iLCJnZXRFbWFpbCIsInNob3dUb2tlbiIsInByb3RlY3QiLCJpc0RlZmF1bHQiLCJtb2QiLCJwcm94eSIsImZ1bmMiLCJfX3Byb3RvX18iLCJwcm9wTmFtZXMiLCJwcm90b05hbWVzIiwicHJvdG9Qcm9wIiwiaW50ZXJuYWwiLCJqb2luQkQxIiwiSW52aXRlQWN0aW9ucyIsImFjY2VwdEludml0ZUFuZFRyYW5zaXRpb25Ub0ludml0ZUNoYW5uZWwiLCJsZWF2ZUJEMSIsIkd1aWxkQWN0aW9ucyIsImxlYXZlR3VpbGQiLCJsZWF2ZUJEMiIsImpvaW5MQyIsImxlYXZlTEMiLCJyZWFjdENvbXBvbmVudCIsImFuY2hvckNsYXNzZXMiLCJzbGF0ZUVkaXRvckNsYXNzZXMiLCJtZXNzYWdlQ2xhc3NlcyIsInVucmVhZE1lbnRpb25zQmFyIiwiZ3VpbGRzRXJyb3IiLCJNZXNzYWdlQ29udGVudENvbXBvbmVudCIsIlRvb2x0aXBXcmFwcGVyIiwiVG9vbHRpcHMiLCJoaWRlIiwic2hvdyIsInN1Ym1pdCIsImFjdGl2YXRlUmFnaW5nRGVtb24iLCJkaXNtaXNzIiwiS2V5R2VuZXJhdG9yIiwiTGF5ZXJTdGFjayIsIlVzZXJTdG9yZSIsIkNoYW5uZWxTdG9yZSIsIkNoYW5uZWxBY3Rpb25zIiwiUHJpdmF0ZUNoYW5uZWxBY3Rpb25zIiwib3BlbkRNIiwidXNlcklkIiwic2VsZklkIiwicHJpdmF0ZUNoYW5uZWxJZCIsImdldERNRnJvbVVzZXJJZCIsInNlbGVjdFByaXZhdGVDaGFubmVsIiwib3BlblByaXZhdGVDaGFubmVsIiwicGFyc2VTZXR0aW5ncyIsIlZvaWNlTW9kZSIsIm1hcmdpbk1vZHVsZTIiLCJkZWZhdWx0TWFyZ2luaDUiLCJjb2xvck1vZHVsZSIsImNvbG9yU3RhbmRhcmQiLCJzaXplTW9kdWxlIiwic2Nyb2xsYmFyTW9kdWxlMSIsInNjcm9sbGJhckdob3N0SGFpcmxpbmUiLCJHdWlsZE1vZHVsZSIsImdldFJlbGF0aW9uc2hpcHMiLCJzZXNzaW9uTW9kdWxlIiwiZ2V0U2Vzc2lvbnMiLCJzaXplMTQiLCJoNSIsImdldFByb2ZpbGVWYWx1ZSIsImdldFN0YXRpc3RpY3MiLCJnZXRTZXNzaW9uVmFsdWUiLCJtYXJnaW5Cb3R0b20yMCIsInNlc3Npb25zUmF3Iiwic2Vzc2lvbnMiLCJzZXNzaW9uSWQiLCJjbGllbnRJbmZvIiwib3MiLCJjbGllbnQiLCJhY3Rpdml0aWVzIiwicmVwZWF0IiwiY3JlYXRlZEF0IiwiYXZhdGFyVVJMIiwiYXZhdGFyIiwiZ2V0QXZhdGFyVVJMIiwiZ2V0RGF0ZSIsImdldE1vbnRoIiwiZ2V0RnVsbFllYXIiLCJnZXRIb3VycyIsImdldE1pbnV0ZXMiLCJnZXRTZWNvbmRzIiwiZmxhZ3MiLCJoYXNQcmVtaXVtU3Vic2NyaXB0aW9uIiwiZW1haWwiLCJtZmFFbmFibGVkIiwibW9iaWxlIiwicGhvbmUiLCJ2ZXJpZmllZCIsInJlbGF0aW9ucyIsImZyaWVuZHMiLCJpc0ZyaWVuZCIsImlzQmxvY2tlZCIsImhpZ2h0bGlnaHRKUyIsImhpZ2hsaWdodCIsIm1lc3NhZ2VNb2R1bGUxIiwibWVzc2FnZU1vZHVsZTIiLCJDb2RlQ29udGVudCIsIl9faHRtbCIsImxhbmd1YWdlIiwibWFyZ2luQm90dG9tOCIsImZvcm1Nb2R1bGUiLCJzdGF0ZXMiLCJGb3JtU2VjdGlvbiIsImFsbENvbXBvbmVudHMiLCJjb21wIiwiY29tcE5hbWUiLCJjb21wUGF0aCIsInJlbmRlcnMiLCJDb21wb25lbnRQcmV2aWV3IiwidGFiIiwiQWxsUHJldmlld3MiLCJnZXRQcm9wcyIsInJlbmRlclByZXZpZXciLCJiYWNrZ3JvdW5kQ29sb3IiLCJwYWRkaW5nIiwiYm9yZGVyUmFkaXVzIiwicmVuZGVyQ29kZSIsImdlbmVyYXRlQ29kZSIsImdldFN0ckZvclByb3AiLCJsYW5nIiwiU3RyaW5nIiwiJCR0eXBlb2YiLCJTeW1ib2wiLCJmb3IiLCJjb21wQ2F0ZWdvcnkiLCJwcm9wU3RyaW5ncyIsImNoaWxkcmVuUHJvcCIsInN0ciIsIm9wZW5UYWciLCJjbG9zZVRhZyIsInZpc2libGVLZXkiLCJwcm9wT2JqZWN0IiwiaXNMYXN0IiwiaXNGaXJzdCIsImNoaWxkcmVuRGF0YSIsImhlbHAiLCJzdWNjZXNzIiwic2V0U3RhdGUiLCJtYXJnaW5Cb3R0b20iLCJWMkNfUGx1Z2luQ2FyZCIsInNob3dTZXR0aW5ncyIsInNldEluaXRpYWxTdGF0ZSIsImhhc1NldHRpbmdzIiwiYWRkb24iLCJnZXRTZXR0aW5nc1BhbmVsIiwicmVsb2FkcyIsInRydXN0ZWQiLCJjbG9zZVNldHRpbmdzIiwicGFuZWxSZWYiLCJzZXR0aW5nc09wZW4iLCJjb21wb25lbnREaWRVcGRhdGUiLCJyZWZzIiwic2V0dGluZ3NwYW5lbCIsInNldEltbWVkaWF0ZSIsImlzSGlkZGVuIiwiY1RvcCIsInNjcm9sbFRvcCIsImNCb3R0b20iLCJlVG9wIiwib2Zmc2V0VG9wIiwiZUJvdHRvbSIsImNhcmROb2RlIiwidGhpc05vZGVPZmZzZXQiLCJjb250YWluZXJPZmZzZXQiLCJlbmRQb2ludCIsImdldFN0cmluZyIsInNldHRpbmdzQ29tcG9uZW50IiwicmVmIiwiWFN2ZyIsImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiwiYnVpbGRUaXRsZSIsIm5hbWVJbmRleCIsInZlcnNpb25JbmRleCIsImF1dGhvckluZGV4IiwicG9wTGF5ZXIiLCJtYWtlTGluayIsIm1ha2VCdXR0b24iLCJhY3Rpb24iLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInVubW91bnRlZCIsImxpbmtzIiwiaW52aXRlIiwidGVzdGVyIiwiZG9uYXRlIiwicGF0cmVvbiIsImF1dGhvcklkIiwiYXV0aG9yTGluayIsImlzU2Nhbm5pbmciLCJUb29sdGlwIiwiYXNjZW5kaW5nIiwiaXNQbHVnaW5zIiwicmV2ZXJzZSIsIm9uQWRkb25DaGFuZ2VzIiwiY29tcG9uZW50RGlkTW91bnQiLCJiZEV2ZW50cyIsIm9wZW5Gb2xkZXIiLCJvcGVuUGF0aCIsInNob3VsZERlbGV0ZSIsImNvbmZpcm1EZWxldGUiLCJzb3J0T3B0aW9ucyIsImRpcmVjdGlvbnMiLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsImdldEFkZG9ucyIsInNvcnRlZEFkZG9ucyIsImIiLCJjYXAiLCJmaXJzdCIsInNlY29uZCIsImxvY2FsZUNvbXBhcmUiLCJyZW5kZXJDaGVja1VwZGF0ZXMiLCJaZXJlc1BsdWdpbkxpYnJhcnkiLCJQbHVnaW5VcGRhdGVzIiwiY2hlY2tBbGwiLCJ0b29sdGlwSXNTaG93aW5nIiwidG9vbHRpcCIsIm1hcmdpbkxlZnQiLCJjaGVja1VwZGF0ZUJ1dHRvbiIsIkVtdWxhdGVkVG9vbHRpcCIsImF0dGFjaEV2ZW50cyIsInJlZnJlc2hJY29uIiwiYWRkb25DYXJkcyIsImZpbGxSdWxlIiwiY2xpcFJ1bGUiLCJzdHJva2VMaW5lY2FwIiwic3Ryb2tlTGluZWpvaW4iLCJvcGFjaXR5IiwiVjJDX0NoZWNrYm94IiwiY2hlY2tib3hFbGVtZW50IiwiY2hlY2tib3giLCJjaGVja2JveElubmVyIiwiU2VsZWN0IiwiZHJvcGRvd24iLCJjcmVhdGVSZWYiLCJzaG93TWVudSIsImhpZGVNZW51Iiwib3B0IiwiaXNPcGVuIiwiU2VhcmNoIiwib25LZXlEb3duIiwicGxhY2Vob2xkZXIiLCJzd2l0Y2giLCJWMkNfQ29udGVudENvbHVtbiIsImNvbnRlbnRNb2R1bGUiLCJjb250ZW50Q29sdW1uIiwiY29udGVudENvbHVtbkRlZmF1bHQiLCJWMkNfQ3NzRWRpdG9yIiwibGluZXMiLCJkZXRhY2hlZEVkaXRvciIsIlYyQ19Dc3NFZGl0b3JEZXRhY2hlZCIsInVwZGF0ZUNzcyIsInNhdmVDc3MiLCJkZXRhY2giLCJkZXRhY2hlZCIsImVkaXRvciIsImFjZSIsInNldFRoZW1lIiwic2V0TW9kZSIsInNldFNob3dQcmludE1hcmdpbiIsInNldEZvbnRTaXplIiwiZGVzdHJveSIsInByZXZQcm9wcyIsInByZXZTdGF0ZSIsInVubW91bnRDb21wb25lbnRBdE5vZGUiLCJkZXRhY2hlZFJvb3QiLCJjb2RlTWlycm9yIiwibGluZU51bWJlcnMiLCJtb2RlIiwiaW5kZW50VW5pdCIsInNjcm9sbGJhclN0eWxlIiwiX2Njc3MiLCJjY3NzIiwidXBkYXRlTGluZUNvdW50IiwibGluZUNvdW50IiwiU2V0dGluZ3NUaXRsZSIsIkNoZWNrYm94IiwiYm9yZGVyUmlnaHQiLCJib3JkZXJMZWZ0IiwiZm9udFNpemUiLCJhcmciLCJnZXRWYWx1ZSIsImRyb290IiwiaW5qZWN0RGV0YWNoZWRSb290IiwiQkRFcnJvckJvdW5kYXJ5IiwiaGFzRXJyb3IiLCJjb21wb25lbnREaWRDYXRjaCIsIkRlbGV0ZSIsIkRvd25BcnJvdyIsIkVkaXQiLCJtYXJnaW5Nb2R1bGUiLCJtYXJnaW5Ub3A2MCIsIlYyQ19QcmVzZW5jZVNldHRpbmdzTW9kdWxlcyIsInByZXZpZXciLCJpc2ZldGNoaW5nIiwiYXNzZXRDb21wb25lbnRzIiwidXBkYXRlV2hlbkZldGNoZWQiLCJkZWZhdWx0U2V0dGluZyIsIlJQQ1Byb3BzIiwiYXNzZXQiLCJ1cGRhdGVQcmV2aWV3Iiwib3B0aW9uc0NvbXBvbmVudHMiLCJvaGdvZG9oZnVjayIsIl9vcHRpb25zQ29tcG9uZW50cyIsImFycmF5IiwiaW5wdXRUZXh0TW9kdWxlcyIsIklucHV0VGV4dCIsInJlbW92ZUtleWJpbmQiLCJfaG9yaXpvbnRhbCIsImlucHV0TWluaSIsInNpemUxNiIsInNpemUyMCIsImlucHV0IiwibGFzdEVkaXRlZCIsImlzVGltaW5nIiwicm93TW9kdWxlIiwiZmxleE1vZHVsZSIsImlucHV0TW9kdWxlIiwic2l6ZU1vZHVsZTIiLCJyb3ciLCJmbGV4Q2hpbGQiLCJJbnB1dE51bWJlck1vZHVsZXMiLCJJbnB1dE51bWJlciIsImNvbG9yVHJhbnNwYXJlbnQiLCJzZXRWYWx1ZSIsImNsaXBib2FyZCIsIklucHV0Q2hvaWNlTW9kdWxlcyIsIklucHV0Q2hvaWNlIiwiRGl2aWRlck1vZHVsZXMiLCJEaXZpZGVyIiwiZGl2aWRlciIsImRpdmlkZXJEZWZhdWx0IiwiRGlzY29yZEJ1dHRvbiIsIlJwY1ByZXZpZXciLCJhY3RpdmUiLCJjaGFuZ2VUYWIiLCJhbmNpZW50VGFiIiwic2V0QWN0aXZlIiwiZmxleCIsInJwYyIsImlzQWN0aXZlIiwiUHJvZmlsZSIsIlBvcG91dCIsIlRhYiIsImVtcHR5Q2xhc3NlcyIsIlByZXNlbmNlRXJyb3JDYXRjaGVyIiwiZXJySW5mbyIsImVtcHR5U3RhdGVJbWFnZSIsImVtcHR5U3RhdGUiLCJlbXB0eVN0YXRlSGVhZGVyIiwiZW1wdHlTdGF0ZVN1YnRleHQiLCJwb3BvdXRNb2R1bGVzIiwiVXNlclBvcG91dENvbXBvbmVudCIsIlBvcG91dFByb3BzIiwiVXNlclBvcG91dCIsInJlbmRlcjEiLCJjaGFubmVsSWQiLCJkaXNhYmxlVXNlclByb2ZpbGVMaW5rIiwicmVuZGVyMiIsInJlbmRlcjMiLCJwb3BvdXQiLCJleGNsdWRlUHJvcGVydGllcyIsInByb2ZpbGVNb2R1bGVzIiwiVXNlclByb2ZpbGVDb21wb25lbnQiLCJQcm9maWxlUHJvcHMiLCJjb25uZWN0ZWRQcm9maWxlU3RvcmUiLCJVc2VyUHJvZmlsZSIsInJlbmRlcjQiLCJwcm9maWxlIiwiVjJDX0xheWVyIiwia2V5dXBMaXN0ZW5lciIsInRyYW5zZm9ybSIsImNvbXBvbmVudFdpbGxNb3VudCIsImNoYW5nZUNhdGVnb3J5Iiwic2VhcmNoS2V5RG93biIsImNoZWNrQ29ubmVjdGlvbiIsImNvbm5lY3QiLCJHdWlsZFN0b3JlIiwiQXZhdGFyRGVmYXVsdHMiLCJTb3J0ZWRHdWlsZFN0b3JlIiwic2VsZWN0ZWRDYXRlZ29yeSIsImxvYWRpbmciLCJzZXJ2ZXJzIiwiY29ubmVjdGlvbiIsImZldGNoIiwic2VydmVyIiwiam9pbmVkIiwiZW5kIiwidGVybSIsImNhdGVnb3J5QnV0dG9ucyIsInRvdGFsIiwic2J2IiwiY29udGVudFNjcm9sbGVyIiwic2VydmVyQ2FyZCIsInBpbm5lZCIsImFjY2VwdEludml0ZSIsImludml0ZV9jb2RlIiwiam9pbkVuZFBvaW50IiwiaWRlbnRpZmllciIsImNyZWRlbnRpYWxzIiwid2luZG93T3B0aW9ucyIsInJvdW5kIiwic2NyZWVuWCIsInNjcmVlblkiLCJqb2luV2luZG93IiwiQnJvd3NlcldpbmRvdyIsIndlYkNvbnRlbnRzIiwibG9hZFVSTCIsInJlc2l6YWJsZSIsIm1heGltaXphYmxlIiwibWluaW1pemFibGUiLCJhbHdheXNPblRvcCIsImNlbnRlciIsIndlYlByZWZlcmVuY2VzIiwibm9kZUludGVncmF0aW9uIiwiYmRTZXJ2ZXIiLCJvbmxpbmUiLCJtZW1iZXJzIiwiaWNvblVybCIsIm5hdGl2ZWpvaW4iLCJzZXJ2ZXIyIiwiZ3VpbGRMaXN0IiwiZ2V0RmxhdHRlbmVkR3VpbGRJZHMiLCJkZWZhdWx0TGlzdCIsIkRFRkFVTFRfQVZBVEFSUyIsIlNlcnZlckNhcmQiLCJmYWxsYmFjayIsImZsb29yIiwiY29ubmVjdEVuZFBvaW50IiwicmVzcG9uc2UiLCJTaWRlYmFyVmlldyIsInRvb2xzIiwiVG9vbHMiLCJUYWJCYXJTZXBhcmF0b3IiLCJzZWFyY2hJbnB1dCIsIlRhYkJhckhlYWRlciIsIlRhYkJhckl0ZW0iLCJtYXhMZW5ndGgiLCJzZWFyY2hpbnB1dCIsIm5vdENvbm5lY3RlZCIsImNvbHVtbk1vZHVsZSIsIm1pbkhlaWdodCIsImxpbmVIZWlnaHQiLCJWMkNfU2VydmVyQ2FyZCIsImltYWdlRXJyb3IiLCJjYXJkTW9kdWxlIiwiY2FyZCIsImNhcmRQcmltYXJ5IiwiX2hvcml6b250YWxSZXZlcnNlIiwid3JhcE1vZHVsZSIsIm5vV3JhcCIsInN0cmVhbWVyTW9kZUVuYWJsZWQiLCJvbkVycm9yIiwiaGFuZGxlRXJyb3IiLCJkcmFnZ2FibGUiLCJob3Jpem9udGFsIiwiVjJDX1NpZGViYXJWaWV3IiwiU2Nyb2xsZXIiLCJmYWRlIiwiZGFyayIsIlYyQ19SZWxvYWRJY29uIiwieG1sbnMiLCJWMkNfU2Nyb2xsZXIiLCJzY3JvbGxlck1vZHVsZTEiLCJzY3JvbGxlckhvcml6b250YWwiLCJzY3JvbGxlck1vZHVsZTIiLCJzaWRlYmFyUmVnaW9uU2Nyb2xsZXIiLCJ3cmFwcGVyQ2xhc3MiLCJzY3JvbGxlckZhZGUiLCJzY3JvbGxlckNsYXNzIiwiY29udGVudFJlZ2lvblNjcm9sbGVyIiwiY29udGVudFJlZ2lvblNjcm9sbGVyV3JhcCIsInRoZW1lR2hvc3QiLCJzY3JvbGxlclRyYWNrIiwiVjJDX1NlY3Rpb25lZFNldHRpbmdzUGFuZWwiLCJTZXR0aW5nc0dyb3VwIiwiVjJDX1NldHRpbmdzR3JvdXAiLCJidXR0b25Db21wb25lbnQiLCJWMkNfU2V0dGluZ3NUaXRsZSIsImNsYXNzbmFtZXMiLCJnZXRDbGFzc05hbWUiLCJTd2l0Y2hJdGVtIiwiYmV0YSIsInVzZXJTZXR0aW5nc1ZvaWNlIiwiVjJDX1RhYkJhckhlYWRlciIsIlYyQ19UYWJCYXJJdGVtIiwiVjJDX1RhYkJhclNlcGFyYXRvciIsIlYyQ19Ub29scyIsInRvb2xzTW9kdWxlIiwidG9vbHNDb250YWluZXIiLCJjb250YWluZXJNb2R1bGUiLCJjbG9zZUJ1dHRvbiIsImNsb3NlQnV0dG9uQm9sZCIsImtleWJpbmQiLCJrZXliaW5kQm9sZCIsIlRvb2x0aXBDbGFzc2VzIiwiZ2V0VG9vbHRpcENsYXNzZXMiLCJUb29sdGlwTGF5ZXJzIiwiZ2V0VG9vbHRpcExheWVycyIsImdldENsYXNzIiwic2lkZU9yQ29sb3IiLCJ1cHBlckNhc2UiLCJ0b29sdGlwQ2xhc3MiLCJjbGFzc0V4aXN0cyIsInRvUHgiLCJwcmV2ZW50RmxpcCIsInRvb2x0aXBFbGVtZW50IiwibGFiZWxFbGVtZW50IiwidG9vbHRpcENvbnRlbnQiLCJwb2ludGVyRWxlbWVudCIsInRvb2x0aXBQb2ludGVyIiwicG9wb3V0cyIsImNhblNob3dBYm92ZSIsImNhblNob3dCZWxvdyIsImNhblNob3dMZWZ0IiwiY2FuU2hvd1JpZ2h0IiwiX2NsYXNzTmFtZSIsInNob3dBYm92ZSIsInNob3dCZWxvdyIsInNob3dMZWZ0Iiwic2hvd1JpZ2h0IiwiY2VudGVySG9yaXpvbnRhbGx5IiwiY2VudGVyVmVydGljYWxseSIsIm5vZGVjZW50ZXIiLCJmaW5kRE9NTm9kZSIsIlYyQ19YU3ZnIl0sIm1hcHBpbmdzIjoiOztRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFD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RTtBQUFsRCxLQUZKLEVBR0l6OEMsbURBQUksQ0FBQzBrQixLQUFMLENBQVd4akIsYUFBWCxDQUF5QixNQUF6QixFQUFpQztBQUFDbTVCLE9BQUMsRUFBRTtBQUFKLEtBQWpDLENBSEosRUFJSXI2QixtREFBSSxDQUFDMGtCLEtBQUwsQ0FBV3hqQixhQUFYLENBQXlCLE1BQXpCLEVBQWlDO0FBQUNDLGVBQVMsRUFBRSxNQUFaO0FBQW9CeThCLFVBQUksRUFBRSxTQUExQjtBQUFxQ3ZELE9BQUMsRUFBRTtBQUF4QyxLQUFqQyxDQUpKLENBSEcsQ0FBUDtBQVVIOztBQWhCcUQsQzs7Ozs7Ozs7Ozs7QUNGMUQsbUM7Ozs7Ozs7Ozs7O0FDQUEscUM7Ozs7Ozs7Ozs7O0FDQUEsbUM7Ozs7Ozs7Ozs7O0FDQUEsK0I7Ozs7Ozs7Ozs7O0FDQUEsbUM7Ozs7Ozs7Ozs7O0FDQUEsdUM7Ozs7Ozs7Ozs7O0FDQUEsaUMiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy9pbmRleC5qc1wiKTtcbiIsImV4cG9ydCBjb25zdCBtaW5pbXVtRGlzY29yZFZlcnNpb24gPSBcIjAuMC4zMDZcIjtcclxuZXhwb3J0IGNvbnN0IGN1cnJlbnREaXNjb3JkVmVyc2lvbiA9ICh3aW5kb3cuRGlzY29yZE5hdGl2ZSAmJiB3aW5kb3cuRGlzY29yZE5hdGl2ZS5yZW1vdGVBcHAgJiYgd2luZG93LkRpc2NvcmROYXRpdmUucmVtb3RlQXBwLmdldFZlcnNpb24gJiYgd2luZG93LkRpc2NvcmROYXRpdmUucmVtb3RlQXBwLmdldFZlcnNpb24oKSkgfHwgXCIwLjAuMzA2XCI7XHJcbmV4cG9ydCBjb25zdCBtaW5TdXBwb3J0ZWRWZXJzaW9uID0gXCIwLjMuMFwiO1xyXG5leHBvcnQgY29uc3QgYmJkVmVyc2lvbiA9IFwiMC4zLjVcIjtcclxuZXhwb3J0IGNvbnN0IGJiZENoYW5nZWxvZyA9IHtcclxuICAgIGRlc2NyaXB0aW9uOiBcIkJpZyB0aGluZ3MgYXJlIGNvbWluZy5cIixcclxuICAgIGNoYW5nZXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRpdGxlOiBcIkJ1ZyBGaXhlc1wiLFxyXG4gICAgICAgICAgICB0eXBlOiBcImZpeGVkXCIsXHJcbiAgICAgICAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgICAgICAgICBcIlNvbWUgZml4ZXMgcmVsYXRlZCB0byBzaG93aW5nIG1vZGFscyBpbiB0aGUgYEJkQXBpYC5cIixcclxuICAgICAgICAgICAgICAgIFwiRml4ZWQgdGhlIG9wZW4gZm9sZGVyIGJ1dHRvbnMgZm9yIHBsdWdpbnMgYW5kIHRoZW1lc1wiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICBdXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgc2V0dGluZ3MgPSB7XHJcbiAgICBcIkN1c3RvbSBjc3MgbGl2ZSB1cGRhdGVcIjogICAgIHtpZDogXCJiZGEtY3NzLTBcIiwgaW5mbzogXCJcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiB0cnVlLCAgY2F0OiBcImNvcmVcIn0sXHJcbiAgICBcIkN1c3RvbSBjc3MgYXV0byB1ZHBhdGVcIjogICAgIHtpZDogXCJiZGEtY3NzLTFcIiwgaW5mbzogXCJcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiB0cnVlLCAgY2F0OiBcImNvcmVcIn0sXHJcbiAgICBcIkJldHRlckRpc2NvcmQgQmx1ZVwiOiAgICAgICAgIHtpZDogXCJiZGEtZ3MtYlwiLCAgaW5mbzogXCJSZXBsYWNlIERpc2NvcmQgYmx1ZSB3aXRoIEJEIEJsdWVcIiwgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiBmYWxzZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCJ9LFxyXG5cclxuICAgIC8qIENvcmUgKi9cclxuICAgIC8qID09PT09PSAqL1xyXG4gICAgXCJQdWJsaWMgU2VydmVyc1wiOiAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTFcIiwgIGluZm86IFwiRGlzcGxheSBwdWJsaWMgc2VydmVycyBidXR0b25cIiwgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIk1pbmltYWwgTW9kZVwiOiAgICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtMlwiLCAgaW5mbzogXCJIaWRlIGVsZW1lbnRzIGFuZCByZWR1Y2UgdGhlIHNpemUgb2YgZWxlbWVudHMuXCIsICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiVm9pY2UgTW9kZVwiOiAgICAgICAgICAgICAgICAge2lkOiBcImJkYS1ncy00XCIsICBpbmZvOiBcIk9ubHkgc2hvdyB2b2ljZSBjaGF0XCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJIaWRlIENoYW5uZWxzXCI6ICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTNcIiwgIGluZm86IFwiSGlkZSBjaGFubmVscyBpbiBtaW5pbWFsIG1vZGVcIiwgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIkRhcmsgTW9kZVwiOiAgICAgICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtNVwiLCAgaW5mbzogXCJNYWtlIGNlcnRhaW4gZWxlbWVudHMgZGFyayBieSBkZWZhdWx0KHdpcClcIiwgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiVm9pY2UgRGlzY29ubmVjdFwiOiAgICAgICAgICAge2lkOiBcImJkYS1kYy0wXCIsICBpbmZvOiBcIkRpc2Nvbm5lY3QgZnJvbSB2b2ljZSBzZXJ2ZXIgd2hlbiBjbG9zaW5nIERpc2NvcmRcIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCIyNCBIb3VyIFRpbWVzdGFtcHNcIjogICAgICAgICB7aWQ6IFwiYmRhLWdzLTZcIiwgIGluZm86IFwiUmVwbGFjZSAxMmhyIHRpbWVzdGFtcHMgd2l0aCBwcm9wZXIgb25lc1wiLCAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIkNvbG9yZWQgVGV4dFwiOiAgICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtN1wiLCAgaW5mbzogXCJNYWtlIHRleHQgY29sb3IgdGhlIHNhbWUgYXMgcm9sZSBjb2xvclwiLCAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiTm9ybWFsaXplIENsYXNzZXNcIjogICAgICAgICAge2lkOiBcImZvcmstcHMtNFwiLCBpbmZvOiBcIkFkZHMgc3RhYmxlIGNsYXNzZXMgdG8gZWxlbWVudHMgdG8gaGVscCB0aGVtZXMuIChlLmcuIGFkZHMgLmRhLWNoYW5uZWxzIHRvIC5jaGFubmVscy1JZTJsNkEpXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuXHJcbiAgICAvKiBDb250ZW50ICovXHJcbiAgICBcIkNvbnRlbnQgRXJyb3IgTW9kYWxcIjogICAgICAgIHtpZDogXCJmb3JrLXBzLTFcIiwgaW5mbzogXCJTaG93cyBhIG1vZGFsIHdpdGggcGx1Z2luL3RoZW1lIGVycm9yc1wiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxyXG4gICAgXCJTY2FuIFBsdWdpbnNcIjogICAgICAgICAgICAgICB7aWQ6IFwiZm9yay1wcy02XCIsIGluZm86IFwiU2NhbiBwbHVnaW5zIGZvciBhbnkgdGhyZWF0IHRoYXQgY2FuIGJlIGhpZGRlbiBpbnNpZGUuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcbiAgICBcIlNob3cgVG9hc3RzXCI6ICAgICAgICAgICAgICAgIHtpZDogXCJmb3JrLXBzLTJcIiwgaW5mbzogXCJTaG93cyBhIHNtYWxsIG5vdGlmaWNhdGlvbiBmb3IgaW1wb3J0YW50IGluZm9ybWF0aW9uXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcbiAgICBcIlNjcm9sbCBUbyBTZXR0aW5nc1wiOiAgICAgICAgIHtpZDogXCJmb3JrLXBzLTNcIiwgaW5mbzogXCJBdXRvLXNjcm9sbHMgdG8gYSBwbHVnaW4ncyBzZXR0aW5ncyB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZCAob25seSBpZiBvdXQgb2YgdmlldylcIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwifSxcclxuICAgIFwiQXV0b21hdGljIExvYWRpbmdcIjogICAgICAgICAge2lkOiBcImZvcmstcHMtNVwiLCBpbmZvOiBcIkF1dG9tYXRpY2FsbHkgbG9hZHMsIHJlbG9hZHMsIGFuZCB1bmxvYWRzIHBsdWdpbnMgYW5kIHRoZW1lc1wiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxyXG4gICAgXCJFbmFibGUgRWRpdCBCdXR0b25cIjogICAgICAgICB7aWQ6IFwiZm9yay1wcy03XCIsIGluZm86IFwiRW5hYmxlIGFuIEVkaXQgQnV0dG9uIG9uIHRoZSBwbHVnaW4gYW5kIHRoZW1lIHBhbmVsLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxyXG4gICAgXCJUaGVtZXMgaW4gUG9wb3V0IFdpbmRvd1wiOiAgICB7aWQ6IFwibGlnaHRjb3JkLTlcIiwgaW5mbzogXCJFbmFibGUgdGhlbWVzIGluIFBvcG91dCBXaW5kb3cuIChGb3IgZXhhbXBsZSwgd2hlbiBkZXRhY2hpbmcgc2NyZWVuc2hhcmUuKVwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCIsIGV4cGVyaW1lbnRhbDogdHJ1ZX0sXHJcblxyXG4gICAgLyogRGV2ZWxvcGVyICovXHJcbiAgICBcIkRldmVsb3BlciBNb2RlXCI6ICAgICAgICAgXHQgIHtpZDogXCJiZGEtZ3MtOFwiLCBpbmZvOiBcIkRldmVsb3BlciBNb2RlIFRvZ2dsZVwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiZGV2ZWxvcGVyIHNldHRpbmdzXCJ9LFxyXG4gICAgXCJDb3B5IFNlbGVjdG9yXCI6XHRcdFx0ICB7aWQ6IFwiZm9yay1kbS0xXCIsIGluZm86IFwiQWRkcyBhIFxcXCJDb3B5IFNlbGVjdG9yXFxcIiBvcHRpb24gdG8gY29udGV4dCBtZW51cyB3aGVuIGRldmVsb3BlciBtb2RlIGlzIGFjdGl2ZVwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiZGV2ZWxvcGVyIHNldHRpbmdzXCJ9LFxyXG4gICAgXCJSZWFjdCBEZXZUb29sc1wiOlx0XHRcdCAge2lkOiBcInJlYWN0RGV2VG9vbHNcIiwgaW5mbzogXCJBZGRzIHJlYWN0IGRldmVsb3BlciB0b29scyB0byB0aGUgZGV2dG9vbHMuIE11c3QgYmUgaW5zdGFsbGVkIGluIEdvb2dsZSBDaHJvbWUgb24geW91ciBwYy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IHRydWUsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImRldmVsb3BlciBzZXR0aW5nc1wifSxcclxuXHJcbiAgICAvKiogTGlnaHRjb3JkICovXHJcbiAgICBcIkRpc2FibGUgQmV0dGVyRGlzY29yZFwiOiAgICAgIHtpZDogXCJiZC1kaXNhYmxlXCIsICBpbmZvOiBcIkRpc2FibGUgQmV0dGVyZGlzY29yZCAocGx1Z2lucywgdGhlbWVzLCBldGMpIChOb3QgaW1wbGVtZW50ZWQpLlwiLCBpbXBsZW1lbnRlZDogZmFsc2UsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJCbHVyIFBlcnNvbmFsIEluZm9ybWF0aW9uXCI6ICB7aWQ6IFwibGlnaHRjb3JkLTZcIiwgaW5mbzogXCJCbHVyIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbnMgbGlrZSBlbWFpbCwgcGF5bWVudCBpbmZvcyBhbmQgbW9yZS5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJDYWxsaW5nIFJpbmcgQmVhdFwiOiAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTJcIiwgaW5mbzogXCJFbmFibGUgRGlzY29yZCdzIHNwZWNpYWwgY2FsbGluZyBiZWF0LlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcbiAgICBcIkRldmVsb3BlciBPcHRpb25zXCI6ICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtMVwiLCBpbmZvOiBcIkVuYWJsZSBEaXNjb3JkJ3MgJiBMaWdodGNvcmQncyBJbnRlcm5hbCBEZXZlbG9wZXIgT3B0aW9ucy4gVGhpcyBhbGxvdyB0aGUgXFxcIkV4cGVyaW1lbnRzXFxcIiB0YWIsIHRoZSBcXFwiRGV2ZWxvcGVyIE9wdGlvbnNcXFwiIHRhYiBhbmQgdGhlIFxcXCJMaWdodGNvcmQgQXBpXFxcIiBzZWN0aW9uLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcbiAgICBcIkFkIEJsb2NrXCI6ICAgICAgICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtNFwiLCBpbmZvOiBcIkJsb2NrIGFueSBCT1QgdGhhdCBkbXMgeW91IHdpdGggYW4gaW52aXRlIGxpbmsuIEV2ZW4gaW4gYW4gZW1iZWQuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiRW5hYmxlIExpZ2h0Y29yZCBTZXJ2ZXJzXCI6ICAge2lkOiBcImxpZ2h0Y29yZC01XCIsIGluZm86IFwiRW5hYmxlIExpZ2h0Y29yZCdzIHNlcnZlcnMuIERpc2FibGluZyB0aGlzIHdpbGwgZGlzYWJsZSBjdXN0b20gYmFkZ2VzLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcbiAgICBcIkRpc2FibGUgdHlwaW5nXCI6ICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtN1wiLCBpbmZvOiBcIkRvbid0IGxldCBvdGhlciBzZWUgeW91J3JlIHR5cGluZy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJMaWdodGNvcmQgVGFic1wiOiAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLThcIiwgaW5mbzogXCJBbGxvd3MgeW91IHRvIGxhdW5jaCBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgTGlnaHRjb3JkIGluIHRoZSBzYW1lIHdpbmRvdy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCIsIGV4cGVyaW1lbnRhbDogdHJ1ZX0sXHJcbiAgICBcIlVzZSBOb3RpZmljYXRpb24gU2hpbVwiOiAgICAgIHtpZDogXCJsaWdodGNvcmQtMTBcIiwgaW5mbzogXCJCYXNpY2FsbHkgZG9uJ3QgdXNlIFdpbmRvd3MncyBOb3RpZmljYXRpb25zLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBwcm9jZXNzLnBsYXRmb3JtICE9PSBcIndpbjMyXCIsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCIsIGV4cGVyaW1lbnRhbDogZmFsc2V9LFxyXG5cclxuICAgIC8qKiBMaWdodGNvcmQgV2luZG93ICovXHJcbiAgICBcIkFsd2F5cy1vbi1Ub3BcIjogICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtM1wiLCBpbmZvOiBcIkVuYWJsZSB0aGUgd2luZG93J3MgQWx3YXlzLW9uLVRvcCBtb2RlLCB3aGVyZSBMaWdodGNvcmQgc3RheXMgb24gdG9wIG9mIG90aGVyIGFwcGxpY2F0aW9ucy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiV2luZG93XCJ9LFxyXG4gICAgXCJObyBXaW5kb3cgQm91bmRzXCI6ICAgICAgICAgICB7aWQ6IFwibm9fd2luZG93X2JvdW5kXCIsIGluZm86IFwiRGlzYWJsZSBXaW5kb3cgQm91bmRzLiBDYW4gYmUgdXNlZnVsIGlmIHlvdSB1c2UgYSB3aW5kb3cgbWFuYWdlci5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogcHJvY2Vzcy5wbGF0Zm9ybSAhPT0gXCJsaW51eFwiLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIldpbmRvd1wifSxcclxuICAgIFwiRW5hYmxlIEdsYXNzdHJvblwiOiAgICAgICAgICAge2lkOiBcImVuYWJsZV9nbGFzc3Ryb25cIiwgaW5mbzogXCJFbmFibGUgR2xhc3N0cm9uLiBJZiB5b3UncmUgbm90IHVzaW5nIHRyYW5zcGFyZW50IHRoZW1lcywgdGhpcyBjYW4gcmVkdWNlIGxhZy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiV2luZG93XCJ9LFxyXG4gICAgXHJcbiAgICAvKiogUmljaFByZXNlbmNlICovXHJcbiAgICBcIkVuYWJsZVwiOiAgICAgICAgICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiLCBpbmZvOiBcIkVuYWJsZSBSaWNoUHJlc2VuY2UgYmVsb3cuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwic3RhdHVzXCJ9XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZGVmYXVsdENvb2tpZSA9IHtcclxuICAgIFwiYmRhLWdzLTFcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWdzLTJcIjogZmFsc2UsXHJcbiAgICBcImJkYS1ncy0zXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZ3MtNFwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWdzLTVcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWdzLTZcIjogZmFsc2UsXHJcbiAgICBcImJkYS1ncy03XCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZ3MtOFwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWVzLTBcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWVzLTFcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWVzLTJcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWVzLTRcIjogZmFsc2UsXHJcbiAgICBcImJkYS1lcy02XCI6IHRydWUsXHJcbiAgICBcImJkYS1lcy03XCI6IHRydWUsXHJcbiAgICBcImJkYS1ncy1iXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZXMtOFwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZGMtMFwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWNzcy0wXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtY3NzLTFcIjogZmFsc2UsXHJcbiAgICBcImJkYS1lcy05XCI6IHRydWUsXHJcbiAgICBcImZvcmstZG0tMVwiOiBmYWxzZSxcclxuICAgIFwiZm9yay1wcy0xXCI6IHRydWUsXHJcbiAgICBcImZvcmstcHMtMlwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXBzLTNcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1wcy00XCI6IHRydWUsXHJcbiAgICBcImZvcmstcHMtNVwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXBzLTZcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1wcy03XCI6IGZhbHNlLFxyXG4gICAgXCJmb3JrLWVzLTJcIjogZmFsc2UsXHJcbiAgICBcImZvcmstZXMtM1wiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXdwLTFcIjogZmFsc2UsXHJcbiAgICBcImZvcmstd3AtMlwiOiBmYWxzZSxcclxuICAgIFwiZm9yay1iZXRhXCI6IHRydWUsXHJcbiAgICBcInJlYWN0RGV2VG9vbHNcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC0xXCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtMlwiOiB0cnVlLFxyXG4gICAgXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiOiBmYWxzZSxcclxuICAgIFwibGlnaHRjb3JkLTNcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC00XCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtNVwiOiB0cnVlLFxyXG4gICAgXCJsaWdodGNvcmQtNlwiOiB0cnVlLFxyXG4gICAgXCJsaWdodGNvcmQtN1wiOiBmYWxzZSxcclxuICAgIFwibGlnaHRjb3JkLThcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC05XCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtMTBcIjogZmFsc2UsXHJcbiAgICBcIm5vX3dpbmRvd19ib3VuZFwiOiBmYWxzZSxcclxufTtcclxuXHJcblxyXG5leHBvcnQgY29uc3Qgc2V0dGluZ3NDb29raWUgPSB7fTtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXR0aW5nc1JQQyA9IHt9O1xyXG5leHBvcnQgY29uc3QgZGVmYXVsdFJQQyA9IHtcclxuICAgIFwibmFtZVwiOiBcIkxpZ2h0Y29yZFwiLFxyXG4gICAgXCJhcHBsaWNhdGlvbl9pZFwiOiBcIjcxMTQxNjk1NzcxODc1NzQxOFwiLFxyXG4gICAgXCJzdGF0ZVwiOiBcIkxpZ2h0Y29yZCBDbGllbnRcIixcclxuICAgIFwiZGV0YWlsc1wiOiBcIkJyb3dzaW5nIERpc2NvcmRcIixcclxuICAgIFwidGltZXN0YW1wcy5zdGFydFwiOiBEYXRlLm5vdygpLFxyXG4gICAgXCJhc3NldHMuc21hbGxcIjogbnVsbCxcclxuICAgIFwiYXNzZXRzLmxhcmdlXCI6IFwiNzEyMzIzODIxMDM3NjgyNzkxXCJcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGJkcGx1Z2luRXJyb3JzID0gW107XHJcbmV4cG9ydCBjb25zdCBiZHRoZW1lRXJyb3JzID0gW107IC8vIGRlZmluZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcclxuXHJcbmV4cG9ydCBjb25zdCBiZENvbmZpZyA9IE9iamVjdC5jcmVhdGUoQmV0dGVyRGlzY29yZENvbmZpZyk7XHJcblxyXG5leHBvcnQgY29uc3QgYmR0aGVtZXMgPSB7fTtcclxuZXhwb3J0IGNvbnN0IGJkcGx1Z2lucyA9IHt9O1xyXG5cclxuZXhwb3J0IGNvbnN0IHBsdWdpbkNvb2tpZSA9IHt9O1xyXG5leHBvcnQgY29uc3QgdGhlbWVDb29raWUgPSB7fTsiLCJpbXBvcnQgbG9jYWxTdG9yYWdlRml4IGZyb20gXCIuL2xvY2FsU3RvcmFnZUZpeFwiO1xyXG5pbXBvcnQgbG9hZGluZ0ljb24gZnJvbSBcIi4vbG9hZGluZ0ljb25cIjtcclxubG9jYWxTdG9yYWdlRml4KCk7XHJcbmxvYWRpbmdJY29uKCk7XHJcblxyXG5jb25zdCBkZXByZWNhdGVHbG9iYWwgPSAoa2V5LCB2YWx1ZSkgPT4ge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywga2V5LCB7XHJcbiAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICBVdGlscy53YXJuKFwiRGVwcmVjYXRlZCBHbG9iYWxcIiwgYFwiJHtrZXl9XCIgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy4gUGxlYXNlIG9ubHkgdXNlIEJkQXBpLmApO1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7ICBcclxufTtcclxuXHJcblxyXG5pbXBvcnQgKiBhcyBHbG9iYWxzIGZyb20gXCIuLzBnbG9iYWxzXCI7XHJcblxyXG5jb25zdCBnbG9iYWxLZXlzID0gT2JqZWN0LmtleXMoR2xvYmFscyk7XHJcbmZvciAoY29uc3Qga2V5IG9mIGdsb2JhbEtleXMpIGRlcHJlY2F0ZUdsb2JhbChrZXksIEdsb2JhbHNba2V5XSk7XHJcblxyXG5cclxuaW1wb3J0IEJkQXBpIGZyb20gXCIuL21vZHVsZXMvYmRBcGlcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgcGx1Z2luTW9kdWxlIGZyb20gXCIuL21vZHVsZXMvcGx1Z2luTW9kdWxlXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi9tb2R1bGVzL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi9tb2R1bGVzL3V0aWxzXCI7XHJcbmltcG9ydCBCREV2ZW50cyBmcm9tIFwiLi9tb2R1bGVzL2JkRXZlbnRzXCI7XHJcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL21vZHVsZXMvc2V0dGluZ3NQYW5lbFwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL21vZHVsZXMvZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCBDbGFzc05vcm1hbGl6ZXIgZnJvbSBcIi4vbW9kdWxlcy9jbGFzc05vcm1hbGl6ZXJcIjtcclxuXHJcbmRlcHJlY2F0ZUdsb2JhbChcIkJEVjJcIiwgQkRWMik7XHJcbmRlcHJlY2F0ZUdsb2JhbChcInBsdWdpbk1vZHVsZVwiLCBwbHVnaW5Nb2R1bGUpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJ0aGVtZU1vZHVsZVwiLCB0aGVtZU1vZHVsZSk7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIlV0aWxzXCIsIFV0aWxzKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwiQkRFdmVudHNcIiwgQkRFdmVudHMpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJzZXR0aW5nc1BhbmVsXCIsIHNldHRpbmdzUGFuZWwpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJEYXRhU3RvcmVcIiwgRGF0YVN0b3JlKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwiQ29udGVudE1hbmFnZXJcIiwgQ29udGVudE1hbmFnZXIpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJDbGFzc05vcm1hbGl6ZXJcIiwgQ2xhc3NOb3JtYWxpemVyKTtcclxuXHJcbndpbmRvdy5CZEFwaSA9IEJkQXBpO1xyXG5cclxuaW1wb3J0IENvcmUgZnJvbSBcIi4vbW9kdWxlcy9jb3JlXCI7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIm1haW5Db3JlXCIsIENvcmUpO1xyXG5cclxuLy8gVE9ETzogQ2hhbmdlIEluaXQgbW9kZSBhbmQgc3RvcCB1c2luZyBDb3JlV3JhcHBlci5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29yZVdyYXBwZXIge1xyXG4gICAgY29uc3RydWN0b3IoYmRDb25maWcsIG1ldGhvZHMpIHtcclxuICAgICAgICBDb3JlLnNldENvbmZpZyhiZENvbmZpZyk7XHJcbiAgICAgICAgQ29yZS5zZXRNZXRob2RzKG1ldGhvZHMpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKSB7XHJcbiAgICAgICAgLy8gZGVwcmVjYXRlR2xvYmFsKFwibWFpbkNvcmVcIiwgdGhpcy5tYWluQ29yZSk7XHJcbiAgICAgICAgQ29yZS5pbml0KCk7XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgZGVmYXVsdCAoKSA9PiB7XHJcbiAgICBjb25zdCB2MkxvYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICB2MkxvYWRlci5jbGFzc05hbWUgPSBcImJkLWxvYWRlcnYyXCI7XHJcbiAgICB2MkxvYWRlci50aXRsZSA9IFwiQmFuZGFnZWRCRCBpcyBsb2FkaW5nLi4uXCI7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHYyTG9hZGVyKTtcclxufTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IGNvbnRlbnRXaW5kb3dHZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEhUTUxJRnJhbWVFbGVtZW50LnByb3RvdHlwZSwgXCJjb250ZW50V2luZG93XCIpLmdldDtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShIVE1MSUZyYW1lRWxlbWVudC5wcm90b3R5cGUsIFwiY29udGVudFdpbmRvd1wiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRXaW5kb3cgPSBSZWZsZWN0LmFwcGx5KGNvbnRlbnRXaW5kb3dHZXR0ZXIsIHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJveHkoY29udGVudFdpbmRvdywge1xyXG4gICAgICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbihvYmosIHByb3ApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJsb2NhbFN0b3JhZ2VcIikgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24ob2JqLCBwcm9wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT09IFwibG9jYWxTdG9yYWdlXCIpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IG9ialtwcm9wXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdmFsLmJpbmQob2JqKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBQcmV2ZW50IGludGVyY2VwdGlvbiBieSBwYXRjaGluZyBSZWZsZWN0LmFwcGx5IGFuZCBGdW5jdGlvbi5wcm90b3R5cGUuYmluZFxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlZmxlY3QsIFwiYXBwbHlcIiwge3ZhbHVlOiBSZWZsZWN0LmFwcGx5LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2V9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdW5jdGlvbi5wcm90b3R5cGUsIFwiYmluZFwiLCB7dmFsdWU6IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2V9KTtcclxuXHJcbiAgICBjb25zdCBvT3BlbiA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuO1xyXG4gICAgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBjb25zdCB1cmwgPSBhcmd1bWVudHNbMV07XHJcbiAgICAgICAgaWYgKHVybC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiYXBpL3dlYmhvb2tzXCIpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShvT3BlbiwgdGhpcywgYXJndW1lbnRzKTtcclxuICAgIH07XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVEZIb3VyIHtcclxuICAgIGluamVjdDI0SG91cigpIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5jZWwyNEhvdXIpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgdHdlbHZlSG91ciA9IG5ldyBSZWdFeHAoYChbMC05XXsxLDJ9KTooWzAtOV17MSwyfSlcXFxccyhBTXxQTSlgKTtcclxuICAgICAgICBjb25zdCBjb252ZXJ0ID0gKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy02XCJdKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSBkYXRhLnJldHVyblZhbHVlLm1hdGNoKHR3ZWx2ZUhvdXIpO1xyXG4gICAgICAgICAgICBpZiAoIW1hdGNoZWQgfHwgbWF0Y2hlZC5sZW5ndGggIT09IDQpIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKG1hdGNoZWRbM10gPT09IFwiQU1cIikgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWUgPSBkYXRhLnJldHVyblZhbHVlLnJlcGxhY2UobWF0Y2hlZFswXSwgYCR7bWF0Y2hlZFsxXSA9PT0gXCIxMlwiID8gXCIwMFwiIDogbWF0Y2hlZFsxXS5wYWRTdGFydCgyLCBcIjBcIil9OiR7bWF0Y2hlZFsyXX1gKTtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWUgPSBkYXRhLnJldHVyblZhbHVlLnJlcGxhY2UobWF0Y2hlZFswXSwgYCR7bWF0Y2hlZFsxXSA9PT0gXCIxMlwiID8gXCIxMlwiIDogcGFyc2VJbnQobWF0Y2hlZFsxXSkgKyAxMn06JHttYXRjaGVkWzJdfWApO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbmNlbENvenkgPSBVdGlscy5tb25rZXlQYXRjaChCRFYyLlRpbWVGb3JtYXR0ZXIsIFwiY2FsZW5kYXJGb3JtYXRcIiwge2FmdGVyOiBjb252ZXJ0fSk7IC8vIENhbGxlZCBpbiBDb3p5IG1vZGVcclxuICAgICAgICBjb25zdCBjYW5jZWxDb21wYWN0ID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5UaW1lRm9ybWF0dGVyLCBcImRhdGVGb3JtYXRcIiwge2FmdGVyOiBjb252ZXJ0fSk7IC8vIENhbGxlZCBpbiBDb21wYWN0IG1vZGVcclxuICAgICAgICB0aGlzLmNhbmNlbDI0SG91ciA9ICgpID0+IHtjYW5jZWxDb3p5KCk7IGNhbmNlbENvbXBhY3QoKTt9OyAvLyBDYW5jZWwgYm90aFxyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZTI0SG91cigpIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5jZWwyNEhvdXIpIHRoaXMuY2FuY2VsMjRIb3VyKCk7XHJcbiAgICB9XHJcbn07IiwiaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCJcclxuXHJcbmNvbnN0IGRpc3BhdGNoZXIgPSB3aW5kb3cuTGlnaHRjb3JkLkRpc2NvcmRNb2R1bGVzLmRpc3BhdGNoZXJcclxuY29uc3QgQ2hhbm5lbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldENoYW5uZWwgJiYgZS5kZWZhdWx0Lmhhc0NoYW5uZWwpWzBdLmRlZmF1bHRcclxubGV0IHJlbGF0aW9uU2hpcE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmFkZFJlbGF0aW9uc2hpcClbMF1cclxubGV0IERNTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbClbMF1cclxuXHJcbmNvbnN0IGJsb2NrZWQgPSB7fVxyXG5cclxubGV0IHVzZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilbMF1cclxuZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXIoKXtcclxuICAgIGlmKHVzZXJNb2R1bGUpcmV0dXJuIHVzZXJNb2R1bGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXHJcbiAgICByZXR1cm4gbnVsbFxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQW50aUJvdERNIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5hbnRpRE0gPSB0aGlzLmFudGlETS5iaW5kKHRoaXMpXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGUoKXtcclxuICAgICAgICBpZih0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxyXG5cclxuICAgICAgICBkaXNwYXRjaGVyLnN1YnNjcmliZShcIk1FU1NBR0VfQ1JFQVRFXCIsIHRoaXMuYW50aURNKVxyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUoKXtcclxuICAgICAgICBpZighdGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcblxyXG4gICAgICAgIGRpc3BhdGNoZXIudW5zdWJzY3JpYmUoXCJNRVNTQUdFX0NSRUFURVwiLCB0aGlzLmFudGlETSlcclxuICAgIH1cclxuXHJcbiAgICBhbnRpRE0oZXYpe1xyXG4gICAgICAgIGlmKCFldi5tZXNzYWdlLmF1dGhvci5ib3QpcmV0dXJuXHJcbiAgICAgICAgaWYoZXYubWVzc2FnZS5hdXRob3IuaWQgPT09IGdldEN1cnJlbnRVc2VyKCkuaWQpXHJcbiAgICAgICAgaWYoZXYubWVzc2FnZS5ndWlsZF9pZClyZXR1cm5cclxuXHJcbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IENoYW5uZWxNb2R1bGUuZ2V0Q2hhbm5lbChldi5tZXNzYWdlLmNoYW5uZWxfaWQpXHJcbiAgICAgICAgaWYoIWNoYW5uZWwpcmV0dXJuIC8vIG1pZ2h0IGJlIGJyb2tlblxyXG5cclxuICAgICAgICBpZihjaGFubmVsLnR5cGUgIT09IDEpcmV0dXJuXHJcblxyXG4gICAgICAgIGlmKGJsb2NrZWRbZXYubWVzc2FnZS5hdXRob3IuaWRdKXJldHVybiAvLyBJZiB0aGUgdXNlciB1bmJsb2NrIHRoZSBib3QsIERvbid0IGJsb2NrIGl0IGFnYWluLlxyXG5cclxuICAgICAgICBpZihzY2FuTWVzc2FnZShldi5tZXNzYWdlKSl7XHJcbiAgICAgICAgICAgIGJsb2NrZWRbZXYubWVzc2FnZS5hdXRob3IuaWRdID0gdHJ1ZVxyXG4gICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoYFtBZEJsb2NrXTogQmxvY2tlZCAke2V2Lm1lc3NhZ2UuYXV0aG9yLnVzZXJuYW1lfSMke2V2Lm1lc3NhZ2UuYXV0aG9yLmRpc2NyaW1pbmF0b3J9YCwge1xyXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwid2FybmluZ1wiXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGlmKCFyZWxhdGlvblNoaXBNb2R1bGUpcmVsYXRpb25TaGlwTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuYWRkUmVsYXRpb25zaGlwKVswXVxyXG4gICAgICAgICAgICByZWxhdGlvblNoaXBNb2R1bGUuZGVmYXVsdC5hZGRSZWxhdGlvbnNoaXAoZXYubWVzc2FnZS5hdXRob3IuaWQsIHtcclxuICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBcIkNvbnRleHRNZW51XCJcclxuICAgICAgICAgICAgfSwgMilcclxuICAgICAgICAgICAgaWYoIURNTW9kdWxlKURNTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbClbMF1cclxuICAgICAgICAgICAgRE1Nb2R1bGUuZGVmYXVsdC5jbG9zZVByaXZhdGVDaGFubmVsKGNoYW5uZWwuaWQsIGZhbHNlKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2Nhbk1lc3NhZ2UobWVzc2FnZSl7XHJcbiAgICBpZigvKGRpc2NvcmRcXC5nZ3xkaXNjb3JkXFwuY29tXFwvaW52aXRlXFwvfGRpc2NvcmRhcHBcXC5jb21cXC9pbnZpdGVcXC8pL2cudGVzdChtZXNzYWdlLmNvbnRlbnQpKXJldHVybiB0cnVlXHJcbiAgICBpZihFbWJlZHNDb250YWlucyhtZXNzYWdlLCBcImRpc2NvcmQuZ2cvXCIpIHx8IEVtYmVkc0NvbnRhaW5zKG1lc3NhZ2UsIFwiZGlzY29yZC5jb20vaW52aXRlL1wiKSB8fCBFbWJlZHNDb250YWlucyhtZXNzYWdlLCBcImRpc2NvcmRhcHAuY29tL2ludml0ZS9cIikpcmV0dXJuIHRydWVcclxuXHJcbiAgICByZXR1cm4gZmFsc2VcclxufVxyXG5mdW5jdGlvbiBFbWJlZHNDb250YWlucyhtZXNzYWdlLCBzZWFyY2gpe1xyXG4gICAgbGV0IGVtYmVkcyA9IG1lc3NhZ2UuZW1iZWRzIHx8IFtdXHJcbiAgICBpZihlbWJlZHMubGVuZ3RoID09PSAwKXJldHVybiBmYWxzZVxyXG4gICAgcmV0dXJuIGVtYmVkcy5tYXAoZW1iZWQgPT4ge1xyXG4gICAgICAgIGlmKGVtYmVkLnR5cGUgIT09IFwicmljaFwiKXJldHVybiBmYWxzZVxyXG4gICAgICAgIGlmKChlbWJlZC50aXRsZSB8fCBcIlwiKS5pbmNsdWRlcyhzZWFyY2gpKXJldHVybiB0cnVlXHJcbiAgICAgICAgaWYoKGVtYmVkLmRlc2NyaXB0aW9uIHx8IFwiXCIpLmluY2x1ZGVzKHNlYXJjaCkpcmV0dXJuIHRydWVcclxuICAgICAgICBpZigoKGVtYmVkLmZvb3RlciB8fCBcIlwiKSAmJiBlbWJlZC5mb290ZXIudGV4dCB8fCBcIlwiKS5pbmNsdWRlcyhzZWFyY2gpKXJldHVybiB0cnVlXHJcbiAgICAgICAgaWYoKGVtYmVkLmZpZWxkcyB8fCBbXSkubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gZS52YWx1ZS5pbmNsdWRlcyhzZWFyY2gpIHx8IGUubmFtZS5pbmNsdWRlcyhzZWFyY2gpXHJcbiAgICAgICAgfSkuaW5jbHVkZXModHJ1ZSkpcmV0dXJuIHRydWVcclxuICAgICAgICByZXR1cm4gZmFsc2VcclxuXHJcbiAgICB9KS5pbmNsdWRlcyh0cnVlKVxyXG59IiwiaW1wb3J0IHtzZXR0aW5nc1JQQywgZGVmYXVsdFJQQ30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcblxyXG5jb25zdCBkaXNwYXRjaGVyID0gQkRNb2R1bGVzLmdldChtPT5tLkRpc3BhdGNoZXImJm0uZGVmYXVsdCYmbS5kZWZhdWx0LmRpc3BhdGNoKVswXS5kZWZhdWx0XHJcbmNvbnN0IEFjdGlvblR5cGVzID0gQkRNb2R1bGVzLmdldChtPT5tLkFjdGlvblR5cGVzKVswXS5BY3Rpb25UeXBlc1xyXG5cclxuY29uc3Qgc29ja2V0SWQgPSBcImxpZ2h0Y29yZC1zcG9vZi1zb2NrZXRcIlxyXG5jb25zdCBwaWQgPSBwcm9jZXNzLnBpZFxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEN1c3RvbVJpY2hQcmVzZW5jZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcblxyXG4gICAgICAgIHRoaXMuZ2FtZSA9IHNldHRpbmdzUlBDXHJcbiAgICB9XHJcbiAgICBcclxuICAgIGdldCBmb3JtYXRlZEdhbWUoKXtcclxuICAgICAgICBpZighdGhpcy5nYW1lKXJldHVybiBudWxsXHJcbiAgICAgICAgaWYodGhpcy5lbmFibGVkID09PSBmYWxzZSlyZXR1cm4gbnVsbFxyXG4gICAgICAgIGxldCBnYW1lID0ge1xyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLmdhbWUubmFtZSB8fCBkZWZhdWx0UlBDLm5hbWUsXHJcbiAgICAgICAgICAgIGFwcGxpY2F0aW9uX2lkOiB0aGlzLmdhbWUuYXBwbGljYXRpb25faWQgfHwgZGVmYXVsdFJQQy5hcHBsaWNhdGlvbl9pZCxcclxuICAgICAgICAgICAgZGV0YWlsczogdGhpcy5nYW1lLmRldGFpbHMgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBzdGF0ZTogdGhpcy5nYW1lLnN0YXRlIHx8IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgdGltZXN0YW1wczogdGhpcy5nYW1lW1widGltZXN0YW1wcy5zdGFydFwiXSA/IHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmdhbWVbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdXHJcbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIGFzc2V0czogdGhpcy5nYW1lW1wiYXNzZXRzLmxhcmdlXCJdID8ge1xyXG4gICAgICAgICAgICAgICAgbGFyZ2VfaW1hZ2U6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSxcclxuICAgICAgICAgICAgICAgIHNtYWxsX2ltYWdlOiB0aGlzLmdhbWVbXCJhc3NldHMuc21hbGxcIl0gfHwgdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWRcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGdhbWVcclxuICAgIH1cclxuXHJcbiAgICBzZW5kR2FtZSgpe1xyXG4gICAgICAgIGRpc3BhdGNoZXIuZGlzcGF0Y2goe1xyXG4gICAgICAgICAgICB0eXBlOiBBY3Rpb25UeXBlcy5MT0NBTF9BQ1RJVklUWV9VUERBVEUsXHJcbiAgICAgICAgICAgIHNvY2tldElkLFxyXG4gICAgICAgICAgICBwaWQsXHJcbiAgICAgICAgICAgIGFjdGl2aXR5OiB0aGlzLmZvcm1hdGVkR2FtZVxyXG4gICAgICAgIH0pICAgXHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKCkge1xyXG4gICAgICAgIGlmKHRoaXMuZW5hYmxlZClyZXR1cm5cclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJFbmFibGluZyBjdXN0b20gUmljaFByZXNlbmNlXCIpXHJcblxyXG4gICAgICAgIHRoaXMuc2V0KHNldHRpbmdzUlBDIHx8IE9iamVjdC5jcmVhdGUoZGVmYXVsdFJQQykpXHJcblxyXG4gICAgICAgIHRoaXMuc2VuZEdhbWUoKVxyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUoKSB7XHJcbiAgICAgICAgaWYoIXRoaXMuZW5hYmxlZClyZXR1cm5cclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiRGlzYWJsaW5nIGN1c3RvbSBSaWNoUHJlc2VuY2VcIilcclxuXHJcbiAgICAgICAgdGhpcy5zZW5kR2FtZSgpXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZmV0Y2hBc3NldHMoYXBwbGljYXRpb25JZCl7XHJcbiAgICAgICAgbGV0IGFzc2V0cyA9IGF3YWl0IEJETW9kdWxlcy5nZXQoZSA9PiBlLmdldEFzc2V0cylbMF0uZ2V0QXNzZXRzKGFwcGxpY2F0aW9uSWQpXHJcbiAgICAgICAgaWYoYXNzZXRzLnVuZGVmaW5lZCAmJiB0eXBlb2YgYXNzZXRzLnVuZGVmaW5lZCA9PT0gXCJudW1iZXJcIil7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gQXBwbGljYXRpb25cIilcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFzc2V0c1xyXG4gICAgfVxyXG5cclxuICAgIHNldChhY3Rpdml0eSl7XHJcbiAgICAgICAgdGhpcy5nYW1lID0gYWN0aXZpdHlcclxuXHJcbiAgICAgICAgdGhpcy5zZW5kR2FtZSgpXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge3BsdWdpbkNvb2tpZSwgdGhlbWVDb29raWUsIGJkcGx1Z2lucywgYmR0aGVtZXMsIHNldHRpbmdzQ29va2llLCBzZXR0aW5nc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBtYWluQ29yZSBmcm9tIFwiLi9jb3JlXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgcGx1Z2luTW9kdWxlIGZyb20gXCIuL3BsdWdpbk1vZHVsZVwiO1xyXG5pbXBvcnQgdGhlbWVNb2R1bGUgZnJvbSBcIi4vdGhlbWVNb2R1bGVcIjtcclxuaW1wb3J0IHNldHRpbmdzUGFuZWwgZnJvbSBcIi4vc2V0dGluZ3NQYW5lbFwiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5jb25zdCBCZEFwaSA9IHtcclxuICAgIGdldCBSZWFjdCgpIHsgcmV0dXJuIEJEVjIuUmVhY3Q7IH0sXHJcbiAgICBnZXQgUmVhY3RET00oKSB7IHJldHVybiBCRFYyLlJlYWN0RG9tOyB9LFxyXG4gICAgZ2V0IFJlYWN0Q29tcG9uZW50KCkge3JldHVybiBCRFYyLlJlYWN0Q29tcG9uZW50O30sXHJcbiAgICBnZXQgV2luZG93Q29uZmlnRmlsZSgpIHtyZXR1cm4gVXRpbHMuV2luZG93Q29uZmlnRmlsZTt9LFxyXG4gICAgZ2V0IHNldHRpbmdzKCkge3JldHVybiBzZXR0aW5nczt9LFxyXG4gICAgZ2V0IGVtb3RlcygpIHtyZXR1cm4gbnVsbH0sIC8vIGRlcHJlY2F0ZWQsIGRlbGV0ZWQgYWxsIGVtb3RlcyBmcm9tIGJldHRlcmRpc2NvcmQuXHJcbiAgICBnZXQgc2NyZWVuV2lkdGgoKSB7IHJldHVybiBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApOyB9LFxyXG4gICAgZ2V0IHNjcmVlbkhlaWdodCgpIHsgcmV0dXJuIE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCAwKTsgfVxyXG59O1xyXG5cclxuQmRBcGkuZ2V0QWxsV2luZG93UHJlZmVyZW5jZXMgPSBmdW5jdGlvbigpIHtcclxuICAgIHJldHVybiBVdGlscy5nZXRBbGxXaW5kb3dQcmVmZXJlbmNlcygpO1xyXG59O1xyXG5cclxuQmRBcGkuZ2V0V2luZG93UHJlZmVyZW5jZSA9IGZ1bmN0aW9uKGtleSkge1xyXG4gICAgcmV0dXJuIFV0aWxzLmdldFdpbmRvd1ByZWZlcmVuY2Uoa2V5KTtcclxufTtcclxuXHJcbkJkQXBpLnNldFdpbmRvd1ByZWZlcmVuY2UgPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7XHJcbiAgICByZXR1cm4gVXRpbHMuc2V0V2luZG93UHJlZmVyZW5jZShrZXksIHZhbHVlKTtcclxufTtcclxuXHJcbi8vSW5qZWN0IENTUyB0byBkb2N1bWVudCBoZWFkXHJcbi8vaWQgPSBpZCBvZiBlbGVtZW50XHJcbi8vY3NzID0gY3VzdG9tIGNzc1xyXG5CZEFwaS5pbmplY3RDU1MgPSBmdW5jdGlvbiAoaWQsIGNzcykge1xyXG4gICAgRE9NLmFkZFN0eWxlKERPTS5lc2NhcGVJRChpZCksIGNzcyk7XHJcbn07XHJcblxyXG4vL0NsZWFyIGNzcy9yZW1vdmUgYW55IGVsZW1lbnRcclxuLy9pZCA9IGlkIG9mIGVsZW1lbnRcclxuQmRBcGkuY2xlYXJDU1MgPSBmdW5jdGlvbiAoaWQpIHtcclxuICAgIERPTS5yZW1vdmVTdHlsZShET00uZXNjYXBlSUQoaWQpKTtcclxufTtcclxuXHJcbi8vSW5qZWN0IENTUyB0byBkb2N1bWVudCBoZWFkXHJcbi8vaWQgPSBpZCBvZiBlbGVtZW50XHJcbi8vY3NzID0gY3VzdG9tIGNzc1xyXG5CZEFwaS5saW5rSlMgPSBmdW5jdGlvbiAoaWQsIHVybCkge1xyXG4gICAgRE9NLmFkZFNjcmlwdChET00uZXNjYXBlSUQoaWQpLCB1cmwpO1xyXG59O1xyXG5cclxuLy9DbGVhciBjc3MvcmVtb3ZlIGFueSBlbGVtZW50XHJcbi8vaWQgPSBpZCBvZiBlbGVtZW50XHJcbkJkQXBpLnVubGlua0pTID0gZnVuY3Rpb24gKGlkKSB7XHJcbiAgICBET00ucmVtb3ZlU2NyaXB0KERPTS5lc2NhcGVJRChpZCkpO1xyXG59O1xyXG5cclxuLy9HZXQgYW5vdGhlciBwbHVnaW5cclxuLy9uYW1lID0gbmFtZSBvZiBwbHVnaW5cclxuQmRBcGkuZ2V0UGx1Z2luID0gZnVuY3Rpb24gKG5hbWUpIHtcclxuICAgIGlmIChiZHBsdWdpbnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcclxuICAgICAgICByZXR1cm4gYmRwbHVnaW5zW25hbWVdLnBsdWdpbjtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuLy9HZXQgQmV0dGVyRGlzY29yZCBDb3JlXHJcbkJkQXBpLmdldENvcmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBVdGlscy53YXJuKFwiRGVwcmVjYXRpb24gTm90aWNlXCIsIGBCZEFwaS5nZXRDb3JlKCkgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5gKTtcclxuICAgIHJldHVybiBtYWluQ29yZTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBTaG93cyBhIGdlbmVyaWMgYnV0IHZlcnkgY3VzdG9taXphYmxlIG1vZGFsLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSB0aXRsZSBvZiB0aGUgbW9kYWxcclxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgLSBhIHN0cmluZyBvZiB0ZXh0IHRvIGRpc3BsYXkgaW4gdGhlIG1vZGFsXHJcbiAqL1xyXG5CZEFwaS5hbGVydCA9IGZ1bmN0aW9uICh0aXRsZSwgY29udGVudCkge1xyXG4gICAgcmV0dXJuIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbCh0aXRsZSwgY29udGVudCwge2NhbmNlbFRleHQ6IG51bGx9KTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBTaG93cyBhIGdlbmVyaWMgYnV0IHZlcnkgY3VzdG9taXphYmxlIGNvbmZpcm1hdGlvbiBtb2RhbCB3aXRoIG9wdGlvbmFsIGNvbmZpcm0gYW5kIGNhbmNlbCBjYWxsYmFja3MuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIHRpdGxlIG9mIHRoZSBtb2RhbFxyXG4gKiBAcGFyYW0geyhzdHJpbmd8UmVhY3RFbGVtZW50fEFycmF5PHN0cmluZ3xSZWFjdEVsZW1lbnQ+KX0gY2hpbGRyZW4gLSBhIHNpbmdsZSBvciBtaXhlZCBhcnJheSBvZiByZWFjdCBlbGVtZW50cyBhbmQgc3RyaW5ncy4gRXZlcnkgc3RyaW5nIGlzIHdyYXBwZWQgaW4gRGlzY29yZCdzIGBNYXJrZG93bmAgY29tcG9uZW50IHNvIHN0cmluZ3Mgd2lsbCBzaG93IGFuZCByZW5kZXIgcHJvcGVybHkuXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBvcHRpb25zIHRvIG1vZGlmeSB0aGUgbW9kYWxcclxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kYW5nZXI9ZmFsc2VdIC0gd2hldGhlciB0aGUgbWFpbiBidXR0b24gc2hvdWxkIGJlIHJlZCBvciBub3RcclxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNvbmZpcm1UZXh0PU9rYXldIC0gdGV4dCBmb3IgdGhlIGNvbmZpcm1hdGlvbi9zdWJtaXQgYnV0dG9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jYW5jZWxUZXh0PUNhbmNlbF0gLSB0ZXh0IGZvciB0aGUgY2FuY2VsIGJ1dHRvblxyXG4gKiBAcGFyYW0ge2NhbGxhYmxlfSBbb3B0aW9ucy5vbkNvbmZpcm09Tk9PUF0gLSBjYWxsYmFjayB0byBvY2N1ciB3aGVuIGNsaWNraW5nIHRoZSBzdWJtaXQgYnV0dG9uXHJcbiAqIEBwYXJhbSB7Y2FsbGFibGV9IFtvcHRpb25zLm9uQ2FuY2VsPU5PT1BdIC0gY2FsbGJhY2sgdG8gb2NjdXIgd2hlbiBjbGlja2luZyB0aGUgY2FuY2VsIGJ1dHRvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMua2V5XSAtIGtleSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBtb2RhbC4gSWYgbm90IHByb3ZpZGVkLCBvbmUgaXMgZ2VuZXJhdGVkIGFuZCByZXR1cm5lZFxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBrZXkgdXNlZCBmb3IgdGhpcyBtb2RhbFxyXG4gKi9cclxuQmRBcGkuc2hvd0NvbmZpcm1hdGlvbk1vZGFsID0gZnVuY3Rpb24gKHRpdGxlLCBjb250ZW50LCBvcHRpb25zID0ge30pIHtcclxuICAgIHJldHVybiBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwodGl0bGUsIGNvbnRlbnQsIG9wdGlvbnMpO1xyXG59O1xyXG5cclxuLy9TaG93IHRvYXN0IGFsZXJ0XHJcbkJkQXBpLnNob3dUb2FzdCA9IGZ1bmN0aW9uKGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgVXRpbHMuc2hvd1RvYXN0KGNvbnRlbnQsIG9wdGlvbnMpO1xyXG59O1xyXG5cclxuLy8gRmluZHMgbW9kdWxlXHJcbkJkQXBpLmZpbmRNb2R1bGUgPSBmdW5jdGlvbihmaWx0ZXIpIHtcclxuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmQoZmlsdGVyKTtcclxufTtcclxuXHJcbi8vIEZpbmRzIG1vZHVsZVxyXG5CZEFwaS5maW5kQWxsTW9kdWxlcyA9IGZ1bmN0aW9uKGZpbHRlcikge1xyXG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEFsbChmaWx0ZXIpO1xyXG59O1xyXG5cclxuLy8gRmluZHMgbW9kdWxlXHJcbkJkQXBpLmZpbmRNb2R1bGVCeVByb3BzID0gZnVuY3Rpb24oLi4ucHJvcHMpIHtcclxuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMocHJvcHMpO1xyXG59O1xyXG5cclxuQmRBcGkuZmluZE1vZHVsZUJ5UHJvdG90eXBlcyA9IGZ1bmN0aW9uKC4uLnByb3Rvcykge1xyXG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5UHJvdG90eXBlcyhwcm90b3MpO1xyXG59O1xyXG5cclxuQmRBcGkuZmluZE1vZHVsZUJ5RGlzcGxheU5hbWUgPSBmdW5jdGlvbihuYW1lKSB7XHJcbiAgICByZXR1cm4gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShuYW1lKTtcclxufTtcclxuXHJcbi8vIEdldHMgcmVhY3QgaW5zdGFuY2VcclxuQmRBcGkuZ2V0SW50ZXJuYWxJbnN0YW5jZSA9IGZ1bmN0aW9uKG5vZGUpIHtcclxuICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiB3aW5kb3cualF1ZXJ5KSAmJiAhKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIGlmIChub2RlIGluc3RhbmNlb2YgalF1ZXJ5KSBub2RlID0gbm9kZVswXTtcclxuICAgIHJldHVybiBCRFYyLmdldEludGVybmFsSW5zdGFuY2Uobm9kZSk7XHJcbn07XHJcblxyXG4vLyBHZXRzIGRhdGFcclxuQmRBcGkubG9hZERhdGEgPSBmdW5jdGlvbihwbHVnaW5OYW1lLCBrZXkpIHtcclxuICAgIHJldHVybiBEYXRhU3RvcmUuZ2V0UGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXkpO1xyXG59O1xyXG5cclxuQmRBcGkuZ2V0RGF0YSA9IEJkQXBpLmxvYWREYXRhO1xyXG5cclxuLy8gU2V0cyBkYXRhXHJcbkJkQXBpLnNhdmVEYXRhID0gZnVuY3Rpb24ocGx1Z2luTmFtZSwga2V5LCBkYXRhKSB7XHJcbiAgICByZXR1cm4gRGF0YVN0b3JlLnNldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5LCBkYXRhKTtcclxufTtcclxuXHJcbkJkQXBpLnNldERhdGEgPSBCZEFwaS5zYXZlRGF0YTtcclxuXHJcbi8vIERlbGV0ZXMgZGF0YVxyXG5CZEFwaS5kZWxldGVEYXRhID0gZnVuY3Rpb24ocGx1Z2luTmFtZSwga2V5KSB7XHJcbiAgICByZXR1cm4gRGF0YVN0b3JlLmRlbGV0ZVBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KTtcclxufTtcclxuXHJcbi8vIFBhdGNoZXMgb3RoZXIgZnVuY3Rpb25zXHJcbkJkQXBpLm1vbmtleVBhdGNoID0gZnVuY3Rpb24od2hhdCwgbWV0aG9kTmFtZSwgb3B0aW9ucykge1xyXG4gICAgcmV0dXJuIFV0aWxzLm1vbmtleVBhdGNoKHdoYXQsIG1ldGhvZE5hbWUsIG9wdGlvbnMpO1xyXG59O1xyXG5cclxuLy8gRXZlbnQgd2hlbiBlbGVtZW50IGlzIHJlbW92ZWRcclxuQmRBcGkub25SZW1vdmVkID0gZnVuY3Rpb24obm9kZSwgY2FsbGJhY2spIHtcclxuICAgIHJldHVybiBVdGlscy5vblJlbW92ZWQobm9kZSwgY2FsbGJhY2spO1xyXG59O1xyXG5cclxuLy8gV3JhcHMgZnVuY3Rpb24gaW4gdHJ5Li5jYXRjaFxyXG5CZEFwaS5zdXBwcmVzc0Vycm9ycyA9IGZ1bmN0aW9uKG1ldGhvZCwgbWVzc2FnZSkge1xyXG4gICAgcmV0dXJuIFV0aWxzLnN1cHByZXNzRXJyb3JzKG1ldGhvZCwgbWVzc2FnZSk7XHJcbn07XHJcblxyXG4vLyBUZXN0cyBmb3IgdmFsaWQgSlNPTlxyXG5CZEFwaS50ZXN0SlNPTiA9IGZ1bmN0aW9uKGRhdGEpIHtcclxuICAgIHJldHVybiBVdGlscy50ZXN0SlNPTihkYXRhKTtcclxufTtcclxuXHJcbkJkQXBpLmlzUGx1Z2luRW5hYmxlZCA9IGZ1bmN0aW9uKG5hbWUpIHtcclxuICAgIHJldHVybiAhIXBsdWdpbkNvb2tpZVtuYW1lXTtcclxufTtcclxuXHJcbkJkQXBpLmlzVGhlbWVFbmFibGVkID0gZnVuY3Rpb24obmFtZSkge1xyXG4gICAgcmV0dXJuICEhdGhlbWVDb29raWVbbmFtZV07XHJcbn07XHJcblxyXG5CZEFwaS5pc1NldHRpbmdFbmFibGVkID0gZnVuY3Rpb24oaWQpIHtcclxuICAgIHJldHVybiAhIXNldHRpbmdzQ29va2llW2lkXTtcclxufTtcclxuXHJcbkJkQXBpLmVuYWJsZVNldHRpbmcgPSBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIHNldHRpbmdzUGFuZWwub25DaGFuZ2UoaWQsIHRydWUpO1xyXG59O1xyXG5cclxuQmRBcGkuZGlzYWJsZVNldHRpbmcgPSBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIHNldHRpbmdzUGFuZWwub25DaGFuZ2UoaWQsIGZhbHNlKTtcclxufTtcclxuXHJcbkJkQXBpLnRvZ2dsZVNldHRpbmcgPSBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIHNldHRpbmdzUGFuZWwub25DaGFuZ2UoaWQsICFzZXR0aW5nc0Nvb2tpZVtpZF0pO1xyXG59O1xyXG5cclxuLy8gR2V0cyBkYXRhXHJcbkJkQXBpLmdldEJERGF0YSA9IGZ1bmN0aW9uKGtleSkge1xyXG4gICAgcmV0dXJuIERhdGFTdG9yZS5nZXRCRERhdGEoa2V5KTtcclxufTtcclxuXHJcbi8vIFNldHMgZGF0YVxyXG5CZEFwaS5zZXRCRERhdGEgPSBmdW5jdGlvbihrZXksIGRhdGEpIHtcclxuICAgIHJldHVybiBEYXRhU3RvcmUuc2V0QkREYXRhKGtleSwgZGF0YSk7XHJcbn07XHJcblxyXG5cclxuXHJcbmNvbnN0IG1ha2VBZGRvbkFQSSA9IChjb29raWUsIGxpc3QsIG1hbmFnZXIpID0+IG5ldyBjbGFzcyBBZGRvbkFQSSB7XHJcblxyXG4gICAgZ2V0IGZvbGRlcigpIHtyZXR1cm4gbWFuYWdlci5mb2xkZXI7fVxyXG5cclxuICAgIGlzRW5hYmxlZChuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuICEhY29va2llW25hbWVdO1xyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZShuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIG1hbmFnZXIuZW5hYmxlKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUobmFtZSkge1xyXG4gICAgICAgIHJldHVybiBtYW5hZ2VyLmRpc2FibGUobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdG9nZ2xlKG5hbWUpIHtcclxuICAgICAgICBpZiAoY29va2llW25hbWVdKSB0aGlzLmRpc2FibGUobmFtZSk7XHJcbiAgICAgICAgZWxzZSB0aGlzLmVuYWJsZShuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICByZWxvYWQobmFtZSkge1xyXG4gICAgICAgIHJldHVybiBtYW5hZ2VyLnJlbG9hZChuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQobmFtZSkge1xyXG4gICAgICAgIGlmIChsaXN0Lmhhc093blByb3BlcnR5KG5hbWUpKSB7XHJcbiAgICAgICAgICAgIGlmIChsaXN0W25hbWVdLnBsdWdpbikgcmV0dXJuIGxpc3RbbmFtZV0ucGx1Z2luO1xyXG4gICAgICAgICAgICByZXR1cm4gbGlzdFtuYW1lXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QWxsKCkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhsaXN0KS5tYXAoayA9PiB0aGlzLmdldChrKSkuZmlsdGVyKGEgPT4gYSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5CZEFwaS5QbHVnaW5zID0gbWFrZUFkZG9uQVBJKHBsdWdpbkNvb2tpZSwgYmRwbHVnaW5zLCBwbHVnaW5Nb2R1bGUpO1xyXG5CZEFwaS5UaGVtZXMgPSBtYWtlQWRkb25BUEkodGhlbWVDb29raWUsIGJkdGhlbWVzLCB0aGVtZU1vZHVsZSk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCZEFwaTtcclxuXHJcbndpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5CZEFwaSA9IEJkQXBpIiwiLyogQkRFdmVudHMgKi9cclxuY29uc3QgRXZlbnRFbWl0dGVyID0gcmVxdWlyZShcImV2ZW50c1wiKTtcclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEJERXZlbnRzIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoKVxyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5CREV2ZW50cyA9IHRoaXNcclxuICAgIH1cclxuICAgIGRpc3BhdGNoKGV2ZW50TmFtZSwgLi4uYXJncykge3RoaXMuZW1pdChldmVudE5hbWUsIC4uLmFyZ3MpO31cclxuICAgIG9mZihldmVudE5hbWUsIGV2ZW50QWN0aW9uKSB7dGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudE5hbWUsIGV2ZW50QWN0aW9uKTt9XHJcbn07IiwiLyoqXHJcbiAqIENyZWRpdHMgdG8gQGhlbGxib3VuZDEzMzcgb24gZ2l0aHViIGZvciB0aGUgY3NzXHJcbiAqL1xyXG5cclxuaW1wb3J0IERPTVRvb2xzIGZyb20gXCIuL2RvbXRvb2xzXCJcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCJcclxuXHJcbmxldCBzZWxlY3RvcnNcclxuY29uc3QgcmVtb3ZlRGEgPSBVdGlscy5yZW1vdmVEYVxyXG5mdW5jdGlvbiBnZXRTZWxlY3RvcnMoKXtcclxuICAgIGxldCBzdGFuZGFyZFNpZGViYXJWaWV3ID0gQkRNb2R1bGVzLmdldChlID0+IGUuc3RhbmRhcmRTaWRlYmFyVmlldylbMF1cclxuICAgIGlmKCFzdGFuZGFyZFNpZGViYXJWaWV3KXJldHVybiBudWxsXHJcbiAgICBsZXQgZGVmYXVsdENsYXNzTmFtZSA9IHJlbW92ZURhKHN0YW5kYXJkU2lkZWJhclZpZXcuc3RhbmRhcmRTaWRlYmFyVmlldylcclxuICAgIGxldCBzZWxlY3RzID0gW11cclxuICAgIGxldCB1c2VyU2V0dGluZ3NBY2NvdW50ID0gQkRNb2R1bGVzLmdldChlID0+IGUudXNlclNldHRpbmdzQWNjb3VudClbMF1cclxuICAgIGNvbnN0IGNoaWxkcmVuID0gQkRNb2R1bGVzLmdldChlID0+IHR5cGVvZiBlLmNoaWxkcmVuID09PSBcInN0cmluZ1wiKVswXVxyXG4gICAgc2VsZWN0cy5wdXNoKGAjYXBwLW1vdW50IC4ke2RlZmF1bHRDbGFzc05hbWV9IC5wYXltZW50LWluZm8gLiR7cmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuZGVzY3JpcHRpb24gJiYgdHlwZW9mIGUuZGVzY3JpcHRpb24gPT09IFwic3RyaW5nXCIgJiYgZS5kZXNjcmlwdGlvbi5pbmNsdWRlcyhcImZvcm1UZXh0XCIpKVswXS5kZXNjcmlwdGlvbil9YClcclxuICAgIHNlbGVjdHMucHVzaChgI2FwcC1tb3VudCAuJHtkZWZhdWx0Q2xhc3NOYW1lfSAuJHtyZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wYXltZW50U291cmNlUm93KVswXS5wYXltZW50U291cmNlUm93KX0gLiR7cmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuc3ViVGV4dCAmJiBlLmRlc2NyaXB0aW9uV3JhcHBlcilbMF0uc3ViVGV4dCl9YClcclxuICAgIGlmKHVzZXJTZXR0aW5nc0FjY291bnQpe1xyXG4gICAgICAgIHNlbGVjdHMucHVzaChgI2FwcC1tb3VudCAuJHtkZWZhdWx0Q2xhc3NOYW1lfSAuJHtyZW1vdmVEYSh1c2VyU2V0dGluZ3NBY2NvdW50LnVzZXJTZXR0aW5nc0FjY291bnQpfSBkaXY6bnRoLWNoaWxkKDIpPmRpdjpudGgtY2hpbGQoMik+LiR7cmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUudmlld0JvZHkpWzBdLnZpZXdCb2R5KX1gKVxyXG4gICAgICAgIHNlbGVjdHMucHVzaChgLiR7cmVtb3ZlRGEodXNlclNldHRpbmdzQWNjb3VudC51c2VyU2V0dGluZ3NTZWN1cml0eSl9IC4ke3JlbW92ZURhKGNoaWxkcmVuLmNoaWxkcmVuKX0gPiBkaXY6bnRoLWNoaWxkKDIpYClcclxuICAgIH1cclxuICAgIGNvbnNvbGUubG9nKHNlbGVjdHMpXHJcbiAgICByZXR1cm4gc2VsZWN0c1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQmx1clByaXZhdGUge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZSgpe1xyXG4gICAgICAgIGlmKHRoaXMuZW5hYmxlZClyZXR1cm5cclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlXHJcbiAgICAgICAgc2VsZWN0b3JzID0gc2VsZWN0b3JzIHx8IGdldFNlbGVjdG9ycygpXHJcblxyXG4gICAgICAgIGlmKCFzZWxlY3RvcnMpY29uc29sZS5lcnJvcihuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIHNlbGVjdG9ycyB0byBibHVyIHBlcnNvbm5hbCBpbmZvcm1hdGlvbnMuXCIpKVxyXG4gICAgICAgIERPTVRvb2xzLmFkZFN0eWxlKFwiYmx1clByaXZhdGVcIiwgYFxyXG4ke3NlbGVjdG9ycy5qb2luKFwiLCBcIil9IHtcclxuICAgIHRyYW5zaXRpb246IGFsbCAxNTBtcyBjdWJpYy1iZXppZXIoLjU1LC4wODUsLjY4LC41Myk7XHJcbiAgICBmaWx0ZXI6IGJsdXIoNHB4KTtcclxuICAgIG9wYWNpdHk6IC44O1xyXG59XHJcblxyXG4ke3NlbGVjdG9ycy5tYXAoZSA9PiBlK1wiOmhvdmVyXCIpLmpvaW4oXCIsIFwiKX0gIHtcclxuICAgIHRyYW5zaXRpb246IGFsbCAxNTBtcyBjdWJpYy1iZXppZXIoLjU1LC4wOSwuNjgsLjUzKTtcclxuICAgIGZpbHRlcjogbm9uZTtcclxuICAgIG9wYWNpdHk6IDE7XHJcbn1gKVxyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUoKXtcclxuICAgICAgICBpZighdGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcbiAgICAgICAgRE9NVG9vbHMucmVtb3ZlU3R5bGUoXCJibHVyUHJpdmF0ZVwiKVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL3dlYnBhY2tNb2R1bGVzXCI7XHJcblxyXG5jb25zdCBub3JtYWxpemVkUHJlZml4ID0gXCJkYVwiO1xyXG5jb25zdCByYW5kQ2xhc3MgPSBuZXcgUmVnRXhwKGBeKD8hJHtub3JtYWxpemVkUHJlZml4fS0pKCg/OltBLVphLXpdfFswLTldfC0pKyktKD86W0EtWmEtel18WzAtOV18LXxfKXs2fSRgKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBDbGFzc05vcm1hbGl6ZXIge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuQ2xhc3NOb3JtYWxpemVyID0gdGhpc1xyXG4gICAgfVxyXG4gICAgc3RvcCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGFzUGF0Y2hlZCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMudW5wYXRjaENsYXNzTW9kdWxlcyhXZWJwYWNrTW9kdWxlcy5maW5kQWxsKHRoaXMubW9kdWxlRmlsdGVyLmJpbmQodGhpcykpKTtcclxuICAgICAgICB0aGlzLnJldmVydEVsZW1lbnQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhcHAtbW91bnRcIikpO1xyXG4gICAgICAgIHRoaXMuaGFzUGF0Y2hlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmhhc1BhdGNoZWQpIHJldHVybjtcclxuICAgICAgICB0aGlzLnBhdGNoQ2xhc3NNb2R1bGVzKFdlYnBhY2tNb2R1bGVzLmZpbmRBbGwodGhpcy5tb2R1bGVGaWx0ZXIuYmluZCh0aGlzKSkpO1xyXG4gICAgICAgIHRoaXMubm9ybWFsaXplRWxlbWVudChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2FwcC1tb3VudFwiKSk7XHJcbiAgICAgICAgdGhpcy5oYXNQYXRjaGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnBhdGNoRE9NTWV0aG9kcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHBhdGNoQ2xhc3NNb2R1bGVzKG1vZHVsZXMpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGF0Y2hDbGFzc01vZHVsZShub3JtYWxpemVkUHJlZml4LCBtb2R1bGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1bnBhdGNoQ2xhc3NNb2R1bGVzKG1vZHVsZXMpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMudW5wYXRjaENsYXNzTW9kdWxlKG5vcm1hbGl6ZWRQcmVmaXgsIG1vZHVsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNob3VsZElnbm9yZSh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghaXNOYU4odmFsdWUpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAodmFsdWUuZW5kc1dpdGgoXCJweFwiKSB8fCB2YWx1ZS5lbmRzV2l0aChcImNoXCIpIHx8IHZhbHVlLmVuZHNXaXRoKFwiZW1cIikgfHwgdmFsdWUuZW5kc1dpdGgoXCJtc1wiKSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoXCJsYXllckNvbnRhaW5lci1cIikpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKFwiI1wiKSAmJiAodmFsdWUubGVuZ3RoID09IDcgfHwgdmFsdWUubGVuZ3RoID09IDQpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAodmFsdWUuaW5jbHVkZXMoXCJjYWxjKFwiKSB8fCB2YWx1ZS5pbmNsdWRlcyhcInJnYmFcIikpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBtb2R1bGVGaWx0ZXIobW9kdWxlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShtb2R1bGUpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKG1vZHVsZS5fX2VzTW9kdWxlKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhtb2R1bGUpLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGZvciAoY29uc3QgYmFzZUNsYXNzTmFtZSBpbiBtb2R1bGUpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBtb2R1bGVbYmFzZUNsYXNzTmFtZV07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlKHZhbHVlKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zcGxpdChcIi1cIikubGVuZ3RoID09PSAxKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICghcmFuZENsYXNzLnRlc3QodmFsdWUuc3BsaXQoXCIgXCIpWzBdKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcGF0Y2hDbGFzc01vZHVsZShjb21wb25lbnROYW1lLCBjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBiYXNlQ2xhc3NOYW1lIGluIGNsYXNzTmFtZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjbGFzc05hbWVzW2Jhc2VDbGFzc05hbWVdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zaG91bGRJZ25vcmUodmFsdWUpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gdmFsdWUuc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5vcm1hbENsYXNzIG9mIGNsYXNzTGlzdCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBub3JtYWxDbGFzcy5tYXRjaChyYW5kQ2xhc3MpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaCB8fCAhbWF0Y2gubGVuZ3RoIHx8IG1hdGNoLmxlbmd0aCA8IDIpIGNvbnRpbnVlOyAvLyBTaG91bGRuJ3QgZXZlciBoYXBwZW4gc2luY2UgdGhleSBwYXNzZWQgdGhlIG1vZHVsZUZpbHRlciwgYnV0IHlvdSBuZXZlciBrbm93XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjYW1lbENhc2UgPSBtYXRjaFsxXS5zcGxpdChcIi1cIikubWFwKChzLCBpKSA9PiBpID8gc1swXS50b1VwcGVyQ2FzZSgpICsgcy5zbGljZSgxKSA6IHMpLmpvaW4oXCJcIik7XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWVzW2Jhc2VDbGFzc05hbWVdICs9IGAgJHtjb21wb25lbnROYW1lfS0ke2NhbWVsQ2FzZX1gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVucGF0Y2hDbGFzc01vZHVsZShjb21wb25lbnROYW1lLCBjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBiYXNlQ2xhc3NOYW1lIGluIGNsYXNzTmFtZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjbGFzc05hbWVzW2Jhc2VDbGFzc05hbWVdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zaG91bGRJZ25vcmUodmFsdWUpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgbGV0IG5ld1N0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHZhbHVlLnNwbGl0KFwiIFwiKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBub3JtYWxDbGFzcyBvZiBjbGFzc0xpc3QpIHtcclxuICAgICAgICAgICAgICAgIGlmIChub3JtYWxDbGFzcy5zdGFydHNXaXRoKGAke2NvbXBvbmVudE5hbWV9LWApKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIG5ld1N0cmluZyArPSBgICR7bm9ybWFsQ2xhc3N9YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjbGFzc05hbWVzW2Jhc2VDbGFzc05hbWVdID0gbmV3U3RyaW5nLnRyaW0oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbm9ybWFsaXplRWxlbWVudChlbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IGVsZW1lbnQuY2xhc3NMaXN0O1xyXG4gICAgICAgIGZvciAobGV0IGMgPSAwLCBjbGVuID0gY2xhc3Nlcy5sZW5ndGg7IGMgPCBjbGVuOyBjKyspIHtcclxuICAgICAgICAgICAgaWYgKCFyYW5kQ2xhc3MudGVzdChjbGFzc2VzW2NdKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gY2xhc3Nlc1tjXS5tYXRjaChyYW5kQ2xhc3MpWzFdO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdDbGFzcyA9IG1hdGNoLnNwbGl0KFwiLVwiKS5tYXAoKHMsIGkpID0+IGkgPyBzWzBdLnRvVXBwZXJDYXNlKCkgKyBzLnNsaWNlKDEpIDogcykuam9pbihcIlwiKTtcclxuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGAke25vcm1hbGl6ZWRQcmVmaXh9LSR7bmV3Q2xhc3N9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZWxlbWVudC5jaGlsZHJlbikgdGhpcy5ub3JtYWxpemVFbGVtZW50KGNoaWxkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXZlcnRFbGVtZW50KGVsZW1lbnQpIHtcclxuICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybjtcclxuICAgICAgICBpZiAoZWxlbWVudC5jaGlsZHJlbiAmJiBlbGVtZW50LmNoaWxkcmVuLmxlbmd0aCkgdGhpcy5yZXZlcnRFbGVtZW50KGVsZW1lbnQuY2hpbGRyZW5bMF0pO1xyXG4gICAgICAgIGlmIChlbGVtZW50Lm5leHRFbGVtZW50U2libGluZykgdGhpcy5yZXZlcnRFbGVtZW50KGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKTtcclxuICAgICAgICBjb25zdCBjbGFzc2VzID0gZWxlbWVudC5jbGFzc0xpc3Q7XHJcbiAgICAgICAgY29uc3QgdG9SZW1vdmUgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNsYXNzZXMubGVuZ3RoOyBjKyspIHtcclxuICAgICAgICAgICAgaWYgKGNsYXNzZXNbY10uc3RhcnRzV2l0aChgJHtub3JtYWxpemVkUHJlZml4fS1gKSkgdG9SZW1vdmUucHVzaChjbGFzc2VzW2NdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKC4uLnRvUmVtb3ZlKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXRjaERPTU1ldGhvZHMoKSB7XHJcbiAgICAgICAgY29uc3QgY29udGFpbnMgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlLmNvbnRhaW5zO1xyXG4gICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbih0b2tlbikge1xyXG4gICAgICAgICAgICAvLyBjb25zdCB0b2tlbnMgPSB0b2tlbi5zcGxpdChcIiBcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KGNvbnRhaW5zLCB0aGlzLCBbdG9rZW4uc3BsaXQoXCIgXCIpWzBdXSk7XHJcbiAgICAgICAgICAgIC8vIHJldHVybiB0b2tlbnMuZXZlcnkodCA9PiBjb250YWlucy5jYWxsKHRoaXMsIHQpKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBhZGQgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlLmFkZDtcclxuICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKC4uLnRva2Vucykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IHRva2Vucy5sZW5ndGg7IHQrKykge1xyXG4gICAgICAgICAgICAgICAgdG9rZW5zW3RdID0gdG9rZW5zW3RdLnNwbGl0KFwiIFwiKVswXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShhZGQsIHRoaXMsIHRva2Vucyk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVtb3ZlID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmU7XHJcbiAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiguLi50b2tlbnMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCB0b2tlbnMubGVuZ3RoOyB0KyspIHtcclxuICAgICAgICAgICAgICAgIHRva2Vuc1t0XSA9IHRva2Vuc1t0XS5zcGxpdChcIiBcIilbMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkocmVtb3ZlLCB0aGlzLCB0b2tlbnMpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG59OyIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBDb2xvcmVkVGV4dCB7XHJcbiAgICBpbmplY3RDb2xvcmVkVGV4dCgpIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5jZWxDb2xvcmVkVGV4dCkgcmV0dXJuO1xyXG4gICAgICAgIGlmICghQkRWMi5NZXNzYWdlQ29tcG9uZW50KSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuY2FuY2VsQ29sb3JlZFRleHQgPSBVdGlscy5tb25rZXlQYXRjaChCRFYyLk1lc3NhZ2VDb21wb25lbnQsIFwiZGVmYXVsdFwiLCB7YmVmb3JlOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IGRhdGEubWV0aG9kQXJndW1lbnRzWzBdO1xyXG4gICAgICAgICAgICBpZiAoIXByb3BzIHx8ICFwcm9wcy5jaGlsZHJlbk1lc3NhZ2VDb250ZW50KSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VDb250ZW50ID0gcHJvcHMuY2hpbGRyZW5NZXNzYWdlQ29udGVudDtcclxuXHJcbiAgICAgICAgICAgIGlmICghbWVzc2FnZUNvbnRlbnQudHlwZSB8fCAhbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlIHx8IG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZS5kaXNwbGF5TmFtZSAhPSBcIk1lc3NhZ2VDb250ZW50XCIpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxUeXBlID0gbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlO1xyXG4gICAgICAgICAgICBpZiAob3JpZ2luYWxUeXBlLl9fb3JpZ2luYWxNZXRob2QpIHJldHVybjsgLy8gRG9uJ3QgcGF0Y2ggYWdhaW5cclxuICAgICAgICAgICAgbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlID0gZnVuY3Rpb24ocHJvcHMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gb3JpZ2luYWxUeXBlKHByb3BzKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVDb2xvciA9IHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTdcIl0gPyBwcm9wcy5tZXNzYWdlLmNvbG9yU3RyaW5nIHx8IFwiXCIgOiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuc3R5bGUgPSB7Y29sb3I6IHJvbGVDb2xvcn07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBtZXNzYWdlQ29udGVudC50eXBlLnR5cGUuX19vcmlnaW5hbE1ldGhvZCA9IG9yaWdpbmFsVHlwZTtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihtZXNzYWdlQ29udGVudC50eXBlLnR5cGUsIG9yaWdpbmFsVHlwZSk7XHJcbiAgICAgICAgfX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUNvbG9yZWRUZXh0KCkge1xyXG4gICAgICAgIGxldCBjbGFzc05hbWVNYXJrdXAgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJrdXApWzBdLm1hcmt1cFxyXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIuXCIrY2xhc3NOYW1lTWFya3VwLnNwbGl0KFwiIFwiKVswXSkuZm9yRWFjaChlbGVtID0+IHtcclxuICAgICAgICAgICAgZWxlbS5zdHlsZS5zZXRQcm9wZXJ0eShcImNvbG9yXCIsIFwiXCIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59OyIsImltcG9ydCB7YmRDb25maWcsIGJkcGx1Z2lucywgYmR0aGVtZXMsIHNldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9wbHVnaW5Nb2R1bGVcIjtcclxuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQgZGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgeyBlbmNyeXB0U2V0dGluZ3NDYWNoZSwgZGVjcnlwdFNldHRpbmdzQ2FjaGUsIHByb2Nlc3NGaWxlIH0gZnJvbSBcIi4vcGx1Z2luQ2VydGlmaWVyXCI7XHJcblxyXG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XHJcbmNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xyXG5jb25zdCBNb2R1bGUgPSByZXF1aXJlKFwibW9kdWxlXCIpLk1vZHVsZTtcclxuTW9kdWxlLmdsb2JhbFBhdGhzLnB1c2gocGF0aC5yZXNvbHZlKHJlcXVpcmUoXCJlbGVjdHJvblwiKS5yZW1vdGUuYXBwLmdldEFwcFBhdGgoKSwgXCJub2RlX21vZHVsZXNcIikpO1xyXG5jbGFzcyBNZXRhRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XHJcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJNZXRhRXJyb3JcIjtcclxuICAgIH1cclxufVxyXG5jb25zdCBvcmlnaW5hbEpTUmVxdWlyZSA9IE1vZHVsZS5fZXh0ZW5zaW9uc1tcIi5qc1wiXTtcclxuY29uc3Qgb3JpZ2luYWxDU1NSZXF1aXJlID0gTW9kdWxlLl9leHRlbnNpb25zW1wiLmNzc1wiXSA/IE1vZHVsZS5fZXh0ZW5zaW9uc1tcIi5jc3NcIl0gOiAoKSA9PiB7cmV0dXJuIG51bGw7fTtcclxuY29uc3Qgc3BsaXRSZWdleCA9IC9bXlxcU1xcclxcbl0qPyg/OlxcclxcbnxcXG4pW15cXFNcXHJcXG5dKj9cXCpbXlxcU1xcclxcbl0/LztcclxuY29uc3QgZXNjYXBlZEF0UmVnZXggPSAvXlxcXFxALztcclxuXHJcbmV4cG9ydCBsZXQgYWRkb25DYWNoZSA9IHt9XHJcblxyXG5sZXQgaGFzUGF0Y2hlZCA9IGZhbHNlXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBDb250ZW50TWFuYWdlciB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy50aW1lQ2FjaGUgPSB7fTtcclxuICAgICAgICB0aGlzLndhdGNoZXJzID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgcGF0Y2hFeHRlbnNpb25zKCl7XHJcbiAgICAgICAgaWYoaGFzUGF0Y2hlZClyZXR1cm5cclxuICAgICAgICBoYXNQYXRjaGVkID0gdHJ1ZVxyXG4gICAgICAgIE1vZHVsZS5fZXh0ZW5zaW9uc1tcIi5qc1wiXSA9IHRoaXMuZ2V0Q29udGVudFJlcXVpcmUoXCJwbHVnaW5cIik7XHJcbiAgICAgICAgTW9kdWxlLl9leHRlbnNpb25zW1wiLmNzc1wiXSA9IHRoaXMuZ2V0Q29udGVudFJlcXVpcmUoXCJ0aGVtZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcGx1Z2luc0ZvbGRlcigpIHtyZXR1cm4gdGhpcy5fcGx1Z2luc0ZvbGRlciB8fCAodGhpcy5fcGx1Z2luc0ZvbGRlciA9IGZzLnJlYWxwYXRoU3luYyhwYXRoLnJlc29sdmUoYmRDb25maWcuZGF0YVBhdGggKyBcInBsdWdpbnMvXCIpKSk7fVxyXG4gICAgZ2V0IHRoZW1lc0ZvbGRlcigpIHtyZXR1cm4gdGhpcy5fdGhlbWVzRm9sZGVyIHx8ICh0aGlzLl90aGVtZXNGb2xkZXIgPSBmcy5yZWFscGF0aFN5bmMocGF0aC5yZXNvbHZlKGJkQ29uZmlnLmRhdGFQYXRoICsgXCJ0aGVtZXMvXCIpKSk7fVxyXG5cclxuICAgIGxvYWRBZGRvbkNlcnRpZmllckNhY2hlKCl7XHJcbiAgICAgICAgaWYodHlwZW9mIGRhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJQbHVnaW5DZXJ0aWZpZXJIYXNoZXNcIikgIT09IFwic3RyaW5nXCIpe1xyXG4gICAgICAgICAgICBkYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwiUGx1Z2luQ2VydGlmaWVySGFzaGVzXCIsIGVuY3J5cHRTZXR0aW5nc0NhY2hlKFwie31cIikpXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIGFkZG9uQ2FjaGUgPSBKU09OLnBhcnNlKGRlY3J5cHRTZXR0aW5nc0NhY2hlKGRhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJQbHVnaW5DZXJ0aWZpZXJIYXNoZXNcIikpKVxyXG4gICAgICAgICAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgICAgICAgICBkYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwiUGx1Z2luQ2VydGlmaWVySGFzaGVzXCIsIGVuY3J5cHRTZXR0aW5nc0NhY2hlKFwie31cIikpXHJcbiAgICAgICAgICAgICAgICBhZGRvbkNhY2hlID0ge31cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBPYmplY3Qua2V5cyhhZGRvbkNhY2hlKVxyXG4gICAgICAgIC5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGFkZG9uQ2FjaGVba2V5XVxyXG4gICAgICAgICAgICBpZighdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKXJldHVybiBkZWxldGUgYWRkb25DYWNoZVtrZXldXHJcblxyXG4gICAgICAgICAgICBsZXQgcHJvcHMgPSBbe1xyXG4gICAgICAgICAgICAgICAga2V5OiBcInRpbWVzdGFtcFwiLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJudW1iZXJcIlxyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICBrZXk6IFwicmVzdWx0XCIsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiXHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIGtleTogXCJoYXNoXCIsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiXHJcbiAgICAgICAgICAgIH1dXHJcbiAgICAgICAgICAgIGZvcihsZXQgcHJvcCBvZiBwcm9wcyl7XHJcbiAgICAgICAgICAgICAgICBpZighKHByb3Aua2V5IGluIHZhbHVlKSB8fCB0eXBlb2YgdmFsdWVbcHJvcC5rZXldICE9PSBwcm9wLnR5cGUpe1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhZGRvbkNhY2hlW2tleV1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZih2YWx1ZS5oYXNoICE9PSBrZXkpe1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGFkZG9uQ2FjaGVba2V5XVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYodmFsdWUucmVzdWx0LnN1c3BlY3QpeyAvLyByZWZldGNoIGZyb20gcmVtb3RlIHRvIGJlIHN1cmUgeW91J3JlIHVwIHRvIGRhdGUuXHJcbiAgICAgICAgICAgICAgICBkZWxldGUgYWRkb25DYWNoZVtrZXldXHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5zYXZlQWRkb25DYWNoZSgpXHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZUFkZG9uQ2FjaGUoKXtcclxuICAgICAgICBkYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwiUGx1Z2luQ2VydGlmaWVySGFzaGVzXCIsIGVuY3J5cHRTZXR0aW5nc0NhY2hlKEpTT04uc3RyaW5naWZ5KGFkZG9uQ2FjaGUpKSlcclxuICAgIH1cclxuXHJcbiAgICB3YXRjaENvbnRlbnQoY29udGVudFR5cGUpIHtcclxuICAgICAgICBpZiAodGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV0pIHJldHVybjtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IGNvbnRlbnRUeXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGJhc2VGb2xkZXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xyXG4gICAgICAgIGNvbnN0IGZpbGVFbmRpbmcgPSBpc1BsdWdpbiA/IFwiLnBsdWdpbi5qc1wiIDogXCIudGhlbWUuY3NzXCI7XHJcbiAgICAgICAgdGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV0gPSBmcy53YXRjaChiYXNlRm9sZGVyLCB7cGVyc2lzdGVudDogZmFsc2V9LCBhc3luYyAoZXZlbnRUeXBlLCBmaWxlbmFtZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWV2ZW50VHlwZSB8fCAhZmlsZW5hbWUgfHwgIWZpbGVuYW1lLmVuZHNXaXRoKGZpbGVFbmRpbmcpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCA1MCkpO1xyXG4gICAgICAgICAgICB0cnkge2ZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpO31cclxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVyci5jb2RlICE9PSBcIkVOT0VOVFwiKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy50aW1lQ2FjaGVbZmlsZW5hbWVdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzUGx1Z2luKSByZXR1cm4gcGx1Z2luTW9kdWxlLnVubG9hZFBsdWdpbihmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhlbWVNb2R1bGUudW5sb2FkVGhlbWUoZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSkuaXNGaWxlKCkpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBmcy5zdGF0U3luYyhwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTtcclxuICAgICAgICAgICAgaWYgKCFzdGF0cyB8fCAhc3RhdHMubXRpbWUgfHwgIXN0YXRzLm10aW1lLmdldFRpbWUoKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mKHN0YXRzLm10aW1lLmdldFRpbWUoKSkgIT09IFwibnVtYmVyXCIpIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKHRoaXMudGltZUNhY2hlW2ZpbGVuYW1lXSA9PSBzdGF0cy5tdGltZS5nZXRUaW1lKCkpIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy50aW1lQ2FjaGVbZmlsZW5hbWVdID0gc3RhdHMubXRpbWUuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09IFwicmVuYW1lXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc1BsdWdpbikgYXdhaXQgcGx1Z2luTW9kdWxlLmxvYWRQbHVnaW4oZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBhd2FpdCB0aGVtZU1vZHVsZS5sb2FkVGhlbWUoZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gXCJjaGFuZ2VcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzUGx1Z2luKSBhd2FpdCBwbHVnaW5Nb2R1bGUucmVsb2FkUGx1Z2luKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgYXdhaXQgdGhlbWVNb2R1bGUucmVsb2FkVGhlbWUoZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdW53YXRjaENvbnRlbnQoY29udGVudFR5cGUpIHtcclxuICAgICAgICBpZiAoIXRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV0uY2xvc2UoKTtcclxuICAgICAgICBkZWxldGUgdGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV07XHJcbiAgICB9XHJcblxyXG4gICAgZXh0cmFjdE1ldGEoY29udGVudCkge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0TGluZSA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIilbMF07XHJcbiAgICAgICAgY29uc3QgaGFzT2xkTWV0YSA9IGZpcnN0TGluZS5pbmNsdWRlcyhcIi8vTUVUQVwiKTtcclxuICAgICAgICBpZiAoaGFzT2xkTWV0YSkgcmV0dXJuIHRoaXMucGFyc2VPbGRNZXRhKGNvbnRlbnQpO1xyXG4gICAgICAgIGNvbnN0IGhhc05ld01ldGEgPSBmaXJzdExpbmUuaW5jbHVkZXMoXCIvKipcIik7XHJcbiAgICAgICAgaWYgKGhhc05ld01ldGEpIHJldHVybiB0aGlzLnBhcnNlTmV3TWV0YShjb250ZW50KTtcclxuICAgICAgICB0aHJvdyBuZXcgTWV0YUVycm9yKFwiTUVUQSB3YXMgbm90IGZvdW5kLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXJzZU9sZE1ldGEoY29udGVudCkge1xyXG4gICAgICAgIGNvbnN0IG1ldGEgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpWzBdO1xyXG4gICAgICAgIGNvbnN0IHJhd01ldGEgPSBtZXRhLnN1YnN0cmluZyhtZXRhLmxhc3RJbmRleE9mKFwiLy9NRVRBXCIpICsgNiwgbWV0YS5sYXN0SW5kZXhPZihcIiovL1wiKSk7XHJcbiAgICAgICAgaWYgKG1ldGEuaW5kZXhPZihcIk1FVEFcIikgPCAwKSB0aHJvdyBuZXcgTWV0YUVycm9yKFwiTUVUQSB3YXMgbm90IGZvdW5kLlwiKTtcclxuICAgICAgICBjb25zdCBwYXJzZWQgPSBVdGlscy50ZXN0SlNPTihyYXdNZXRhKTtcclxuICAgICAgICBpZiAoIXBhcnNlZCkgdGhyb3cgbmV3IE1ldGFFcnJvcihcIk1FVEEgY291bGQgbm90IGJlIHBhcnNlZC5cIik7XHJcbiAgICAgICAgaWYgKCFwYXJzZWQubmFtZSkgdGhyb3cgbmV3IE1ldGFFcnJvcihcIk1FVEEgbWlzc2luZyBuYW1lIGRhdGEuXCIpO1xyXG4gICAgICAgIHBhcnNlZC5mb3JtYXQgPSBcImpzb25cIjtcclxuICAgICAgICByZXR1cm4gcGFyc2VkO1xyXG4gICAgfVxyXG5cclxuICAgIHBhcnNlTmV3TWV0YShjb250ZW50KSB7XHJcbiAgICAgICAgY29uc3QgYmxvY2sgPSBjb250ZW50LnNwbGl0KFwiLyoqXCIsIDIpWzFdLnNwbGl0KFwiKi9cIiwgMSlbMF07XHJcbiAgICAgICAgY29uc3Qgb3V0ID0ge307XHJcbiAgICAgICAgbGV0IGZpZWxkID0gXCJcIjtcclxuICAgICAgICBsZXQgYWNjdW0gPSBcIlwiO1xyXG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBibG9jay5zcGxpdChzcGxpdFJlZ2V4KSkge1xyXG4gICAgICAgICAgICBpZiAobGluZS5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAobGluZS5jaGFyQXQoMCkgPT09IFwiQFwiICYmIGxpbmUuY2hhckF0KDEpICE9PSBcIiBcIikge1xyXG4gICAgICAgICAgICAgICAgb3V0W2ZpZWxkXSA9IGFjY3VtO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbCA9IGxpbmUuaW5kZXhPZihcIiBcIik7XHJcbiAgICAgICAgICAgICAgICBmaWVsZCA9IGxpbmUuc3Vic3RyKDEsIGwgLSAxKTtcclxuICAgICAgICAgICAgICAgIGFjY3VtID0gbGluZS5zdWJzdHIobCArIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYWNjdW0gKz0gXCIgXCIgKyBsaW5lLnJlcGxhY2UoXCJcXFxcblwiLCBcIlxcblwiKS5yZXBsYWNlKGVzY2FwZWRBdFJlZ2V4LCBcIkBcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgb3V0W2ZpZWxkXSA9IGFjY3VtLnRyaW0oKTtcclxuICAgICAgICBkZWxldGUgb3V0W1wiXCJdO1xyXG4gICAgICAgIG91dC5mb3JtYXQgPSBcImpzZG9jXCI7XHJcbiAgICAgICAgcmV0dXJuIG91dDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb250ZW50UmVxdWlyZSh0eXBlKSB7XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVxdWlyZSA9IGlzUGx1Z2luID8gb3JpZ2luYWxKU1JlcXVpcmUgOiBvcmlnaW5hbENTU1JlcXVpcmU7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKG1vZHVsZSwgZmlsZW5hbWUpIHtcclxuICAgICAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gc2VsZi5wbHVnaW5zRm9sZGVyIDogc2VsZi50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc3NpYmxlUGF0aCA9IHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBwYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSk7XHJcbiAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwb3NzaWJsZVBhdGgpIHx8IGZpbGVuYW1lICE9PSBmcy5yZWFscGF0aFN5bmMocG9zc2libGVQYXRoKSkgcmV0dXJuIFJlZmxlY3QuYXBwbHkob3JpZ2luYWxSZXF1aXJlLCB0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlbmFtZSwgXCJ1dGY4XCIpO1xyXG4gICAgICAgICAgICBjb250ZW50ID0gVXRpbHMuc3RyaXBCT00oY29udGVudCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzdGF0cyA9IGZzLnN0YXRTeW5jKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgY29uc3QgbWV0YSA9IHNlbGYuZXh0cmFjdE1ldGEoY29udGVudCk7XHJcbiAgICAgICAgICAgIG1ldGEuZmlsZW5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgbWV0YS5hZGRlZCA9IHN0YXRzLmF0aW1lTXM7XHJcbiAgICAgICAgICAgIG1ldGEubW9kaWZpZWQgPSBzdGF0cy5tdGltZU1zO1xyXG4gICAgICAgICAgICBtZXRhLnNpemUgPSBzdGF0cy5zaXplO1xyXG4gICAgICAgICAgICBpZiAoIWlzUGx1Z2luKSB7XHJcbiAgICAgICAgICAgICAgICBtZXRhLmNzcyA9IGNvbnRlbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAobWV0YS5mb3JtYXQgPT0gXCJqc29uXCIpIG1ldGEuY3NzID0gbWV0YS5jc3Muc3BsaXQoXCJcXG5cIikuc2xpY2UoMSkuam9pbihcIlxcblwiKTtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBgbW9kdWxlLmV4cG9ydHMgPSAke0pTT04uc3RyaW5naWZ5KG1ldGEpfTtgO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpc1BsdWdpbikge1xyXG4gICAgICAgICAgICAgICAgbW9kdWxlLl9jb21waWxlKGNvbnRlbnQsIG1vZHVsZS5maWxlbmFtZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaWRFeHBvcnQgPSAhVXRpbHMuaXNFbXB0eShtb2R1bGUuZXhwb3J0cyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlkRXhwb3J0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWV0YS50eXBlID0gbW9kdWxlLmV4cG9ydHM7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBtZXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgVXRpbHMud2FybihcIk1vZHVsZSBOb3QgRXhwb3J0ZWRcIiwgYCR7bWV0YS5uYW1lfSwgcGxlYXNlIHN0YXJ0IHNldHRpbmcgbW9kdWxlLmV4cG9ydHNgKTtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGBcXG5tb2R1bGUuZXhwb3J0cyA9ICR7SlNPTi5zdHJpbmdpZnkobWV0YSl9O1xcbm1vZHVsZS5leHBvcnRzLnR5cGUgPSAke21ldGEuZXhwb3J0cyB8fCBtZXRhLm5hbWV9O2A7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbW9kdWxlLl9jb21waWxlKGNvbnRlbnQsIGZpbGVuYW1lKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIG1ha2VQbGFjZWhvbGRlclBsdWdpbihkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIHtwbHVnaW46IHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0OiAoKSA9PiB7fSxcclxuICAgICAgICAgICAgICAgIGdldE5hbWU6ICgpID0+IHtyZXR1cm4gZGF0YS5uYW1lIHx8IGRhdGEuZmlsZW5hbWU7fSxcclxuICAgICAgICAgICAgICAgIGdldEF1dGhvcjogKCkgPT4ge3JldHVybiBcIj8/P1wiO30sXHJcbiAgICAgICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogKCkgPT4ge3JldHVybiBkYXRhLm1lc3NhZ2UgPyBkYXRhLm1lc3NhZ2UgOiBcIlRoaXMgcGx1Z2luIHdhcyB1bmFibGUgdG8gYmUgbG9hZGVkLiBDaGVjayB0aGUgYXV0aG9yJ3MgcGFnZSBmb3IgdXBkYXRlcy5cIjt9LFxyXG4gICAgICAgICAgICAgICAgZ2V0VmVyc2lvbjogKCkgPT4ge3JldHVybiBcIj8/P1wiO31cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbmFtZTogZGF0YS5uYW1lIHx8IGRhdGEuZmlsZW5hbWUsXHJcbiAgICAgICAgICAgIGZpbGVuYW1lOiBkYXRhLmZpbGVuYW1lLFxyXG4gICAgICAgICAgICBzb3VyY2U6IGRhdGEuc291cmNlID8gZGF0YS5zb3VyY2UgOiBcIlwiLFxyXG4gICAgICAgICAgICB3ZWJzaXRlOiBkYXRhLndlYnNpdGUgPyBkYXRhLndlYnNpdGUgOiBcIlwiXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBsb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YoZmlsZW5hbWUpID09PSBcInVuZGVmaW5lZFwiIHx8IHR5cGVvZih0eXBlKSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuXHJcbiAgICAgICAgaWYoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTZcIl0pe1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzRmlsZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpLCAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KVxyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KVxyXG4gICAgICAgICAgICAgICAgfSwgKGhhc2gpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVjdDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc2g6IGhhc2gsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBmaWxlbmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZmlsZW5hbWVcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSwgdHJ1ZSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgaWYocmVzdWx0KXtcclxuICAgICAgICAgICAgICAgIGFkZG9uQ2FjaGVbcmVzdWx0Lmhhc2hdID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcclxuICAgICAgICAgICAgICAgICAgICBoYXNoOiByZXN1bHQuaGFzaCxcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlQWRkb25DYWNoZSgpXHJcbiAgICAgICAgICAgICAgICBpZihyZXN1bHQuc3VzcGVjdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZmlsZW5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGZpbGVuYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIlRoaXMgcGx1Z2luIG1pZ2h0IGJlIGRhbmdlcm91cyAoXCIrcmVzdWx0Lmhhcm0rXCIpLlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKFwiVGhpcyBwbHVnaW4gbWlnaHQgYmUgZGFuZ2Vyb3VzIChcIityZXN1bHQuaGFybStcIikuXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0cnkge3dpbmRvdy5yZXF1aXJlKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpO31cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJDb3VsZCBub3QgYmUgY29tcGlsZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyb3IubWVzc2FnZSwgc3RhY2s6IGVycm9yLnN0YWNrfX07fVxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB3aW5kb3cucmVxdWlyZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTtcclxuICAgICAgICBpZighY29udGVudC5uYW1lKXJldHVybiB7bmFtZTogZmlsZW5hbWUsIGZpbGU6IGZpbGVuYW1lLCBtZXNzYWdlOiBcIkNhbm5vdCBlc2NhcGUgdGhlIElELlwiLCBlcnJvcjogbmV3IEVycm9yKFwiQ2Fubm90IHJlYWQgcHJvcGVydHkgJ3JlcGxhY2UnIG9mIHVuZGVmaW5lZFwiKX1cclxuICAgICAgICBjb250ZW50LmlkID0gVXRpbHMuZXNjYXBlSUQoY29udGVudC5uYW1lKTtcclxuICAgICAgICAvL2lmKCFpZClyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJJbnZhbGlkIElEXCIsIGVycm9yOiBuZXcgRXJyb3IoXCJQbGVhc2UgZml4IHRoZSBuYW1lIG9mIFwiK2ZpbGVuYW1lK1wiLiBCZXR0ZXJEaXNjb3JkIGNhbid0IGVzY2FwZSBhbiBJRC5cIil9XHJcbiAgICAgICAgaWYgKGlzUGx1Z2luKSB7XHJcbiAgICAgICAgICAgIGlmICghY29udGVudC50eXBlKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50LnBsdWdpbiA9IG5ldyBjb250ZW50LnR5cGUoKTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBiZHBsdWdpbnNbY29udGVudC5wbHVnaW4uZ2V0TmFtZSgpXTtcclxuICAgICAgICAgICAgICAgIGJkcGx1Z2luc1tjb250ZW50LnBsdWdpbi5nZXROYW1lKCldID0gY29udGVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJDb3VsZCBub3QgYmUgY29uc3RydWN0ZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyb3IubWVzc2FnZSwgc3RhY2s6IGVycm9yLnN0YWNrfX07fVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZGVsZXRlIGJkdGhlbWVzW2NvbnRlbnQubmFtZV07XHJcbiAgICAgICAgICAgIGJkdGhlbWVzW2NvbnRlbnQubmFtZV0gPSBjb250ZW50O1xyXG4gICAgICAgIH1cclxuICAgIH0gICBcclxuXHJcbiAgICB1bmxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZihmaWxlbmFtZSkgPT09IFwidW5kZWZpbmVkXCIgfHwgdHlwZW9mKHR5cGUpID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGJhc2VGb2xkZXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB3aW5kb3cucmVxdWlyZS5jYWNoZVt3aW5kb3cucmVxdWlyZS5yZXNvbHZlKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikge3JldHVybiB7bmFtZTogZmlsZW5hbWUsIGZpbGU6IGZpbGVuYW1lLCBtZXNzYWdlOiBcIkNvdWxkIG5vdCBiZSB1bmxvYWRlZC5cIiwgZXJyb3I6IHttZXNzYWdlOiBlcnIubWVzc2FnZSwgc3RhY2s6IGVyci5zdGFja319O31cclxuICAgIH1cclxuXHJcbiAgICBpc0xvYWRlZChmaWxlbmFtZSwgdHlwZSkge1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICB0cnkge3dpbmRvdy5yZXF1aXJlLmNhY2hlW3dpbmRvdy5yZXF1aXJlLnJlc29sdmUocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSldO31cclxuICAgICAgICBjYXRjaCAoZXJyKSB7cmV0dXJuIGZhbHNlO31cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZWxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKSB7XHJcbiAgICAgICAgY29uc3QgY2FudFVubG9hZCA9IHRoaXMudW5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSk7XHJcbiAgICAgICAgaWYgKGNhbnRVbmxvYWQpIHJldHVybiBjYW50VW5sb2FkO1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkTmV3Q29udGVudCh0eXBlKSB7XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGZpbGVFbmRpbmcgPSBpc1BsdWdpbiA/IFwiLnBsdWdpbi5qc1wiIDogXCIudGhlbWUuY3NzXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZWRpciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhiYXNlZGlyKTtcclxuICAgICAgICBjb25zdCBjb250ZW50TGlzdCA9IE9iamVjdC52YWx1ZXMoaXNQbHVnaW4gPyBiZHBsdWdpbnMgOiBiZHRoZW1lcyk7XHJcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGNvbnRlbnRMaXN0LmZpbHRlcih0ID0+ICFmaWxlcy5pbmNsdWRlcyh0LmZpbGVuYW1lKSkubWFwKGMgPT4gaXNQbHVnaW4gPyBjLnBsdWdpbi5nZXROYW1lKCkgOiBjLm5hbWUpO1xyXG4gICAgICAgIGNvbnN0IGFkZGVkID0gZmlsZXMuZmlsdGVyKGYgPT4gIWNvbnRlbnRMaXN0LmZpbmQodCA9PiB0LmZpbGVuYW1lID09IGYpICYmIGYuZW5kc1dpdGgoZmlsZUVuZGluZykgJiYgZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VkaXIsIGYpKS5pc0ZpbGUoKSk7XHJcbiAgICAgICAgcmV0dXJuIHthZGRlZCwgcmVtb3ZlZH07XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZEFsbENvbnRlbnQodHlwZSkge1xyXG4gICAgICAgIHRoaXMucGF0Y2hFeHRlbnNpb25zKClcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgZmlsZUVuZGluZyA9IGlzUGx1Z2luID8gXCIucGx1Z2luLmpzXCIgOiBcIi50aGVtZS5jc3NcIjtcclxuICAgICAgICBjb25zdCBiYXNlZGlyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTtcclxuICAgICAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGJhc2VkaXIpO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZpbGVzKSB7XHJcbiAgICAgICAgICAgIGlmICghZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VkaXIsIGZpbGVuYW1lKSkuaXNGaWxlKCkgfHwgIWZpbGVuYW1lLmVuZHNXaXRoKGZpbGVFbmRpbmcpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCB0aGlzLmxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKTtcclxuICAgICAgICAgICAgaWYgKGVycm9yKSBlcnJvcnMucHVzaChlcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZXJyb3JzO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRQbHVnaW5zKCkge3JldHVybiB0aGlzLmxvYWRBbGxDb250ZW50KFwicGx1Z2luXCIpO31cclxuICAgIGxvYWRUaGVtZXMoKSB7cmV0dXJuIHRoaXMubG9hZEFsbENvbnRlbnQoXCJ0aGVtZVwiKTt9XHJcbn07XHJcblxyXG4vKipcclxuICogRG9uJ3QgZXhwb3NlIGNvbnRlbnRNYW5hZ2VyIC0gY291bGQgYmUgZGFuZ2Vyb3VzIGZvciBub3dcclxuICovIiwiaW1wb3J0IHtiZENvbmZpZywgbWluU3VwcG9ydGVkVmVyc2lvbiwgYmJkVmVyc2lvbiwgc2V0dGluZ3NDb29raWUsIGJkcGx1Z2luRXJyb3JzLCBiZHRoZW1lRXJyb3JzLCBiYmRDaGFuZ2Vsb2csIGRlZmF1bHRDb29raWUsIGN1cnJlbnREaXNjb3JkVmVyc2lvbiwgZGVmYXVsdFJQQywgc2V0dGluZ3NSUEN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9wbHVnaW5Nb2R1bGVcIjtcclxuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi93ZWJwYWNrTW9kdWxlc1wiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgQkRMb2dvIGZyb20gXCIuLi91aS9iZExvZ29cIjtcclxuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuLi91aS90b29sdGlwV3JhcFwiO1xyXG5pbXBvcnQgTGlnaHRjb3JkTG9nbyBmcm9tIFwiLi4vc3ZnL2xpZ2h0Y29yZFwiO1xyXG5pbXBvcnQgUGx1Z2luQ2VydGlmaWVyIGZyb20gXCIuL3BsdWdpbkNlcnRpZmllclwiO1xyXG5pbXBvcnQgZGlzdGFudCwgeyB1dWlkdjQgfSBmcm9tIFwiLi9kaXN0YW50XCI7XHJcbmltcG9ydCBFbW9qaU1vZHVsZSBmcm9tIFwiLi9lbW9qaU1vZHVsZVwiXHJcbmltcG9ydCB7cmVtb3RlIGFzIGVsZWN0cm9ufSBmcm9tIFwiZWxlY3Ryb25cIlxyXG5pbXBvcnQgdjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IGNvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCI7XHJcblxyXG5sZXQgbWV0aG9kc1xyXG5mdW5jdGlvbiBDb3JlKCkge31cclxuXHJcblxyXG5Db3JlLnByb3RvdHlwZS5zZXRDb25maWcgPSBmdW5jdGlvbihjb25maWcpIHtcclxuICAgIGlmICh0aGlzLmhhc1N0YXJ0ZWQpIHJldHVybjtcclxuICAgIE9iamVjdC5hc3NpZ24oYmRDb25maWcsIGNvbmZpZyk7XHJcbn07XHJcblxyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQ29yZS5wcm90b3R5cGUsIFwibWV0aG9kc1wiLCB7XHJcbiAgICBnZXQoKXtcclxuICAgICAgICByZXR1cm4gbWV0aG9kc1xyXG4gICAgfVxyXG59KVxyXG5cclxuQ29yZS5wcm90b3R5cGUuc2V0TWV0aG9kcyA9IGZ1bmN0aW9uKG0pIHtcclxuICAgIGlmICh0aGlzLmhhc1N0YXJ0ZWQpIHJldHVybjtcclxuICAgIG1ldGhvZHMgPSBtXHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5pbml0ID0gYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5oYXNTdGFydGVkKSByZXR1cm47XHJcbiAgICB0aGlzLmhhc1N0YXJ0ZWQgPSB0cnVlO1xyXG5cclxuICAgIGlmICghQXJyYXkucHJvdG90eXBlLmZsYXQpIHtcclxuICAgICAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCZXR0ZXJEaXNjb3JkIHZcIiArIGJiZFZlcnNpb24gKyBcIiBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb2xkIHZlcnNpb24gKFwiICsgY3VycmVudERpc2NvcmRWZXJzaW9uICsgXCIpIG9mIERpc2NvcmQuIFBsZWFzZSB1cGRhdGUgeW91ciBEaXNjb3JkIGluc3RhbGxhdGlvbiBiZWZvcmUgcHJvY2VlZGluZy5cIik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChiZENvbmZpZy52ZXJzaW9uIDwgbWluU3VwcG9ydGVkVmVyc2lvbikge1xyXG4gICAgICAgIFV0aWxzLmFsZXJ0KFwiTm90IFN1cHBvcnRlZFwiLCBcIkJldHRlckRpc2NvcmQgdlwiICsgYmRDb25maWcudmVyc2lvbiArIFwiICh5b3VyIHZlcnNpb24pXCIgKyBcIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBsYXRlc3QganMgKFwiICsgYmJkVmVyc2lvbiArIFwiKS48YnI+PGJyPiBQbGVhc2UgZG93bmxvYWQgdGhlIGxhdGVzdCB2ZXJzaW9uIGZyb20gPGEgaHJlZj0naHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC9yZWxlYXNlcy9sYXRlc3QnIHRhcmdldD0nX2JsYW5rJz5HaXRIdWI8L2E+XCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAod2luZG93LkVEKSB7XHJcbiAgICAgICAgVXRpbHMuYWxlcnQoXCJOb3QgU3VwcG9ydGVkXCIsIFwiQmFuZGFnZWRCRCBkb2VzIG5vdCB3b3JrIHdpdGggRW5oYW5jZWREaXNjb3JkLiBQbGVhc2UgdW5pbnN0YWxsIG9uZSBvZiB0aGVtLlwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHdpbmRvdy5XZWJTb2NrZXQgJiYgd2luZG93LldlYlNvY2tldC5uYW1lICYmIHdpbmRvdy5XZWJTb2NrZXQubmFtZS5pbmNsdWRlcyhcIlBhdGNoZWRcIikpIHtcclxuICAgICAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCYW5kYWdlZEJEIGRvZXMgbm90IHdvcmsgd2l0aCBQb3dlcmNvcmQuIFBsZWFzZSB1bmluc3RhbGwgb25lIG9mIHRoZW0uXCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoQXR0cmlidXRlcy5iaW5kKHRoaXMpLCBcIkxDIFBsdWdpbiBDZXJ0aWZpZXIgUGF0Y2hcIikoKTtcclxuXHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiSW5pdGlhbGl6aW5nIFNldHRpbmdzXCIpO1xyXG4gICAgdGhpcy5pbml0U2V0dGluZ3MoKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLmNoZWNrRm9yR3VpbGRzKCk7XHJcbiAgICBCRFYyLmluaXRpYWxpemUoKTtcclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJVcGRhdGluZyBTZXR0aW5nc1wiKTtcclxuICAgIHNldHRpbmdzUGFuZWwuaW5pdGlhbGl6ZVNldHRpbmdzKCk7XHJcblxyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkxvYWRpbmcgQWRkb25zIENhY2hlXCIpXHJcbiAgICBhd2FpdCBjb250ZW50TWFuYWdlci5sb2FkQWRkb25DZXJ0aWZpZXJDYWNoZSgpXHJcblxyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkxvYWRpbmcgUGx1Z2luc1wiKTtcclxuICAgIGF3YWl0IHBsdWdpbk1vZHVsZS5sb2FkUGx1Z2lucygpO1xyXG5cclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJMb2FkaW5nIFRoZW1lc1wiKTtcclxuICAgIGF3YWl0IHRoZW1lTW9kdWxlLmxvYWRUaGVtZXMoKTtcclxuXHJcbiAgICBET00uYWRkU3R5bGUoXCJjdXN0b21jc3NcIiwgQnVmZmVyLmZyb20oRGF0YVN0b3JlLmdldEJERGF0YShcImJkY3VzdG9tY3NzXCIpLCBcImJhc2U2NFwiKS50b1N0cmluZyhcInV0ZjhcIikpO1xyXG5cclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1kYy0wXCJdKSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmJ0bi5idG4tZGlzY29ubmVjdFwiKS5jbGljaygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgUGx1Z2luQ2VydGlmaWVyLnN0YXJ0KClcclxuXHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiUmVtb3ZpbmcgTG9hZGluZyBJY29uXCIpO1xyXG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJiZC1sb2FkZXJ2MlwiKS5sZW5ndGgpIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJiZC1sb2FkZXJ2MlwiKVswXS5yZW1vdmUoKTtcclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJJbml0aWFsaXppbmcgTWFpbiBPYnNlcnZlclwiKTtcclxuICAgIHRoaXMuaW5pdE9ic2VydmVyKCk7XHJcblxyXG4gICAgLy8gU2hvdyBsb2FkaW5nIGVycm9yc1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSB7XHJcbiAgICAgICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkNvbGxlY3RpbmcgU3RhcnR1cCBFcnJvcnNcIik7XHJcbiAgICAgICAgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IGJkcGx1Z2luRXJyb3JzLCB0aGVtZXM6IGJkdGhlbWVFcnJvcnN9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwcmV2aW91c1ZlcnNpb24gPSBEYXRhU3RvcmUuZ2V0QkREYXRhKFwidmVyc2lvblwiKTtcclxuICAgIGlmIChiYmRWZXJzaW9uID4gcHJldmlvdXNWZXJzaW9uKSB7XHJcbiAgICAgICAgaWYgKGJiZENoYW5nZWxvZykgdGhpcy5zaG93Q2hhbmdlbG9nTW9kYWwoYmJkQ2hhbmdlbG9nKTtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0QkREYXRhKFwidmVyc2lvblwiLCBiYmRWZXJzaW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBFbW9qaU1vZHVsZS5zdGFydCgpXHJcblxyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaFNvY2lhbC5iaW5kKHRoaXMpLCBcIkJEIFNvY2lhbCBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEd1aWxkUGlsbHMuYmluZCh0aGlzKSwgXCJCRCBHdWlsZCBQaWxscyBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEd1aWxkTGlzdEl0ZW1zLmJpbmQodGhpcyksIFwiQkQgR3VpbGQgTGlzdCBJdGVtcyBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEd1aWxkU2VwYXJhdG9yLmJpbmQodGhpcyksIFwiQkQgR3VpbGQgU2VwYXJhdG9yIFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoTWVzc2FnZUhlYWRlci5iaW5kKHRoaXMpLCBcIkJEIEJhZGdlIENoYXQgUGF0Y2hcIikoKTtcclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hNZW1iZXJMaXN0LmJpbmQodGhpcyksIFwiQkQgQmFkZ2UgTWVtYmVyIExpc3QgUGF0Y2hcIikoKTtcclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hBdHRhY2htZW50LmJpbmQodGhpcyksIFwiTEMgUGx1Z2luIENlcnRpZmllciBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaFBvcG91dFdpbmRvdy5iaW5kKHRoaXMpLCBcIkJEIFBvcG91dCBXaW5kb3cgUGF0Y2hcIikoKTtcclxuXHJcbiAgICBpZihiZENvbmZpZy5oYXZlSW5zdGFsbGVkRGVmYXVsdCl7XHJcbiAgICAgICAgbGV0IGFsZXJ0ID0gVXRpbHMuYWxlcnQoXCJGaXJzdCBJbnN0YWxsYXRpb25cIiwgXCJBcyBpdCBpcyB0aGUgZmlyc3QgdGltZSB5b3UgaW5zdGFsbCBMaWdodGNvcmQsIFdlIGFkZGVkIHR3byBkZWZhdWx0IHRoZW1lcyBhbmQgb25lIGRlZmF1bHQgcGx1Z2luIGluIHlvdXIgcGx1Z2luL3RoZW1lIGZvbGRlci4gQ2hlY2sgaXQgaW4gdGhlIFBsdWdpbi9UaGVtZSBzZXR0aW5ncy5cIilcclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICBhbGVydC5vbkNsb3NlKHJlc29sdmUpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgIGNvbnN0IGxvZ28gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2FwcC1tb3VudCA+IGRpdi50eXBlV2luZG93cy0xemEtbjcud2l0aEZyYW1lLWhhWWx0SS50aXRsZUJhci1BQzRwR1YuaG9yaXpvbnRhbFJldmVyc2UtM3RSalk3LmZsZXgtMU8xR0tZLmRpcmVjdGlvblJvd1JldmVyc2UtbThJaklxLmp1c3RpZnlTdGFydC0yTkRGemkuYWxpZ25TdHJldGNoLURwR1BmMy5kYS10eXBlV2luZG93cy5kYS13aXRoRnJhbWUuZGEtdGl0bGVCYXIuZGEtaG9yaXpvbnRhbFJldmVyc2UuZGEtZmxleC5kYS1kaXJlY3Rpb25Sb3dSZXZlcnNlLmRhLWp1c3RpZnlTdGFydC5kYS1hbGlnblN0cmV0Y2ggPiBkaXYud29yZG1hcmtXaW5kb3dzLTF2MGxZRC53b3JkbWFyay0yaUREZm0uZGEtd29yZG1hcmtXaW5kb3dzLmRhLXdvcmRtYXJrXCIpXHJcbiAgICBpZihsb2dvKXtcclxuICAgICAgICBsb2dvLnN0eWxlLnRvcCA9IFwiM3B4XCJcclxuICAgICAgICBsb2dvLmlubmVySFRNTCA9IGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBoZWlnaHQ9XCIxMFwiIHdpZHRoPVwiNzBcIiB2aWV3Qm94PVwiMCAwIDcyLjU0IDEwXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogLTVweCwgbWFyZ2luLXRvcDogMTBweFwiPlxyXG4gICAgPHBhdGggZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNNDQuODEsOS42N1Y2LjMzYzAtMS4yMSwyLjEzLTEuNDksMi43OC0uMjhsMi0uODFBMy41MywzLjUzLDAsMCwwLDQ2LjIsM2MtMS45MiwwLTMuODEsMS4xMy0zLjgxLDMuMzNWOS42N2MwLDIuMjEsMS44OSwzLjMzLDMuNzcsMy4zM2EzLjg3LDMuODcsMCwwLDAsMy40NS0yLjE4bC0yLjEyLTFDNDcsMTEuMTcsNDQuODEsMTAuODUsNDQuODEsOS42N1pNMTAuNjgsMTIuODloMi40MVYzLjE3SDEwLjY4Wk03MS43NiwzLjE0SDY4LjE5VjcuMjNMNzAuNTcsOS40di00aDEuMjdjLjgxLDAsMS4yMS40MSwxLjIxLDF2M2MwLC42My0uMzgsMS4wNS0xLjIxLDEuMDVINjguMTh2Mi4zMWgzLjU3YzEuOTIsMCwzLjcyLTEsMy43Mi0zLjJWNi4zOUM3NS40OCw0LjEzLDczLjY4LDMuMTQsNzEuNzYsMy4xNFpNNTQuMjIsM2MtMiwwLTQsMS4xLTQsMy4zNFY5LjY2YzAsMi4yMywyLDMuMzQsNCwzLjM0czMuOTUtMS4xMSwzLjk1LTMuMzRWNi4zNEM1OC4xOSw0LjExLDU2LjIsMyw1NC4yMiwzWm0xLjU1LDYuNjZjMCwuNy0uNzgsMS4wNi0xLjU0LDEuMDZzLTEuNTUtLjM1LTEuNTUtMS4wNlY2LjM0YzAtLjcyLjc1LTEuMSwxLjUtMS4xczEuNTkuMzUsMS41OSwxLjFaTTY2Ljg0LDYuMzRjMC0yLjI5LTEuNTgtMy4yLTMuNTUtMy4ySDU5LjQ2djkuNzNoMi40NVY5Ljc3aC40M2wyLjIyLDMuMDloM0w2NSw5LjUyQzY2LjEzLDkuMTUsNjYuODQsOC4xNCw2Ni44NCw2LjM0Wk02My4zMyw3LjY1SDYxLjkxVjUuNDNoMS40MkExLjExLDEuMTEsMCwxLDEsNjMuMzMsNy42NVpNMjkuODMsMTNoMi40MlYzLjA2SDI5LjgzVjYuNzNsLTMsMFYzLjA5SDI0Ljd2OS43OGgyLjE0VjguNjhsMywwWk0xNy4xNiw5Ljc2VjYuNDJjMC0xLjIxLDIuMTMtMS40OSwyLjc4LS4yOGwyLS44MWEzLjU1LDMuNTUsMCwwLDAtMy4zNi0yLjI0Yy0xLjkyLDAtMy44MSwxLjEzLTMuODEsMy4zM1Y5Ljc2YzAsMi4yMSwyLDMuMTUsMy45LDMuMTVzMy41OC0xLDMuNTgtM1Y3LjU4SDE4Ljc5bDAsMS4zNkgyMC4zdi43N0MyMC4zLDEwLjkyLDE3LjE2LDEwLjk0LDE3LjE2LDkuNzZaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC0yLjkzIC0zKVwiLz5cclxuICAgIDxwb2x5Z29uIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBwb2ludHM9XCIzNS45MSAwLjA2IDM4LjQzIDAuMDYgMzguNDMgMS44NCAzNS45MiAxLjgxIDM1Ljk3IDEwIDMzLjU1IDEwIDMzLjQ5IDEuNzUgMzAuOTggMS43NCAzMC45OCAwLjA2IDMzLjQ5IDAuMDYgMzUuOTEgMC4wNlwiLz5cclxuICAgIDxwb2x5Z29uIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBwb2ludHM9XCIwIDkuOTcgNi41IDEwIDYuNSA3LjYzIDIuNDEgNy42MyAyLjQxIDAuMjYgMCAyLjI2IDAgOS45N1wiLz5cclxuPC9zdmc+YFxyXG4gICAgfVxyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hQb3BvdXRXaW5kb3cgPSBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgIGxldCBjYW5jZWxlZCA9IGZhbHNlXHJcbiAgICB0aGlzLmNhbmNlbFBhdGNoUG9wb3V0V2luZG93ID0gKCkgPT4ge1xyXG4gICAgICAgIGNhbmNlbGVkID0gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRXaW5kb3cpXHJcbiAgICAudGhlbihwb3BvdXRNb2R1bGUgPT4ge1xyXG4gICAgICAgIGlmKGNhbmNlbGVkKXJldHVyblxyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgIC8vIE5vdCBhIGdvb2QgaWRlYSB0byBkbyBpdCBsaWtlIHRoYXQuXHJcbiAgICAgICAgY29uc3QgaW50ZXJjZXB0b3IgPSB3aW5kb3cuTGlnaHRjb3JkLkRpc2NvcmRNb2R1bGVzLmRpc3BhdGNoZXIuX2ludGVyY2VwdG9yXHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5EaXNjb3JkTW9kdWxlcy5kaXNwYXRjaGVyLnNldEludGVyY2VwdG9yKGZ1bmN0aW9uKGFjdGlvbil7XHJcbiAgICAgICAgICAgIGlmKGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gXCJQT1BPVVRfV0lORE9XX09QRU5cIil7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZW5kZXIgPSBhY3Rpb24ucmVuZGVyXHJcbiAgICAgICAgICAgICAgICBhY3Rpb24ucmVuZGVyID0gZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW5kZXIxID0gcmVuZGVyLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUxID0gcmVuZGVyMS50eXBlXHJcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyMS50eXBlID0gZnVuY3Rpb24ocHJvcHMpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZW5kZXIyID0gdHlwZTEocHJvcHMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHByb3BzLCByZW5kZXIyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyMlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZW5kZXIxKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZW5kZXIxXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGludGVyY2VwdG9yLmNhbGwodGhpcywgYWN0aW9uKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5EaXNjb3JkTW9kdWxlcy5kaXNwYXRjaGVyLnN1YnNjcmliZShcIlBPUE9VVF9XSU5ET1dfT1BFTlwiLCAoZXYpID0+IHtcclxuICAgICAgICAgICAgaWYoIXNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTlcIl0pcmV0dXJuXHJcbiAgICAgICAgICAgIGlmKGNhbmNlbGVkKXJldHVyblxyXG4gICAgICAgICAgICBVdGlscy5sb2coXCJQT1BPVVQgVEhFTUVcIiwgXCJQb3BvdXQgb3BlbmVkLCBBZGRpbmcgdGhlbWVcIilcclxuICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGV2KVxyXG4gICAgICAgICAgICAgICAgY29uc3Qgd2luZG93ID0gcG9wb3V0TW9kdWxlLmRlZmF1bHQuZ2V0V2luZG93KGV2LmtleSlcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHdpbmRvdylcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KSovXHJcbiAgICB9KVxyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hBdHRyaWJ1dGVzID0gYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICBsZXQgYXR0cmlic1BhdGNocyA9IFtdXHJcbiAgICB0aGlzLmNhbmNlbFBhdGNoQXR0cmlidXRlcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGF0dHJpYnNQYXRjaHMuZm9yRWFjaChlID0+IGUoKSlcclxuICAgIH1cclxuXHJcbiAgICB3aGlsZSghdjIuTWVzc2FnZUNvbXBvbmVudClhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSlcclxuICAgIFxyXG4gICAgLy8gVE9ETzogdHJ5IHRvIHBhdGNoIGNvcnJlY3RseSB0aGUgdXNlciBwb3BvdXQgb24gYSBuZXh0IHVwZGF0ZVxyXG4gICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XHJcbiAgICB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUgPT09IFwiRGlzY29yZFRhZ1wiKVxyXG4gICAgLnRoZW4oRGlzY29yZFRhZyA9PiB7XHJcbiAgICAgICAgbGV0IERpc2NvcmRUYWdDb21wID0gRGlzY29yZFRhZy5kZWZhdWx0XHJcbiAgICAgICAgRGlzY29yZFRhZy5kZWZhdWx0ID0gZnVuY3Rpb24ocHJvcHMpe1xyXG4gICAgICAgICAgICBsZXQgcmV0dXJuVmFsdWUgPSBEaXNjb3JkVGFnQ29tcChwcm9wcylcclxuXHJcbiAgICAgICAgICAgIGxldCBpZCA9IHV1aWR2NCgpXHJcblxyXG4gICAgICAgICAgICBsZXQgYmFkZ2VEaXYgPSBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xyXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImlubGluZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpblRvcDogXCI1cHhcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcclxuICAgICAgICAgICAgICAgIGlkOiBcImJhZGdlcy1cIitpZCxcclxuICAgICAgICAgICAgICAgIGtleTogXCJiYWRnZXMtXCIraWQsXHJcbiAgICAgICAgICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiaW5oZXJpdFwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKVxyXG5cclxuICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gW3JldHVyblZhbHVlXVxyXG5cclxuICAgICAgICAgICAgaWYgKHByb3BzLnVzZXIuaWQgPT09IFwiMjQ5NzQ2MjM2MDA4MTY5NDczXCIpIHsgLy8gUmF1ZW56aTogQmFuZGFnZWRCRCBEZXZlbG9wZXJcclxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJCYW5kYWdlZEJEIERldmVsb3BlclwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1jaGF0LWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcFwiLCB0aXRsZTogXCJCYW5kYWdlZEJEXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQkRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wcy51c2VyLmlkID09PSBcIjY5NjQ4MTE5NDQ0MzAxNDE3NFwiIHx8IHByb3BzLnVzZXIuaWQgPT09IFwiNjk2MDAzNDU2NjExMzg1Mzk2XCIpeyAvLyBOb3QgVGhvbWl6OiBMaWdodGNvcmQgRGV2ZWxvcGVyLCBQaG9yY3lzOiBMaWdodGNvcmQgRGV2ZWxvcGVyXHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiTGlnaHRjb3JkIERldmVsb3BlclwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1jaGF0LWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL0xpZ2h0Y29yZC9MaWdodGNvcmRcIiwgdGl0bGU6IFwiTGlnaHRjb3JkXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkTG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goYmFkZ2VEaXYpXHJcbiAgICAgICAgICAgIGxldCBkaXYgPSBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xyXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImJsb2NrXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgY2hpbGRyZW4pXHJcbiAgICAgICAgICAgIGFwcGx5QmFkZ2VzKGlkLCBwcm9wcy51c2VyLCBmYWxzZSlcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBkaXZcclxuICAgICAgICB9XHJcbiAgICB9KVxyXG5cclxuICAgIGF0dHJpYnNQYXRjaHMucHVzaChVdGlscy5tb25rZXlQYXRjaCh2Mi5NZXNzYWdlQ29tcG9uZW50LCBcImRlZmF1bHRcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGlmKGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMubWVzc2FnZSl7IC8vIHRoaXMgY2FuIGJlIGEgYmxvY2tlZCBtZXNzYWdlIChub3Qgb3BlbmVkKVxyXG4gICAgICAgICAgICBkYXRhLnJldHVyblZhbHVlLnByb3BzW1wiZGF0YS1tZXNzYWdlLWlkXCJdID0gZGF0YS5tZXRob2RBcmd1bWVudHNbMF0uY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5tZXNzYWdlLmlkXHJcbiAgICAgICAgfVxyXG4gICAgfX0pKVxyXG4gICAgICAgIC8qXHJcbiAgICBhdHRyaWJzUGF0Y2hzLnB1c2goVXRpbHMubW9ua2V5UGF0Y2godjIuTWVzc2FnZUNvbXBvbmVudCwgXCJkZWZhdWx0XCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBkYXRhLnJldHVyblZhbHVlLnByb3BzW1wibWVzc2FnZS1pZFwiXSA9IGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMubWVzc2FnZS5pZFxyXG4gICAgfX0pKSovXHJcbn1cclxuXHJcbkNvcmUucHJvdG90eXBlLmNoZWNrRm9yR3VpbGRzID0gZnVuY3Rpb24oKSB7XHJcbiAgICBsZXQgdGltZXNDaGVja2VkID0gMDtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICBjb25zdCBjaGVja0Zvckd1aWxkcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBjb25zdCB3cmFwcGVyID0gQkRWMi5ndWlsZENsYXNzZXMud3JhcHBlci5zcGxpdChcIiBcIilbMF07XHJcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAuJHt3cmFwcGVyfWApLmxlbmd0aCA+IDApIHRpbWVzQ2hlY2tlZCsrO1xyXG4gICAgICAgICAgICBjb25zdCBndWlsZCA9IEJEVjIuZ3VpbGRDbGFzc2VzLmxpc3RJdGVtLnNwbGl0KFwiIFwiKVswXTtcclxuICAgICAgICAgICAgY29uc3QgYmxvYiA9IEJEVjIuZ3VpbGRDbGFzc2VzLmJsb2JDb250YWluZXIuc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgLiR7d3JhcHBlcn0gLiR7Z3VpbGR9IC4ke2Jsb2J9YCkubGVuZ3RoID4gMCkgcmV0dXJuIHJlc29sdmUoYmRDb25maWcuZGVmZXJMb2FkZWQgPSB0cnVlKTtcclxuICAgICAgICAgICAgZWxzZSBpZiAodGltZXNDaGVja2VkID49IDUwKSByZXR1cm4gcmVzb2x2ZShiZENvbmZpZy5kZWZlckxvYWRlZCA9IHRydWUpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGNoZWNrRm9yR3VpbGRzLCAxMDApO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgIT0gXCJsb2FkaW5nXCIpIHNldFRpbWVvdXQoY2hlY2tGb3JHdWlsZHMsIDEwMCk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgKCkgPT4ge3NldFRpbWVvdXQoY2hlY2tGb3JHdWlsZHMsIDEwMCk7fSk7XHJcbiAgICB9KTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLmluamVjdEV4dGVybmFscyA9IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgLy8gTm8gZXh0ZXJuYWxzXHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5pbml0U2V0dGluZ3MgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBEYXRhU3RvcmUuaW5pdGlhbGl6ZSgpO1xyXG4gICAgaWYoIURhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJzZXR0aW5nc1wiKSAmJiAhRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInJwY1wiKSl7XHJcbiAgICAgICAgaWYgKCFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwic2V0dGluZ3NcIikpIHtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5nc0Nvb2tpZSwgZGVmYXVsdENvb2tpZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInJwY1wiKSkge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzUlBDLCBkZWZhdWx0UlBDKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0dGluZ3NQYW5lbC5zYXZlU2V0dGluZ3MoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2V0dGluZ3NQYW5lbC5sb2FkU2V0dGluZ3MoKTtcclxuICAgICAgICBmb3IgKGNvbnN0IHNldHRpbmcgaW4gZGVmYXVsdENvb2tpZSkge1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbc2V0dGluZ10gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nc0Nvb2tpZVtzZXR0aW5nXSA9IGRlZmF1bHRDb29raWVbc2V0dGluZ107XHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nc1BhbmVsLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LnByb3RvdHlwZSAmJiBlLmRlZmF1bHQucHJvdG90eXBlLmdldFByZWRpY2F0ZVNlY3Rpb25zKVxyXG4gICAgLnRoZW4oc2V0dGluZ01vZHVsZSA9PiB7XHJcblxyXG4gICAgICAgIGxldCBnZXRQcmVkaWNhdGVTZWN0aW9ucyA9IHNldHRpbmdNb2R1bGUuZGVmYXVsdC5wcm90b3R5cGUuZ2V0UHJlZGljYXRlU2VjdGlvbnNcclxuICAgICAgICBzZXR0aW5nTW9kdWxlLmRlZmF1bHQucHJvdG90eXBlLmdldFByZWRpY2F0ZVNlY3Rpb25zID0gZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGdldFByZWRpY2F0ZVNlY3Rpb25zLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxyXG5cclxuICAgICAgICAgICAgaWYoIXJlc3VsdFsxXSlyZXR1cm4gcmVzdWx0XHJcbiAgICAgICAgICAgIGlmKHJlc3VsdFsxXS5zZWN0aW9uID09PSBcIk15IEFjY291bnRcIil7IC8vIHVzZXIgc2V0dGluZ3MsIG5vdCBndWlsZCBzZXR0aW5nc1xyXG4gICAgICAgICAgICAgICAgbGV0IHBvcGVkID0gW11cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcG9wZWQucHVzaChyZXN1bHQucG9wKCkpXHJcbiAgICAgICAgICAgICAgICBwb3BlZC5wdXNoKHJlc3VsdC5wb3AoKSlcclxuICAgICAgICAgICAgICAgIHBvcGVkLnB1c2gocmVzdWx0LnBvcCgpKVxyXG4gICAgICAgICAgICAgICAgcG9wZWQucHVzaChyZXN1bHQucG9wKCkpXHJcblxyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4uc2V0dGluZ3NQYW5lbC5yZW5kZXJTaWRlYmFyKHRoaXMpKVxyXG5cclxuICAgICAgICAgICAgICAgIHdoaWxlKHBvcGVkWzBdKXtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwb3BlZC5wb3AoKSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICAgICAgfVxyXG4gICAgfSlcclxufTtcclxuXHJcblxyXG5sZXQgY2xhc3NOYW1lTGF5ZXJcclxubGV0IGNsYXNzTmFtZVNvY2lhbExpbmtzXHJcbmxldCBjbGFzc05hbWVNb2RhbFxyXG5cclxuQ29yZS5wcm90b3R5cGUuaW5pdE9ic2VydmVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgY29uc3QgbWFpbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBtbGVuID0gbXV0YXRpb25zLmxlbmd0aDsgaSA8IG1sZW47IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBtdXRhdGlvbiA9IG11dGF0aW9uc1tpXTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW5Nb2R1bGUgIT09IFwidW5kZWZpbmVkXCIpIHBsdWdpbk1vZHVsZS5yYXdPYnNlcnZlcihtdXRhdGlvbik7XHJcblxyXG4gICAgICAgICAgICAvLyBpZiB0aGVyZSB3YXMgbm90aGluZyBhZGRlZCwgc2tpcFxyXG4gICAgICAgICAgICBpZiAoIW11dGF0aW9uLmFkZGVkTm9kZXMubGVuZ3RoIHx8ICEobXV0YXRpb24uYWRkZWROb2Rlc1swXSBpbnN0YW5jZW9mIEVsZW1lbnQpKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBtdXRhdGlvbi5hZGRlZE5vZGVzWzBdO1xyXG5cclxuICAgICAgICAgICAgaWYoIWNsYXNzTmFtZUxheWVyKWNsYXNzTmFtZUxheWVyID0gQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5sYXllciAmJiB0eXBlb2YgZS5sYXllciA9PT0gXCJzdHJpbmdcIiAmJiBlLmFuaW1hdGluZylbMF0ubGF5ZXJcclxuICAgICAgICAgICAgaWYoIWNsYXNzTmFtZVNvY2lhbExpbmtzKWNsYXNzTmFtZVNvY2lhbExpbmtzID0gQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5zb2NpYWxMaW5rcyAmJiB0eXBlb2YgZS5zb2NpYWxMaW5rcyA9PT0gXCJzdHJpbmdcIilbMF0uc29jaWFsTGlua3NcclxuICAgICAgICAgICAgaWYoIWNsYXNzTmFtZU1vZGFsKWNsYXNzTmFtZU1vZGFsID0gQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5tb2RhbCAmJiB0eXBlb2YgZS5tb2RhbCA9PT0gXCJzdHJpbmdcIiAmJiBlLmlubmVyICYmIHR5cGVvZiBlLmlubmVyID09PSBcInN0cmluZ1wiICYmICFlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSlbMF0ubW9kYWxcclxuXHJcbiAgICAgICAgICAgIGlmIChub2RlLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVMYXllcikpIHtcclxuICAgICAgICAgICAgICAgIGlmIChub2RlLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikgPT09IFwiR1VJTERfU0VUVElOR1NcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJsYXllci1pZFwiLCBcInNlcnZlci1zZXR0aW5nc1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImlkXCIsIFwic2VydmVyLXNldHRpbmdzXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChub2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lU29jaWFsTGlua3MpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwibGF5ZXItaWRcIiwgXCJ1c2VyLXNldHRpbmdzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiaWRcIiwgXCJ1c2VyLXNldHRpbmdzXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAobm9kZS5wYXJlbnRFbGVtZW50ID09IGRvY3VtZW50LmJvZHkgJiYgbm9kZS5xdWVyeVNlbGVjdG9yKFwiI2FjZV9zZXR0aW5nc21lbnVcIikpIG5vZGUuaWQgPSBcImFjZV9zZXR0aW5nc21lbnVfY29udGFpbmVyXCI7XHJcblxyXG4gICAgICAgICAgICAvLyBFbW9qaSBQaWNrZXJcclxuICAgICAgICAgICAgLy9ub2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJlbW9qaVBpY2tlci0zbTFTLWpcIikubGVuZ3RoICYmICFub2RlLnF1ZXJ5U2VsZWN0b3IoXCIuZW1vamlQaWNrZXItM20xUy1qXCIpLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiYW5pbWF0b3JMZWZ0LTFFUXhVMFwiKVxyXG4gICAgICAgICAgICAvL2lmIChub2RlLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVMYXllcjIpICYmIG5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWVFbW9qaVBpY2tlcikubGVuZ3RoICAmJiAhbm9kZS5xdWVyeVNlbGVjdG9yKFwiLlwiK2NsYXNzTmFtZUVtb2ppUGlja2VyKS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVBbmltYXRvckxlZnQpKSBxdWlja0Vtb3RlTWVudS5vYnNDYWxsYmFjayhub2RlKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgbWFpbk9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQsIHtcclxuICAgICAgICBjaGlsZExpc3Q6IHRydWUsXHJcbiAgICAgICAgc3VidHJlZTogdHJ1ZVxyXG4gICAgfSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5zaG93Q2hhbmdlbG9nTW9kYWwgPSBmdW5jdGlvbihvcHRpb25zID0ge30pIHtcclxuICAgIHJldHVybiBVdGlscy5zaG93Q2hhbmdlbG9nTW9kYWwob3B0aW9ucyk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5hbGVydCA9IGZ1bmN0aW9uKHRpdGxlLCBjb250ZW50KSB7XHJcbiAgICByZXR1cm4gVXRpbHMuYWxlcnQodGl0bGUsIGNvbnRlbnQpO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hTb2NpYWwgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLnNvY2lhbFBhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBUYWJCYXIgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIlRhYkJhclwiKTtcclxuICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG4gICAgaWYgKCFUYWJCYXIpIHJldHVybjtcclxuICAgIHRoaXMuc29jaWFsUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChUYWJCYXIucHJvdG90eXBlLCBcInJlbmRlclwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNoaWxkcmVuO1xyXG4gICAgICAgIGlmICghY2hpbGRyZW4gfHwgIWNoaWxkcmVuLmxlbmd0aCB8fCBjaGlsZHJlbi5sZW5ndGggPCAzKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDNdLnR5cGUuZGlzcGxheU5hbWUgIT09IFwiU2VwYXJhdG9yXCIpIHJldHVybjtcclxuICAgICAgICBpZiAoIWNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDJdLnR5cGUudG9TdHJpbmcoKS5pbmNsdWRlcyhcInNvY2lhbExpbmtzXCIpKSByZXR1cm47XHJcbiAgICAgICAgaWYgKEFuY2hvcikge1xyXG4gICAgICAgICAgICBsZXQgc29jaWFsTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNvY2lhbExpbmtzKVswXVxyXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbCA9IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDJdLnR5cGU7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld09uZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsID0gb3JpZ2luYWwoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgICAgIHJldHVyblZhbC5wcm9wcy5jaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLXNvY2lhbC1saW5rIFwiK3NvY2lhbE1vZHVsZTEubGluaywgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vTGlnaHRjb3JkL0xpZ2h0Y29yZFwiLCB0aXRsZTogXCJMaWdodGNvcmRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1zb2NpYWwtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkRcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtc29jaWFsLWxpbmsgXCIrc29jaWFsTW9kdWxlMS5saW5rLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIiwgdGl0bGU6IFwiQmFuZGFnZWRCRFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtc29jaWFsLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbDtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMl0udHlwZSA9IG5ld09uZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZUNvbG9yTXV0ZWQsXHJcbiAgICAgICAgICAgIHNpemVzLFxyXG4gICAgICAgICAgICBjbGFzc05hbWVWZXJzaW9uSGFzaFxyXG4gICAgICAgIF0gPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yTXV0ZWQpWzBdLmNvbG9yTXV0ZWQsXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnZlcnNpb25IYXNoKVswXS52ZXJzaW9uSGFzaFxyXG4gICAgICAgIF1cclxuXHJcbiAgICAgICAgY29uc3QgdmVyc2lvbkhhc2ggPSBgKCR7YmRDb25maWcuaGFzaCA/IGJkQ29uZmlnLmhhc2guc3Vic3RyaW5nKDAsIDcpIDogYmRDb25maWcuYnJhbmNofSlgO1xyXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWwgPSBbXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBgJHtjbGFzc05hbWVDb2xvck11dGVkfSAke3NpemVzLnNpemUxMn1gfSwgYExpZ2h0Y29yZCAke2VsZWN0cm9uLmdldEdsb2JhbChcIkJ1aWxkSW5mb1wiKS52ZXJzaW9ufSBgLCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IGNsYXNzTmFtZVZlcnNpb25IYXNoK1wiIGRhLXZlcnNpb25IYXNoXCJ9LCBgKCR7KGVsZWN0cm9uLmdldEdsb2JhbChcIkJ1aWxkSW5mb1wiKS5jb21taXQgfHwgXCJVbmtub3duXCIpLnNsaWNlKDAsIDcpfSlgKSksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBgJHtjbGFzc05hbWVDb2xvck11dGVkfSAke3NpemVzLnNpemUxMn1gfSwgYEJCRCAke2JiZFZlcnNpb259IGAsIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogY2xhc3NOYW1lVmVyc2lvbkhhc2grXCIgZGEtdmVyc2lvbkhhc2hcIn0sIHZlcnNpb25IYXNoKSlcclxuICAgICAgICBdXHJcbiAgICAgICAgXHJcblxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVmVyc2lvbnMgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXS50eXBlO1xyXG4gICAgICAgIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnR5cGUgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsID0gb3JpZ2luYWxWZXJzaW9ucyguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgICAgICByZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4uc3BsaWNlKDEsIDAsIGFkZGl0aW9uYWwpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsO1xyXG4gICAgICAgIH07XHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5jb25zdCBnZXRHdWlsZENsYXNzZXMgPSBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IGd1aWxkc1dyYXBwZXIgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcIndyYXBwZXJcIiwgXCJ1bnJlYWRNZW50aW9uc0JhclwiKTtcclxuICAgIGNvbnN0IGd1aWxkcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiZ3VpbGRzRXJyb3JcIiwgXCJzZWxlY3RlZFwiKTtcclxuICAgIGNvbnN0IHBpbGwgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImJsb2JDb250YWluZXJcIik7XHJcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZ3VpbGRzV3JhcHBlciwgZ3VpbGRzLCBwaWxsKTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoR3VpbGRMaXN0SXRlbXMgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLmd1aWxkTGlzdEl0ZW1zUGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IEd1aWxkQ2xhc3NlcyA9IGdldEd1aWxkQ2xhc3NlcygpO1xyXG4gICAgY29uc3QgbGlzdEl0ZW1DbGFzcyA9IEd1aWxkQ2xhc3Nlcy5saXN0SXRlbS5zcGxpdChcIiBcIilbMF07XHJcbiAgICBjb25zdCBibG9iQ2xhc3MgPSBHdWlsZENsYXNzZXMuYmxvYkNvbnRhaW5lci5zcGxpdChcIiBcIilbMF07XHJcbiAgICBjb25zdCByZWFjdEluc3RhbmNlID0gQkRWMi5nZXRJbnRlcm5hbEluc3RhbmNlKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2xpc3RJdGVtQ2xhc3N9IC4ke2Jsb2JDbGFzc31gKS5wYXJlbnRFbGVtZW50KTtcclxuICAgIGNvbnN0IEd1aWxkQ29tcG9uZW50ID0gcmVhY3RJbnN0YW5jZS5yZXR1cm4udHlwZTtcclxuICAgIGlmICghR3VpbGRDb21wb25lbnQpIHJldHVybjtcclxuICAgIHRoaXMuZ3VpbGRMaXN0SXRlbXNQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKEd1aWxkQ29tcG9uZW50LnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGlmIChkYXRhLnJldHVyblZhbHVlICYmIGRhdGEudGhpc09iamVjdCkge1xyXG4gICAgICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGRhdGEucmV0dXJuVmFsdWU7XHJcbiAgICAgICAgICAgIGNvbnN0IGd1aWxkRGF0YSA9IGRhdGEudGhpc09iamVjdC5wcm9wcztcclxuICAgICAgICAgICAgbGV0IGNsYXNzTmFtZSA9IHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZVxyXG4gICAgICAgICAgICBjbGFzc05hbWUgKz0gXCIgYmQtZ3VpbGRcIjtcclxuICAgICAgICAgICAgaWYgKGd1aWxkRGF0YS51bnJlYWQpIGNsYXNzTmFtZSArPSBcIiBiZC11bnJlYWRcIjtcclxuICAgICAgICAgICAgaWYgKGd1aWxkRGF0YS5zZWxlY3RlZCkgY2xhc3NOYW1lICs9IFwiIGJkLXNlbGVjdGVkXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEuYXVkaW8pIGNsYXNzTmFtZSArPSBcIiBiZC1hdWRpb1wiO1xyXG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLnZpZGVvKSBjbGFzc05hbWUgKz0gXCIgYmQtdmlkZW9cIjtcclxuICAgICAgICAgICAgaWYgKGd1aWxkRGF0YS5iYWRnZSkgY2xhc3NOYW1lICs9IFwiIGJkLWJhZGdlXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEuYW5pbWF0YWJsZSkgY2xhc3NOYW1lICs9IFwiIGJkLWFuaW1hdGFibGVcIjtcclxuICAgICAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lID0gY2xhc3NOYW1lXHJcbiAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaEd1aWxkUGlsbHMgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLmd1aWxkUGlsbFBhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBndWlsZFBpbGwgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0ICYmICFtLmRlZmF1bHQuZGlzcGxheU5hbWUgJiYgbS5kZWZhdWx0LnRvU3RyaW5nICYmIG0uZGVmYXVsdC50b1N0cmluZygpLmluY2x1ZGVzKFwidHJhbnNsYXRlM2RcIikpO1xyXG4gICAgaWYgKCFndWlsZFBpbGwpIHJldHVybjtcclxuICAgIHRoaXMuZ3VpbGRQaWxsUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChndWlsZFBpbGwsIFwiZGVmYXVsdFwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcHJvcHMgPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXTtcclxuICAgICAgICBpZiAocHJvcHMudW5yZWFkKSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC11bnJlYWRcIjtcclxuICAgICAgICBpZiAocHJvcHMuc2VsZWN0ZWQpIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLXNlbGVjdGVkXCI7XHJcbiAgICAgICAgaWYgKHByb3BzLmhvdmVyZWQpIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLWhvdmVyZWRcIjtcclxuICAgICAgICByZXR1cm4gZGF0YS5yZXR1cm5WYWx1ZTtcclxuICAgIH19KTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoR3VpbGRTZXBhcmF0b3IgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLmd1aWxkU2VwYXJhdG9yUGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IEd1aWxkcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiR3VpbGRzXCIpO1xyXG4gICAgY29uc3QgZ3VpbGRDb21wb25lbnRzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJyZW5kZXJMaXN0SXRlbVwiKTtcclxuICAgIGlmICghZ3VpbGRDb21wb25lbnRzIHx8ICFHdWlsZHMpIHJldHVybjtcclxuICAgIGNvbnN0IEd1aWxkU2VwYXJhdG9yID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSBndWlsZENvbXBvbmVudHMuU2VwYXJhdG9yKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLWd1aWxkLXNlcGFyYXRvclwiO1xyXG4gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcclxuICAgIH07XHJcbiAgICB0aGlzLmd1aWxkU2VwYXJhdG9yUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChHdWlsZHMucHJvdG90eXBlLCBcInJlbmRlclwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jaGlsZHJlblsxXS5wcm9wcy5jaGlsZHJlblszXS50eXBlID0gR3VpbGRTZXBhcmF0b3I7XHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaEF0dGFjaG1lbnQgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLkF0dGFjaG1lbnRQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgQXR0YWNobWVudCA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIkF0dGFjaG1lbnRcIilbMF0gLy8gdGVtcG9yYXJ5XHJcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgIGlmICghQW5jaG9yIHx8ICFBdHRhY2htZW50IHx8ICFBdHRhY2htZW50LmRlZmF1bHQpIHJldHVybjtcclxuICAgIHRoaXMuQXR0YWNobWVudFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goQXR0YWNobWVudCwgXCJkZWZhdWx0XCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBpZighc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTZcIl0pcmV0dXJuXHJcbiAgICAgICAgY29uc3QgYXR0YWNobWVudCA9IGRhdGEubWV0aG9kQXJndW1lbnRzWzBdIHx8IG51bGxcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5yZXR1cm5WYWx1ZSwgXCJwcm9wcy5jaGlsZHJlblwiKTtcclxuXHJcbiAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhYXR0YWNobWVudCB8fCAhYXR0YWNobWVudC51cmwpcmV0dXJuXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpXHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcclxuICAgICAgICAgICAgaWQ6IFwiY2VydGlmaWVkLVwiK2lkXHJcbiAgICAgICAgfSkpXHJcbiAgICAgICAgUGx1Z2luQ2VydGlmaWVyLnBhdGNoKGF0dGFjaG1lbnQsIFwiY2VydGlmaWVkLVwiK2lkKVxyXG4gICAgfX0pXHJcbn1cclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoTWVzc2FnZUhlYWRlciA9IGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMubWVzc2FnZUhlYWRlclBhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBNZXNzYWdlSGVhZGVyID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJNZXNzYWdlVGltZXN0YW1wXCIpO1xyXG4gICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XHJcbiAgICBpZiAoIUFuY2hvciB8fCAhTWVzc2FnZUhlYWRlciB8fCAhTWVzc2FnZUhlYWRlci5kZWZhdWx0KSByZXR1cm47XHJcbiAgICB0aGlzLm1lc3NhZ2VIZWFkZXJQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKE1lc3NhZ2VIZWFkZXIsIFwiZGVmYXVsdFwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYXV0aG9yID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLm1ldGhvZEFyZ3VtZW50c1swXSwgXCJtZXNzYWdlLmF1dGhvclwiKTtcclxuICAgICAgICAvLyBjb25zdCBoZWFkZXIgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEucmV0dXJuVmFsdWUsIFwicHJvcHMuY2hpbGRyZW4uMS5wcm9wc1wiKTtcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5yZXR1cm5WYWx1ZSwgXCJwcm9wcy5jaGlsZHJlbi4xLnByb3BzLmNoaWxkcmVuLjEucHJvcHMuY2hpbGRyZW5cIik7XHJcbiAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhYXV0aG9yIHx8ICFhdXRob3IuaWQpcmV0dXJuXHJcbiAgICAgICAgLy8gaWYgKGhlYWRlciAmJiBoZWFkZXIuY2xhc3NOYW1lKSBoZWFkZXIuY2xhc3NOYW1lICs9IFwiIFwiXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgcmV0dXJuO1xyXG4gICAgICAgIGlmIChhdXRob3IuaWQgPT09IFwiMjQ5NzQ2MjM2MDA4MTY5NDczXCIpIHsgLy8gUmF1ZW56aTogQmFuZGFnZWRCRCBEZXZlbG9wZXJcclxuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiQmFuZGFnZWRCRCBEZXZlbG9wZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1jaGF0LWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcFwiLCB0aXRsZTogXCJCYW5kYWdlZEJEXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChCRExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoYXV0aG9yLmlkID09PSBcIjY5NjQ4MTE5NDQ0MzAxNDE3NFwiIHx8IGF1dGhvci5pZCA9PT0gXCI2OTYwMDM0NTY2MTEzODUzOTZcIil7IC8vIE5vdCBUaG9taXo6IExpZ2h0Y29yZCBEZXZlbG9wZXIsIFBob3JjeXM6IExpZ2h0Y29yZCBEZXZlbG9wZXJcclxuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiTGlnaHRjb3JkIERldmVsb3BlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLWNoYXQtYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vTGlnaHRjb3JkL0xpZ2h0Y29yZFwiLCB0aXRsZTogXCJMaWdodGNvcmRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpXHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcclxuICAgICAgICAgICAgICAgIGlkOiBcImJhZGdlcy1cIitpZCxcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJpbmxpbmVcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIClcclxuICAgICAgICBhcHBseUJhZGdlcyhpZCwgYXV0aG9yLCB0cnVlKVxyXG4gICAgfX0pO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gYXBwbHlCYWRnZXMoaWQsIHVzZXIsIGNoYXQpe1xyXG4gICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJiYWRnZXMtXCIraWQpXHJcbiAgICAgICAgaWYoIWRpdiB8fCBkaXYuY2hpbGROb2Rlcy5sZW5ndGggPiAwKXJldHVyblxyXG4gICAgICAgIGlmKGRpdi5jaGlsZE5vZGVzLmxlbmd0aClyZXR1cm5cclxuICAgICAgICBsZXQgYmxvY2tEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXHJcbiAgICAgICAgYmxvY2tEaXYuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiXHJcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKGJsb2NrRGl2KVxyXG5cclxuICAgICAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuXHJcbiAgICAgICAgZGlzdGFudC5nZXRCYWRnZXModXNlci5pZClcclxuICAgICAgICAudGhlbihiYWRnZXMgPT4ge1xyXG4gICAgICAgICAgICBiYWRnZXMuZm9yRWFjaChiYWRnZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBzdmc6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogXCIxNnB4XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiYmQtbG9nb1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogXCIxNnB4XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJhZGdlLnNjb3Blcy5mb3JFYWNoKHNjb3BlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZihzY29wZSA9PT0gXCJ1c2VyXCIpey8vIHJlcXVpcmUgdXNlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy51c2VyID0gdXNlclxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pIFxyXG4gICAgICAgICAgICAgICAgaWYoIWJhZGdlLmhyZWYpe1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLkFuY2hvciA9IEFuY2hvclxyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmhyZWYgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogY2hhdCA/IFwiYmQtY2hhdC1iYWRnZVwiIDogXCJiZC1tZW1iZXItYmFkZ2VcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBiYWRnZS5uYW1lLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IGJhZGdlLm5hbWV9LFxyXG4gICAgICAgICAgICAgICAgICAgIGJhZGdlLmhyZWYgPyBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY6IGJhZGdlLmhyZWYsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogY2hhdCA/IFwiYmQtY2hhdC1iYWRnZVwiIDogXCJiZC1tZW1iZXItYmFkZ2VcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBiYWRnZS5uYW1lLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgfSwgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KGJhZGdlLmNvbXBvbmVudCwgcHJvcHMpKSA6IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChiYWRnZS5jb21wb25lbnQsIHByb3BzKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgZGl2MiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKGVsZW1lbnQsIGRpdjIpXHJcbiAgICAgICAgICAgICAgICBkaXYyLmNoaWxkTm9kZXMuZm9yRWFjaChub2RlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQobm9kZSlcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH0pXHJcbn1cclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoTWVtYmVyTGlzdCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMubWVtYmVyTGlzdFBhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBNZW1iZXJMaXN0SXRlbSA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiTWVtYmVyTGlzdEl0ZW1cIik7XHJcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgIGlmICghQW5jaG9yIHx8ICFNZW1iZXJMaXN0SXRlbSB8fCAhTWVtYmVyTGlzdEl0ZW0ucHJvdG90eXBlIHx8ICFNZW1iZXJMaXN0SXRlbS5wcm90b3R5cGUucmVuZGVyRGVjb3JhdG9ycykgcmV0dXJuO1xyXG4gICAgdGhpcy5tZW1iZXJMaXN0UGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChNZW1iZXJMaXN0SXRlbS5wcm90b3R5cGUsIFwicmVuZGVyRGVjb3JhdG9yc1wiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdXNlciA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS50aGlzT2JqZWN0LCBcInByb3BzLnVzZXJcIik7XHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEucmV0dXJuVmFsdWUsIFwicHJvcHMuY2hpbGRyZW5cIik7XHJcbiAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhdXNlciB8fCAhdXNlci5pZClyZXR1cm5cclxuICAgICAgICAvLyBpZiAoaGVhZGVyICYmIGhlYWRlci5jbGFzc05hbWUpIGhlYWRlci5jbGFzc05hbWUgKz0gXCIgXCJcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHVzZXIuaWQgPT09IFwiMjQ5NzQ2MjM2MDA4MTY5NDczXCIpIHtcclxuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiQmFuZGFnZWRCRCBEZXZlbG9wZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1tZW1iZXItYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwXCIsIHRpdGxlOiBcIkJhbmRhZ2VkQkRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh1c2VyLmlkID09PSBcIjY5NjQ4MTE5NDQ0MzAxNDE3NFwiIHx8IHVzZXIuaWQgPT09IFwiNjk2MDAzNDU2NjExMzg1Mzk2XCIpe1xyXG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJMaWdodGNvcmQgRGV2ZWxvcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtbWVtYmVyLWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL0xpZ2h0Y29yZC9MaWdodGNvcmRcIiwgdGl0bGU6IFwiTGlnaHRjb3JkXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKVxyXG4gICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IFwiYmFkZ2VzLVwiK2lkfSlcclxuICAgICAgICApXHJcbiAgICAgICAgYXBwbHlCYWRnZXMoaWQsIHVzZXIsIGZhbHNlKVxyXG4gICAgfX0pO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUudXBkYXRlSW5qZWN0b3IgPSBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgIC8vIFRoZXJlIHdpbGwgbmV2ZXIgYmUgYW4gaW5qZWN0aW9uIHBhdGgsIHNvIHdlIGRvIG5vdCBuZWVkIHRoZSBjb2RlIGJlbG93LiBcclxuICAgIC8vIEluc2VydCBjb21tZW50cyBzbyBpdCB3aWxsIGJlIGVyYXNlZCB3aGVuIHByb2R1Y3Rpb24uXHJcbiAgICBcclxuICAgIGNvbnN0IGluamVjdGlvblBhdGggPSBEYXRhU3RvcmUuaW5qZWN0aW9uUGF0aDtcclxuICAgIGlmICghaW5qZWN0aW9uUGF0aCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8qXHJcblxyXG4gICAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XHJcbiAgICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XHJcbiAgICBjb25zdCBybXJmID0gcmVxdWlyZShcInJpbXJhZlwiKTtcclxuICAgIGNvbnN0IHlhdXpsID0gcmVxdWlyZShcInlhdXpsXCIpO1xyXG4gICAgY29uc3QgbWtkaXJwID0gcmVxdWlyZShcIm1rZGlycFwiKTtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSByZXF1aXJlKFwicmVxdWVzdFwiKTtcclxuXHJcbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5yZXNvbHZlKGluamVjdGlvblBhdGgsIFwiLi5cIik7XHJcbiAgICBjb25zdCBmb2xkZXJOYW1lID0gcGF0aC5iYXNlbmFtZShpbmplY3Rpb25QYXRoKTtcclxuICAgIGNvbnN0IHppcExpbmsgPSBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvYXJjaGl2ZS9pbmplY3Rvci56aXBcIjtcclxuICAgIGNvbnN0IHNhdmVkWmlwID0gcGF0aC5yZXNvbHZlKHBhcmVudFBhdGgsIFwiaW5qZWN0b3IuemlwXCIpO1xyXG4gICAgY29uc3QgZXh0cmFjdGVkRm9sZGVyID0gcGF0aC5yZXNvbHZlKHBhcmVudFBhdGgsIFwiQmV0dGVyRGlzY29yZEFwcC1pbmplY3RvclwiKTtcclxuXHJcbiAgICAvLyBEb3dubG9hZCB0aGUgaW5qZWN0b3IgemlwIGZpbGVcclxuICAgIFV0aWxzLmxvZyhcIkluamVjdG9yVXBkYXRlXCIsIFwiRG93bmxvYWRpbmcgXCIgKyB6aXBMaW5rKTtcclxuICAgIGxldCBzdWNjZXNzID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgcmVxdWVzdC5nZXQoe3VybDogemlwTGluaywgZW5jb2Rpbmc6IG51bGx9LCBhc3luYyAoZXJyb3IsIHJlc3BvbnNlLCBib2R5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvciB8fCByZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHJldHVybiByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICAgICAgLy8gU2F2ZSBhIGJhY2t1cCBpbiBjYXNlIHNvbWVvbmUgaGFzIHRoZWlyIG93biBjb3B5XHJcbiAgICAgICAgICAgIGNvbnN0IGFscmVhZHlFeGlzdHMgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXMgPT4gZnMuZXhpc3RzKHNhdmVkWmlwLCByZXMpKTtcclxuICAgICAgICAgICAgaWYgKGFscmVhZHlFeGlzdHMpIGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5yZW5hbWUoc2F2ZWRaaXAsIGAke3NhdmVkWmlwfS5iYWske01hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkpfWAsIHJlcykpO1xyXG5cclxuICAgICAgICAgICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJXcml0aW5nIFwiICsgc2F2ZWRaaXApO1xyXG4gICAgICAgICAgICBmcy53cml0ZUZpbGUoc2F2ZWRaaXAsIGJvZHksIGVyciA9PiByZXNvbHZlKCFlcnIpKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgaWYgKCFzdWNjZXNzKSByZXR1cm4gc3VjY2VzcztcclxuXHJcbiAgICAvLyBDaGVjayBhbmQgZGVsZXRlIHJlbmFtZSBleHRyYWN0aW9uXHJcbiAgICBjb25zdCBhbHJlYWR5RXhpc3RzID0gYXdhaXQgbmV3IFByb21pc2UocmVzID0+IGZzLmV4aXN0cyhleHRyYWN0ZWRGb2xkZXIsIHJlcykpO1xyXG4gICAgaWYgKGFscmVhZHlFeGlzdHMpIGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5yZW5hbWUoZXh0cmFjdGVkRm9sZGVyLCBgJHtleHRyYWN0ZWRGb2xkZXJ9LmJhayR7TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSl9YCwgcmVzKSk7XHJcbiAgICBcclxuICAgIC8vIFVuemlwIHRoZSBkb3dubG9hZGVkIHppcCBmaWxlXHJcbiAgICBjb25zdCB6aXBmaWxlID0gYXdhaXQgbmV3IFByb21pc2UociA9PiB5YXV6bC5vcGVuKHNhdmVkWmlwLCB7bGF6eUVudHJpZXM6IHRydWV9LCAoZXJyLCB6aXApID0+ICByKHppcCkpKTtcclxuICAgIHppcGZpbGUub24oXCJlbnRyeVwiLCBmdW5jdGlvbihlbnRyeSkge1xyXG4gICAgICAgIC8vIFNraXAgZGlyZWN0b3JpZXMsIHRoZXkgYXJlIGhhbmRsZWQgd2l0aCBta2RpcnBcclxuICAgICAgICBpZiAoZW50cnkuZmlsZU5hbWUuZW5kc1dpdGgoXCIvXCIpKSByZXR1cm4gemlwZmlsZS5yZWFkRW50cnkoKTtcclxuXHJcbiAgICAgICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJFeHRyYWN0aW5nIFwiICsgZW50cnkuZmlsZU5hbWUpO1xyXG4gICAgICAgIC8vIE1ha2UgYW55IG5lZWRlZCBwYXJlbnQgZGlyZWN0b3JpZXNcclxuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBlbnRyeS5maWxlTmFtZSk7XHJcbiAgICAgICAgbWtkaXJwLnN5bmMocGF0aC5kaXJuYW1lKGZ1bGxQYXRoKSk7XHJcbiAgICAgICAgemlwZmlsZS5vcGVuUmVhZFN0cmVhbShlbnRyeSwgZnVuY3Rpb24oZXJyLCByZWFkU3RyZWFtKSB7XHJcbiAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBzdWNjZXNzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJlYWRTdHJlYW0ub24oXCJlbmRcIiwgZnVuY3Rpb24oKSB7emlwZmlsZS5yZWFkRW50cnkoKTt9KTsgLy8gR28gdG8gbmV4dCBmaWxlIGFmdGVyIHRoaXNcclxuICAgICAgICAgICAgcmVhZFN0cmVhbS5waXBlKGZzLmNyZWF0ZVdyaXRlU3RyZWFtKGZ1bGxQYXRoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHppcGZpbGUucmVhZEVudHJ5KCk7IC8vIFN0YXJ0IHJlYWRpbmdcclxuXHJcbiAgICAvLyBXYWl0IGZvciB0aGUgZmluYWwgZmlsZSB0byBmaW5pc2hcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gemlwZmlsZS5vbmNlKFwiZW5kXCIsIHJlc29sdmUpKTtcclxuXHJcbiAgICAvLyBTYXZlIGEgYmFja3VwIGluIGNhc2Ugc29tZXRoaW5nIGdvZXMgd3JvbmcgZHVyaW5nIGZpbmFsIHN0ZXBcclxuICAgIGNvbnN0IGJhY2t1cEZvbGRlciA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBgJHtmb2xkZXJOYW1lfS5iYWske01hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkpfWApO1xyXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBmcy5yZW5hbWUoaW5qZWN0aW9uUGF0aCwgYmFja3VwRm9sZGVyLCByZXNvbHZlKSk7XHJcblxyXG4gICAgLy8gUmVuYW1lIHRoZSBleHRyYWN0ZWQgZm9sZGVyIHRvIHdoYXQgaXQgc2hvdWxkIGJlXHJcbiAgICBVdGlscy5sb2coXCJJbmplY3RvclVwZGF0ZVwiLCBgUmVuYW1pbmcgJHtwYXRoLmJhc2VuYW1lKGV4dHJhY3RlZEZvbGRlcil9IHRvICR7Zm9sZGVyTmFtZX1gKTtcclxuICAgIHN1Y2Nlc3MgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IGZzLnJlbmFtZShleHRyYWN0ZWRGb2xkZXIsIGluamVjdGlvblBhdGgsIGVyciA9PiByZXNvbHZlKCFlcnIpKSk7XHJcbiAgICBpZiAoIXN1Y2Nlc3MpIHtcclxuICAgICAgICBVdGlscy5lcnIoXCJJbmplY3RvclVwZGF0ZVwiLCBcIkZhaWxlZCB0byByZW5hbWUgdGhlIGZpbmFsIGRpcmVjdG9yeVwiKTtcclxuICAgICAgICByZXR1cm4gc3VjY2VzcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiByZW5hbWUgaGFkIGlzc3VlcywgZGVsZXRlIHdoYXQgd2UgdHJpZWQgdG8gcmVuYW1lIGFuZCByZXN0b3JlIGJhY2t1cFxyXG4gICAgaWYgKCFzdWNjZXNzKSB7XHJcbiAgICAgICAgVXRpbHMuZXJyKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJTb21ldGhpbmcgd2VudCB3cm9uZy4uLiByZXN0b3JpbmcgYmFja3Vwcy5cIik7XHJcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBybXJmKGV4dHJhY3RlZEZvbGRlciwgcmVzb2x2ZSkpO1xyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMucmVuYW1lKGJhY2t1cEZvbGRlciwgaW5qZWN0aW9uUGF0aCwgcmVzb2x2ZSkpO1xyXG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHdlJ3ZlIGdvdHRlbiB0byB0aGlzIHBvaW50LCBldmVyeXRoaW5nIHNob3VsZCBoYXZlIGdvbmUgc21vb3RobHkuXHJcbiAgICAvLyBDbGVhbnVwIHRoZSBiYWNrdXAgZm9sZGVyIHRoZW4gcmVtb3ZlIHRoZSB6aXBcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gcm1yZihiYWNrdXBGb2xkZXIsIHJlc29sdmUpKTtcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMudW5saW5rKHNhdmVkWmlwLCByZXNvbHZlKSk7XHJcblxyXG4gICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJJbmplY3RvciBVcGRhdGVkIVwiKTtcclxuICAgIHJldHVybiBzdWNjZXNzOyovXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgQ29yZSgpO1xyXG5cclxuLyoqXHJcbiAqIERvbid0IGV4cG9zZSBjb3JlIC0gY291bGQgYmUgZGFuZ2Vyb3VzIGZvciBub3dcclxuICovIiwiY29uc3QgX19ub25fd2VicGFja19yZXF1aXJlX18gPSB3aW5kb3cucmVxdWlyZVxyXG5cclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5cclxuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XHJcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcclxuY29uc3QgcmVsZWFzZUNoYW5uZWwgPSBEaXNjb3JkTmF0aXZlLmdsb2JhbHMgPyBEaXNjb3JkTmF0aXZlLmdsb2JhbHMucmVsZWFzZUNoYW5uZWwgOiBEaXNjb3JkTmF0aXZlLmFwcCA/IERpc2NvcmROYXRpdmUuYXBwLmdldFJlbGVhc2VDaGFubmVsKCkgOiBcInN0YWJsZVwiO1xyXG5cclxubGV0IGRhdGFQYXRoID0gXCJcIjtcclxuaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIikgZGF0YVBhdGggPSBwcm9jZXNzLmVudi5BUFBEQVRBO1xyXG5lbHNlIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcImRhcndpblwiKSBkYXRhUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmVudi5IT01FLCBcIkxpYnJhcnlcIiwgXCJQcmVmZXJlbmNlc1wiKTtcclxuZWxzZSBkYXRhUGF0aCA9IHByb2Nlc3MuZW52LlhER19DT05GSUdfSE9NRSA/IHByb2Nlc3MuZW52LlhER19DT05GSUdfSE9NRSA6IHBhdGguam9pbihwcm9jZXNzLmVudi5IT01FLCBcIi5jb25maWdcIik7XHJcbmRhdGFQYXRoID0gcGF0aC5qb2luKGRhdGFQYXRoLCBcIkJldHRlckRpc2NvcmRcIik7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRGF0YVN0b3JlIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IHtzZXR0aW5nczoge3N0YWJsZToge30sIGNhbmFyeToge30sIHB0Yjoge319fTtcclxuICAgICAgICB0aGlzLnBsdWdpbkRhdGEgPSB7fTtcclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuRGF0YVN0b3JlID0gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRpYWxpemUoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuQkRGaWxlKSkgZnMud3JpdGVGaWxlU3luYyh0aGlzLkJERmlsZSwgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCA0KSwgXCJ1dGYtOFwiKTtcclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMuQkRGaWxlLCBcInV0Zi04XCIpKVxyXG4gICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShcInNldHRpbmdzXCIpKSB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5zZXR0aW5nc0ZpbGUpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGxldCBzZXR0aW5ncyA9IF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fKHRoaXMuc2V0dGluZ3NGaWxlKTtcclxuICAgICAgICAgICAgZnMudW5saW5rU3luYyh0aGlzLnNldHRpbmdzRmlsZSk7XHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShcInNldHRpbmdzXCIpKSBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe3N0YWJsZToge30sIGNhbmFyeToge30sIHB0Yjoge319LCB7W3JlbGVhc2VDaGFubmVsXTogc2V0dGluZ3N9KTtcclxuICAgICAgICAgICAgZWxzZSBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe3N0YWJsZToge30sIGNhbmFyeToge30sIHB0Yjoge319LCBzZXR0aW5ncyk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0QkREYXRhKFwic2V0dGluZ3NcIiwgc2V0dGluZ3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgVXRpbHMuYWxlcnQoXCJDb3JydXB0IFN0b3JhZ2VcIiwgXCJUaGUgYmQgc3RvcmFnZSBoYXMgc29tZWhvdyBiZWNvbWUgY29ycnVwdC4gWW91IG1heSBlaXRoZXIgdHJ5IHRvIHNhbHZhZ2UgdGhlIGZpbGUgb3IgZGVsZXRlIGl0IHRoZW4gcmVsb2FkLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGluamVjdGlvblBhdGgoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luamVjdGlvblBhdGggPSBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLl9pbmplY3Rpb25QYXRoKSByZXR1cm4gdGhpcy5faW5qZWN0aW9uUGF0aDtcclxuICAgICAgICBjb25zdCBlbGVjdHJvbiA9IHJlcXVpcmUoXCJlbGVjdHJvblwiKS5yZW1vdGUuYXBwO1xyXG4gICAgICAgIGNvbnN0IGJhc2UgPSBlbGVjdHJvbi5nZXRBcHBQYXRoKCk7XHJcbiAgICAgICAgY29uc3Qgcm9hbWluZ0Jhc2UgPSBlbGVjdHJvbi5nZXRQYXRoKFwidXNlckRhdGFcIik7XHJcbiAgICAgICAgY29uc3Qgcm9hbWluZ0xvY2F0aW9uID0gcGF0aC5yZXNvbHZlKHJvYW1pbmdCYXNlLCBlbGVjdHJvbi5nZXRWZXJzaW9uKCksIFwibW9kdWxlc1wiLCBcImRpc2NvcmRfZGVza3RvcF9jb3JlXCIsIFwiaW5qZWN0b3JcIik7XHJcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSBwYXRoLnJlc29sdmUoYmFzZSwgXCIuLlwiLCBcImFwcFwiKTtcclxuICAgICAgICBjb25zdCByZWFsTG9jYXRpb24gPSBmcy5leGlzdHNTeW5jKGxvY2F0aW9uKSA/IGxvY2F0aW9uIDogZnMuZXhpc3RzU3luYyhyb2FtaW5nTG9jYXRpb24pID8gcm9hbWluZ0xvY2F0aW9uIDogbnVsbDtcclxuICAgICAgICBpZiAoIXJlYWxMb2NhdGlvbikgcmV0dXJuIHRoaXMuX2luamVjdGlvblBhdGggPSBudWxsO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbmplY3Rpb25QYXRoID0gcmVhbExvY2F0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb25maWdGaWxlKCkge3JldHVybiB0aGlzLl9jb25maWdGaWxlIHx8ICh0aGlzLl9jb25maWdGaWxlID0gcGF0aC5yZXNvbHZlKHRoaXMuaW5qZWN0aW9uUGF0aCwgXCJiZXR0ZXJkaXNjb3JkXCIsIFwiY29uZmlnLmpzb25cIikpO31cclxuICAgIGdldCBCREZpbGUoKSB7cmV0dXJuIHRoaXMuX0JERmlsZSB8fCAodGhpcy5fQkRGaWxlID0gcGF0aC5yZXNvbHZlKGRhdGFQYXRoLCBcImJkc3RvcmFnZS5qc29uXCIpKTt9XHJcbiAgICBnZXQgc2V0dGluZ3NGaWxlKCkge3JldHVybiB0aGlzLl9zZXR0aW5nc0ZpbGUgfHwgKHRoaXMuX3NldHRpbmdzRmlsZSA9IHBhdGgucmVzb2x2ZShkYXRhUGF0aCwgXCJiZHNldHRpbmdzLmpzb25cIikpO31cclxuICAgIGdldFBsdWdpbkZpbGUocGx1Z2luTmFtZSkge3JldHVybiBwYXRoLnJlc29sdmUoQ29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlciwgcGx1Z2luTmFtZSArIFwiLmNvbmZpZy5qc29uXCIpO31cclxuXHJcbiAgICBnZXRTZXR0aW5nR3JvdXAoa2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5zZXR0aW5nc1tyZWxlYXNlQ2hhbm5lbF1ba2V5XSB8fCBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFNldHRpbmdHcm91cChrZXksIGRhdGEpIHtcclxuICAgICAgICB0aGlzLmRhdGEuc2V0dGluZ3NbcmVsZWFzZUNoYW5uZWxdW2tleV0gPSBkYXRhO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5CREZpbGUsIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSwgbnVsbCwgNCksIFwidXRmLThcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QkREYXRhKGtleSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFba2V5XSB8fCBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEJERGF0YShrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMuQkRGaWxlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsIDQpLCBcInV0Zi04XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdW2tleV07XHJcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuZ2V0UGx1Z2luRmlsZShwbHVnaW5OYW1lKSkpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpKSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXVtrZXldO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9PT0gdW5kZWZpbmVkKSB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPSB7fTtcclxuICAgICAgICB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV1ba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpLCBKU09OLnN0cmluZ2lmeSh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0sIG51bGwsIDQpLCBcInV0Zi04XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlbGV0ZVBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9PT0gdW5kZWZpbmVkKSB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPSB7fTtcclxuICAgICAgICBkZWxldGUgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdW2tleV07XHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLmdldFBsdWdpbkZpbGUocGx1Z2luTmFtZSksIEpTT04uc3RyaW5naWZ5KHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSwgbnVsbCwgNCksIFwidXRmLThcIik7XHJcbiAgICB9XHJcbn07IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRGV2TW9kZSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmRlYnVnTGlzdGVuZXIgPSB0aGlzLmRlYnVnTGlzdGVuZXIuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmNvcHlTZWxlY3Rvckxpc3RlbmVyID0gdGhpcy5jb3B5U2VsZWN0b3JMaXN0ZW5lci5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCkge1xyXG4gICAgICAgIHRoaXMuc3RhcnREZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1kbS0xXCJdKSB0aGlzLnN0YXJ0Q29weVNlbGVjdG9yKCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHN0b3AoKSB7XHJcbiAgICAgICAgdGhpcy5zdG9wRGVidWdMaXN0ZW5lcigpO1xyXG4gICAgICAgIHRoaXMuc3RvcENvcHlTZWxlY3RvcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0RGVidWdMaXN0ZW5lcigpIHtcclxuICAgICAgICB0aGlzLnN0b3BEZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5kZWJ1Z0xpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBzdG9wRGVidWdMaXN0ZW5lcigpIHtcclxuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLmRlYnVnTGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0Q29weVNlbGVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuc3RvcENvcHlTZWxlY3RvcigpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCB0aGlzLmNvcHlTZWxlY3Rvckxpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBzdG9wQ29weVNlbGVjdG9yKCkge1xyXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCB0aGlzLmNvcHlTZWxlY3Rvckxpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBkZWJ1Z0xpc3RlbmVyKGUpIHtcclxuICAgICAgICBpZiAoZS53aGljaCA9PT0gMTE5IHx8IGUud2hpY2ggPT0gMTE4KSB7Ly9GOFxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIiVjWyVjRGV2TW9kZSVjXSAlY0JyZWFrL1Jlc3VtZVwiLCBcImNvbG9yOiByZWQ7XCIsIFwiY29sb3I6ICMzMDMwMzA7IGZvbnQtd2VpZ2h0OjcwMDtcIiwgXCJjb2xvcjpyZWQ7XCIsIFwiXCIpO1xyXG4gICAgICAgICAgICBkZWJ1Z2dlcjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1kZWJ1Z2dlclxyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb3B5U2VsZWN0b3JMaXN0ZW5lcihlKSB7XHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMuZ2V0U2VsZWN0b3IoZS50YXJnZXQpO1xyXG4gICAgXHJcbiAgICAgICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgICAgICBjbGFzc0xheWVyLCBcclxuICAgICAgICAgICAgICAgIGNsYXNzSXRlbXNcclxuICAgICAgICAgICAgXSA9IFtcclxuICAgICAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoKGUpID0+IGUubGF5ZXIgJiYgdHlwZW9mIGUubGF5ZXIgPT09IFwic3RyaW5nXCIgJiYgZS5kaXNhYmxlZFBvaW50ZXJFdmVudHMpWzBdLFxyXG4gICAgICAgICAgICAgICAgQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5tZW51KVswXVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBmdW5jdGlvbiBhdHRhY2goKSB7XHJcbiAgICAgICAgICAgICAgICBpZighY2xhc3NJdGVtcyB8fCAhY2xhc3NMYXllci5sYXllcilyZXR1cm4gY29uc29sZS5sb2coY2xhc3NJdGVtcywgY2xhc3NMYXllci5sYXllcilcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgY20gPSBET00ucXVlcnkoXCIuXCIrVXRpbHMucmVtb3ZlRGEoY2xhc3NJdGVtcy5tZW51KSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudCA+IC5cIitVdGlscy5yZW1vdmVEYShjbGFzc0xheWVyLmxheWVyQ29udGFpbmVyKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY21XcmFwID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke2NsYXNzTGF5ZXIubGF5ZXJ9XCI+YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY20gPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7Y2xhc3NJdGVtcy5tZW51fSAke2NsYXNzSXRlbXMuc3R5bGVGbGV4aWJsZX0gJHtjbGFzc0l0ZW1zLmFjY29tbW9kYXRlU2Nyb2xsYmFyfSBiZC1jb250ZXh0LW1lbnVcIiBzdHlsZT1cIlwiPjwvZGl2PmApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5hcHBlbmQoY20pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmQoY21XcmFwKTtcclxuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuc3R5bGUudG9wID0gZS5jbGllbnRZICsgXCJweFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zdHlsZS5sZWZ0ID0gZS5jbGllbnRYICsgXCJweFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwibWVudVwiKVxyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIi0xXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLmlkID0gXCJiZC1jb3B5LXNlbGVjdG9yLWNvbnRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiQ29weSBTZWxlY3RvciBBY3Rpb25zXCIpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbGVyQ2xhc3NlcyA9IEJETW9kdWxlcy5nZXQoKGUpID0+IGUuc2Nyb2xsZXJXcmFwKVswXVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbGVyV3JhcCA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtzY3JvbGxlckNsYXNzZXMuc2Nyb2xsZXJXcmFwfSAke3Njcm9sbGVyQ2xhc3Nlcy5zY3JvbGxlclRoZW1lZH0gJHtzY3JvbGxlckNsYXNzZXMudGhlbWVHaG9zdEhhaXJsaW5lfVwiPjwvZGl2PmApXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXIgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7QkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsZXIpWzBdLnNjcm9sbGVyfSAke2NsYXNzSXRlbXMuc2Nyb2xsZXJ9XCI+PC9kaXY+YClcclxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxlcldyYXAuYXBwZW5kKHNjcm9sbGVyKVxyXG4gICAgICAgICAgICAgICAgICAgIGNtLmFwcGVuZChzY3JvbGxlcldyYXApXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZUNNID0gZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5rZXlDb2RlICYmIGUua2V5Q29kZSAhPT0gMjcpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY21XcmFwLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgcmVtb3ZlQ00pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgcmVtb3ZlQ00pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgcmVtb3ZlQ00pO1xyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHJlbW92ZUNNKTtcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgcmVtb3ZlQ00pO1xyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjbVdyYXAgPSBjbS5wYXJlbnRFbGVtZW50XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbGVyID0gY20uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjbWcgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiByb2xlPVwiZ3JvdXBcIj48L2Rpdj5gKTtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogQHR5cGUge0hUTUxFbGVtZW50fVxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjbWkgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7Y2xhc3NJdGVtcy5pdGVtfSAke2NsYXNzSXRlbXMubGFiZWxDb250YWluZXJ9ICR7Y2xhc3NJdGVtcy5jb2xvckRlZmF1bHR9XCIgcm9sZT1cIm1lbnVpdGVtXCIgaWQ9XCJiZC1jb3B5LXNlbGVjdG9yLWl0ZW0tY21cIj48L2Rpdj5gKTtcclxuICAgICAgICAgICAgICAgIGNtaS5hcHBlbmQoRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke2NsYXNzSXRlbXMubGFiZWx9XCI+Q29weSBTZWxlY3RvcjwvZGl2PmApKTtcclxuICAgICAgICAgICAgICAgIGNtaS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuTmF0aXZlTW9kdWxlLmNvcHkoc2VsZWN0b3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgY21pLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW92ZXJcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudHMgPSBET00ucXVlcnlBbGwoXCJkaXZbcm9sZT1tZW51aXRlbV0uXCIrVXRpbHMucmVtb3ZlRGEoY2xhc3NJdGVtcy5mb2N1c2VkKSlcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyAmJiBlbGVtZW50cy5mb3JFYWNoKGVsZW0gPT4gZWxlbS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzSXRlbXMuZm9jdXNlZCkpXHJcbiAgICAgICAgICAgICAgICAgICAgY21pLmNsYXNzTGlzdC5hZGQoY2xhc3NJdGVtcy5mb2N1c2VkKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIGNtaS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdXRcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjbWkuY2xhc3NMaXN0LnJlbW92ZShjbGFzc0l0ZW1zLmZvY3VzZWQpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgY21nLmFwcGVuZChjbWkpO1xyXG4gICAgICAgICAgICAgICAgaWYoc2Nyb2xsZXIuY2hpbGROb2Rlcy5sZW5ndGgpeyAvLyBhcGVuZCBhIHNlcGFyYXRvclxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcGFyYXRvciA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IHJvbGU9XCJzZXBhcmF0b3JcIiBjbGFzcz1cIiR7Y2xhc3NJdGVtcy5zZXBhcmF0b3J9XCI+PC9kaXY+YClcclxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxlci5hcHBlbmQoc2VwYXJhdG9yKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc2Nyb2xsZXIuYXBwZW5kKGNtZyk7XHJcbiAgICAgICAgICAgICAgICBpZihjbVdyYXAuY2xpZW50SGVpZ2h0IDwgY21XcmFwLnNjcm9sbEhlaWdodCl7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJvdmVyZmxvd2luZyBcIitjbVdyYXAuc3R5bGUudG9wKVxyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zdHlsZS50b3AgPSAoY21XcmFwLnN0eWxlLnRvcCAtIGNtZy5jbGllbnRIZWlnaHQpICsgXCJweFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwib3ZlcmZsb3dpbmdcIitjbVdyYXAuc3R5bGUudG9wKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgc2V0VGltZW91dChhdHRhY2gsIDEpO1xyXG4gICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRTZWxlY3RvcihlbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQuaWQpIHJldHVybiBgIyR7ZWxlbWVudC5pZH1gO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGxQYXRoKGVsKXtcclxuICAgICAgICAgICAgdmFyIG5hbWVzID0gW107XHJcbiAgICAgICAgICAgIHdoaWxlIChlbC5wYXJlbnROb2RlKXtcclxuICAgICAgICAgICAgICBpZiAoZWwuaWQpe1xyXG4gICAgICAgICAgICAgICAgbmFtZXMudW5zaGlmdCgnIycrZWwuaWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWw9PWVsLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSBuYW1lcy51bnNoaWZ0KGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKStBcnJheS5mcm9tKGVsLmNsYXNzTGlzdC5lbnRyaWVzKCkpLm1hcChlID0+IFwiLlwiK2UpLmpvaW4oXCJcIikpO1xyXG4gICAgICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYz0xLGU9ZWw7ZS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO2U9ZS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLGMrKyk7XHJcbiAgICAgICAgICAgICAgICAgIG5hbWVzLnVuc2hpZnQoZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpKygodHlwZW9mIGVsLmNsYXNzTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBlbC5jbGFzc05hbWUpIHx8IFwiXCIpLnNwbGl0KFwiIFwiKS5maWx0ZXIoZSA9PiAhIWUpLm1hcChlID0+IFwiLlwiK2UpLmpvaW4oXCJcIikrXCI6bnRoLWNoaWxkKFwiK2MrXCIpXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWw9ZWwucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5hbWVzLmpvaW4oXCIgPiBcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmdWxsUGF0aChlbGVtZW50KVxyXG4gICAgfVxyXG59OyIsImV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBEaXNhYmxlVHlwaW5nIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LnN0YXJ0VHlwaW5nKVxyXG4gICAgICAgIC50aGVuKHR5cGluZ01vZHVsZSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBzZWxmID0gdGhpc1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydFR5cGluZyA9IHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0YXJ0VHlwaW5nXHJcbiAgICAgICAgICAgIHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0YXJ0VHlwaW5nID0gZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgIGlmKHNlbGYuZGlzYWJsZWQpcmV0dXJuIHN0YXJ0VHlwaW5nLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHN0b3BUeXBpbmcgPSB0eXBpbmdNb2R1bGUuZGVmYXVsdC5zdG9wVHlwaW5nXHJcbiAgICAgICAgICAgIHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0b3BUeXBpbmcgPSBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgaWYoc2VsZi5kaXNhYmxlZClyZXR1cm4gc3RvcFR5cGluZy5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkRpc2FibGVUeXBpbmcgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZSgpe1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKCl7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQnVnSHVudGVyQmFkZ2UgZnJvbSBcIi4uL3N2Zy9idWdfaHVudGVyXCJcclxuaW1wb3J0IG5vZGVGZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiXHJcbmltcG9ydCB7IHNldHRpbmdzQ29va2llIH0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDaXJjdXMgZnJvbSBcIi4uL3N2Zy9jaXJjdXNcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1dWlkdjQoKSB7IC8vIEdlbmVyYXRlIFVVSUQgKE5vIGNyeXB0byBybmcpXHJcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbihjKSB7XHJcbiAgICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwLCB2ID0gYyA9PSAneCcgPyByIDogKHIgJiAweDMgfCAweDgpO1xyXG4gICAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcclxuICAgIH0pO1xyXG59ICBcclxuXHJcbmNvbnN0IGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXMgPSB7fVxyXG5sZXQgYmFkZ2VzVG9GZXRjaCA9IFtdXHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRGlzdGFudFNlcnZlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuX2NhY2hlID0ge1xyXG4gICAgICAgICAgICBiYWRnZXM6IHtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkRpc3RhbnRTZXJ2ZXIgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNhY2hlKCl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlXHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGNhY2hlKGRhdGEpe1xyXG4gICAgICAgIGlmKHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB0aGlzLl9jYWNoZSAhPT0gXCJvYmplY3RcIilyZXR1cm4gdGhpcy5fY2FjaGUgPSBkYXRhXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlID0gT2JqZWN0LmFzc2lnbih0aGlzLl9jYWNoZSwgZGF0YSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBjdXN0b20gYmFkZ2VzIGZyb20gdGhlIHVzZXIgSUQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlciBUaGUgdXNlciBJRCBcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnN0YW50c1tcImJhZGdlc1wiXT59XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldEJhZGdlcyh1c2VyKXtcclxuICAgICAgICBpZih0aGlzLmNhY2hlLmJhZGdlc1t1c2VyXSlyZXR1cm4gdGhpcy5jYWNoZS5iYWRnZXNbdXNlcl1cclxuICAgICAgICBpZihhd2FpdGluZ0JhZGdlc1Byb21pc2VzW3VzZXJdKXJldHVybiBhd2FpdGluZ0JhZGdlc1Byb21pc2VzW3VzZXJdXHJcblxyXG4gICAgICAgIGxldCByZXNvbHZlXHJcbiAgICAgICAgY29uc3QgbmV3UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXMpID0+IChyZXNvbHZlID0gcmVzKSlcclxuICAgICAgICBhd2FpdGluZ0JhZGdlc1Byb21pc2VzW3VzZXJdID0gbmV3UHJvbWlzZVxyXG5cclxuICAgICAgICBjb25zdCBiYWRnZXMgPSBbXVxyXG4gICAgICAgIGZvcihsZXQgYmFkZ2Ugb2YgQ29uc3RhbnRzLmJhZGdlcyl7XHJcbiAgICAgICAgICAgIGlmKGJhZGdlLmRlZmF1bHRVc2Vycy5pbmNsdWRlcyh1c2VyKSliYWRnZXMucHVzaChiYWRnZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZmV0Y2hlZEJhZGdlcyA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmKCFzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC01XCJdKXJldHVybiByZXNvbHZlKFtdKVxyXG4gICAgICAgICAgICBiYWRnZXNUb0ZldGNoLnB1c2goW3VzZXIsIHJlc29sdmVdKVxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCB1c2VycyA9IGJhZGdlc1RvRmV0Y2hcclxuICAgICAgICAgICAgICAgIGlmKHVzZXJzLmxlbmd0aCA9PT0gMClyZXR1cm5cclxuICAgICAgICAgICAgICAgIGJhZGdlc1RvRmV0Y2ggPSBbXVxyXG4gICAgICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChSb3V0ZXMuYmFkZ2VzLCBcIlBPU1RcIiwgSlNPTi5zdHJpbmdpZnkodXNlcnMubWFwKGUgPT4gZVswXSkpKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApey8vIENvdWxkbid0IGZldGNoIGJhZGdlczogc2VydmVyIGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJzLmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdKFtdKS8vIHJlc29sdmUgbm8gYmFkZ2UgZmV0Y2hlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZUJvZHkgPSBhd2FpdCByZXMuanNvbigpXHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCB1c2VyIG9mIHJlc3BvbnNlQm9keSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9taXNlID0gdXNlcnMuZmluZChwcm9taXNlID0+IHByb21pc2VbMF0gPT09IHVzZXIudXNlcl9pZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZVsxXSh1c2VyLmJhZGdlcylcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7Ly8gQ291bGRuJ3QgZmV0Y2ggYmFkZ2VzOiBlcnJvclxyXG4gICAgICAgICAgICAgICAgICAgIGlmKCEoZXJyIGluc3RhbmNlb2YgTGlnaHRjb3JkRXJyb3IpKWNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgICAgIHVzZXJzLmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMV0oW10pLy8gcmVzb2x2ZSBubyBiYWRnZSBmZXRjaGVkXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0sIDApXHJcbiAgICAgICAgfSlcclxuICAgICAgICBmb3IobGV0IGJhZGdlIG9mIGZldGNoZWRCYWRnZXMpe1xyXG4gICAgICAgICAgICBpZighQ29uc3RhbnRzLmJhZGdlcy5maW5kKGUgPT4gZS5pZCA9PT0gYmFkZ2UpKWNvbnRpbnVlIC8vIFdlIGRvIG5vdCBoYXZlIHRoZSBDb21wb25lbnQsIHNraXAgaXQuXHJcbiAgICAgICAgICAgIGlmKGJhZGdlcy5maW5kKGUgPT4gZS5pZCA9PT0gYmFkZ2UpKWNvbnRpbnVlIC8vIEFscmVhZHkgaW5zZXJ0ZWQuXHJcbiAgICAgICAgICAgIGJhZGdlcy5wdXNoKENvbnN0YW50cy5iYWRnZXMuZmluZChlID0+IGUuaWQgPT09IGJhZGdlKSlcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jYWNoZSA9IHtcclxuICAgICAgICAgICAgYmFkZ2VzOiBPYmplY3QuYXNzaWduKHRoaXMuY2FjaGUuYmFkZ2VzLCB7W3VzZXJdOiBiYWRnZXN9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2FjaGUuYmFkZ2VzW3VzZXJdXHJcbiAgICAgICAgfSwgNjAwMDAwKTtcclxuXHJcbiAgICAgICAgcmVzb2x2ZShiYWRnZXMpXHJcbiAgICAgICAgZGVsZXRlIGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXNbdXNlcl1cclxuICAgICAgICByZXR1cm4gYmFkZ2VzXHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZVJlcXVlc3QgPSBmdW5jdGlvbihyb3V0ZSwgbWV0aG9kLCBkYXRhKXtcclxuICAgIGlmKCFzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC01XCJdKXtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IExpZ2h0Y29yZEVycm9yKFwiVGhlIGN1cnJlbnQgc2V0dGluZ3MgYmxvY2tlZCB0aGUgcmVxdWVzdC5cIikpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gbm9kZUZldGNoKGAke0NvbnN0YW50cy5TRVJWRVJfVVJMfS9hcGkvdjEke3JvdXRlfWAsIHtcclxuICAgICAgICBtZXRob2QsXHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICBcIkNMSUVOVFwiOiBcIkxpZ2h0Y29yZFwiLFxyXG4gICAgICAgICAgICBcIkF1dGhvcml6YXRpb25cIjogd2luZG93LkxpZ2h0Y29yZC5BcGkuQXV0aG9yaXphdGlvbiB8fCBcIk5vbmU6OkFub255bW91c1wiXHJcbiAgICAgICAgfSxcclxuICAgICAgICAuLi4oZGF0YSA/IHtcclxuICAgICAgICAgICAgYm9keTogZGF0YVxyXG4gICAgICAgIH0gOiB7fSlcclxuICAgIH0pXHJcbn1cclxuXHJcbmNsYXNzIExpZ2h0Y29yZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpXHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJMaWdodGNvcmRFcnJvclwiXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBDb25zdGFudHMgPSB7XHJcbiAgICBTRVJWRVJfVVJMOiBcImh0dHBzOi8vbGlnaHRjb3JkLmRlcm9rdS54eXpcIixcclxuICAgIGJhZGdlczogWyAvLyBUT0RPOiBBZGQgbW9yZSBiYWRnZXMgKyBzZXJ2ZXIgc2lkZSBzdmdcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiTGlnaHRjb3JkIEJ1ZyBIdW50ZXJcIixcclxuICAgICAgICAgICAgaWQ6IFwiZjA0Njk4ZjUtODE2Yi00MWUzLWJkMDEtOTIyOTExOTNkN2E1XCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHRVc2VyczogW1xyXG4gICAgICAgICAgICAgICAgXCI2OTY0ODExOTQ0NDMwMTQxNzRcIixcclxuICAgICAgICAgICAgICAgIFwiNjk2MDAzNDU2NjExMzg1Mzk2XCJcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgc2NvcGVzOiBbXSxcclxuICAgICAgICAgICAgY29tcG9uZW50OiBCdWdIdW50ZXJCYWRnZSxcclxuICAgICAgICAgICAgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vbGlnaHRjb3JkL2xpZ2h0Y29yZC93aWtpL2JhZGdlcyNidWdfaHVudGVyXCJcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiQnVmZm9vblwiLFxyXG4gICAgICAgICAgICBpZDogXCIwNjkwNGQzMS02NWI0LTQxZWMtYTUwYy04NjU4YmJkMWFmOTZcIixcclxuICAgICAgICAgICAgZGVmYXVsdFVzZXJzOiBbXHJcbiAgICAgICAgICAgICAgICBcIjM4OTAxNjg5NTU0MzcwNTYwMlwiLFxyXG4gICAgICAgICAgICAgICAgXCI2NjQ2MDAxMzQ1Mjg2NjM1NjVcIixcclxuICAgICAgICAgICAgICAgIFwiNjI1MzUwNjU3ODI5ODk2MjI0XCJcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgc2NvcGVzOiBbXSxcclxuICAgICAgICAgICAgY29tcG9uZW50OiBDaXJjdXMsXHJcbiAgICAgICAgICAgIGhyZWY6IFwiaHR0cHM6Ly95b3V0dS5iZS9FSnRiNnotZGxUOD90PTE0NVwiXHJcbiAgICAgICAgfVxyXG4gICAgXVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgUm91dGVzID0ge1xyXG4gICAgYmFkZ2VzOiBgL3VzZXJzL2JhZGdlc2BcclxufSIsIi8qKlxyXG4gKiBDb3B5cmlnaHQgMjAxOCBaYWNoYXJ5IFJhdWVuXHJcbiAqXHJcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZ1xyXG4gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSxcclxuICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcclxuICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcclxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZFxyXG4gKiB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XHJcbiAqXHJcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxyXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxyXG4gKlxyXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsXHJcbiAqIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBXHJcbiAqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFRcclxuICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GXHJcbiAqIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRVxyXG4gKiBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cclxuICogXHJcbiAqIEZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JEUGx1Z2luTGlicmFyeVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJmYWNlXHJcbiAqIEBuYW1lIE9mZnNldFxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gdG9wIC0gVG9wIG9mZnNldCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSByaWdodCAtIFJpZ2h0IG9mZnNldCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBib3R0b20gLSBCb3R0b20gb2Zmc2V0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxlZnQgLSBMZWZ0IG9mZnNldCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgLSBPdXRlciBoZWlnaHQgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2lkdGggLSBPdXRlciB3aWR0aCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAqL1xyXG5cclxuIC8qKlxyXG4gKiBGdW5jdGlvbiB0aGF0IGF1dG9tYXRpY2FsbHkgcmVtb3ZlcyBhZGRlZCBsaXN0ZW5lci5cclxuICogQGNhbGxiYWNrIG1vZHVsZTpET01Ub29sc35DYW5jZWxMaXN0ZW5lclxyXG4gKi9cclxuIFxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBET01Ub29scyB7XHJcblxyXG4gICAgc3RhdGljIGVzY2FwZUlEKGlkKSB7XHJcbiAgICAgICAgcmV0dXJuIGlkLnJlcGxhY2UoL15bXmEtel0rfFteXFx3LV0rL2dpLCBcIi1cIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcblx0ICogQWRkcyBhIHN0eWxlIHRvIHRoZSBkb2N1bWVudC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBpZGVudGlmaWVyIHRvIHVzZSBhcyB0aGUgZWxlbWVudCBpZFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBjc3MgLSBjc3MgdG8gYWRkIHRvIHRoZSBkb2N1bWVudFxyXG5cdCAqL1xyXG5cdHN0YXRpYyBhZGRTdHlsZShpZCwgY3NzKSB7XHJcblx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZChET01Ub29scy5jcmVhdGVFbGVtZW50KGA8c3R5bGUgaWQ9XCIke2lkfVwiPiR7Y3NzfTwvc3R5bGU+YCkpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyBhIHN0eWxlIGZyb20gdGhlIGRvY3VtZW50LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIG9yaWdpbmFsIGlkZW50aWZpZXIgdXNlZFxyXG5cdCAqL1xyXG5cdHN0YXRpYyByZW1vdmVTdHlsZShpZCkge1xyXG5cdFx0Y29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcclxuXHRcdGlmIChlbGVtZW50KSBlbGVtZW50LnJlbW92ZSgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcy9yZXF1aXJlcyBhIHJlbW90ZSBzY3JpcHQgdG8gYmUgbG9hZGVkXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gaWRlbnRpZmllciB0byB1c2UgZm9yIHRoaXMgc2NyaXB0XHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIHVybCBmcm9tIHdoaWNoIHRvIGxvYWQgdGhlIHNjcmlwdFxyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2NyaXB0IGlzIGxvYWRlZFxyXG5cdCAqL1xyXG5cdHN0YXRpYyBhZGRTY3JpcHQoaWQsIHVybCkge1xyXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG5cdFx0XHRjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xyXG5cdFx0XHRzY3JpcHQuaWQgPSBpZDtcclxuXHRcdFx0c2NyaXB0LnNyYyA9IHVybDtcclxuXHRcdFx0c2NyaXB0LnR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiO1xyXG5cdFx0XHRzY3JpcHQub25sb2FkID0gcmVzb2x2ZTtcclxuXHRcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmQoc2NyaXB0KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyBhIHJlbW90ZSBzY3JpcHQgZnJvbSB0aGUgZG9jdW1lbnQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gb3JpZ2luYWwgaWRlbnRpZmllciB1c2VkXHJcblx0ICovXHJcblx0c3RhdGljIHJlbW92ZVNjcmlwdChpZCkge1xyXG4gICAgICAgIGlkID0gdGhpcy5lc2NhcGVJRChpZCk7XHJcblx0XHRjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xyXG5cdFx0aWYgKGVsZW1lbnQpIGVsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIGh0dHBzOi8vamF2YXNjcmlwdC5pbmZvL2pzLWFuaW1hdGlvblxyXG4gICAgc3RhdGljIGFuaW1hdGUoe3RpbWluZyA9IF8gPT4gXywgdXBkYXRlLCBkdXJhdGlvbn0pIHtcclxuICAgICAgICBjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4gICAgICBcclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gYW5pbWF0ZSh0aW1lKSB7XHJcbiAgICAgICAgICAvLyB0aW1lRnJhY3Rpb24gZ29lcyBmcm9tIDAgdG8gMVxyXG4gICAgICAgICAgbGV0IHRpbWVGcmFjdGlvbiA9ICh0aW1lIC0gc3RhcnQpIC8gZHVyYXRpb247XHJcbiAgICAgICAgICBpZiAodGltZUZyYWN0aW9uID4gMSkgdGltZUZyYWN0aW9uID0gMTtcclxuICAgICAgXHJcbiAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIHN0YXRlXHJcbiAgICAgICAgICBjb25zdCBwcm9ncmVzcyA9IHRpbWluZyh0aW1lRnJhY3Rpb24pO1xyXG4gICAgICBcclxuICAgICAgICAgIHVwZGF0ZShwcm9ncmVzcyk7IC8vIGRyYXcgaXRcclxuICAgICAgXHJcbiAgICAgICAgICBpZiAodGltZUZyYWN0aW9uIDwgMSkge1xyXG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlzIG15IHNoaXQgdmVyc2lvbiBvZiBub3QgaGF2aW5nIHRvIHVzZSBgJGAgZnJvbSBqUXVlcnkuIE1lYW5pbmdcclxuICAgICAqIHRoYXQgeW91IGNhbiBwYXNzIGEgc2VsZWN0b3IgYW5kIGl0IHdpbGwgYXV0b21hdGljYWxseSBydW4ge0BsaW5rIG1vZHVsZTpET01Ub29scy5xdWVyeX0uXHJcbiAgICAgKiBJdCBhbHNvIG1lYW5zIHRoYXQgeW91IGNhbiBwYXNzIGEgc3RyaW5nIG9mIGh0bWwgYW5kIGl0IHdpbGwgcGVyZm9ybSBhbmQgcmV0dXJuIGBwYXJzZUhUTUxgLlxyXG4gICAgICogQHNlZSBtb2R1bGU6RE9NVG9vbHMucGFyc2VIVE1MXHJcbiAgICAgKiBAc2VlIG1vZHVsZTpET01Ub29scy5xdWVyeVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gcXVlcnkgb3IgSFRNTCB0byBwYXJzZVxyXG4gICAgICogQHJldHVybnMgeyhEb2N1bWVudEZyYWdtZW50fE5vZGVMaXN0fEhUTUxFbGVtZW50KX0gLSBFaXRoZXIgdGhlIHJlc3VsdCBvZiBgcGFyc2VIVE1MYCBvciBgcXVlcnlgXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBRKHNlbGVjdG9yKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMucGFyc2VIVE1MKHNlbGVjdG9yKTtcclxuICAgICAgICBjb25zdCBpc0hUTUwgPSBlbGVtZW50IGluc3RhbmNlb2YgTm9kZUxpc3QgPyBBcnJheS5mcm9tKGVsZW1lbnQpLnNvbWUobiA9PiBuLm5vZGVUeXBlID09PSAxKSA6IGVsZW1lbnQubm9kZVR5cGUgPT09IDE7XHJcbiAgICAgICAgaWYgKGlzSFRNTCkgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlcnkoc2VsZWN0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXNzZW50aWFsbHkgYSBzaG9ydGhhbmQgZm9yIGBkb2N1bWVudC5xdWVyeVNlbGVjdG9yYC4gSWYgdGhlIGBiYXNlRWxlbWVudGAgaXMgbm90IHByb3ZpZGVkXHJcbiAgICAgKiBgZG9jdW1lbnRgIGlzIHVzZWQgYnkgZGVmYXVsdC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHF1ZXJ5XHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IFtiYXNlRWxlbWVudF0gLSBFbGVtZW50IHRvIGJhc2UgdGhlIHF1ZXJ5IGZyb21cclxuICAgICAqIEByZXR1cm5zIHsoRWxlbWVudHxudWxsKX0gLSBUaGUgZm91bmQgZWxlbWVudCBvciBudWxsIGlmIG5vdCBmb3VuZFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcXVlcnkoc2VsZWN0b3IsIGJhc2VFbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKCFiYXNlRWxlbWVudCkgYmFzZUVsZW1lbnQgPSBkb2N1bWVudDtcclxuICAgICAgICByZXR1cm4gYmFzZUVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFc3NlbnRpYWxseSBhIHNob3J0aGFuZCBmb3IgYGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGxgLiBJZiB0aGUgYGJhc2VFbGVtZW50YCBpcyBub3QgcHJvdmlkZWRcclxuICAgICAqIGBkb2N1bWVudGAgaXMgdXNlZCBieSBkZWZhdWx0LlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gcXVlcnlcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gW2Jhc2VFbGVtZW50XSAtIEVsZW1lbnQgdG8gYmFzZSB0aGUgcXVlcnkgZnJvbVxyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIEFycmF5IG9mIGFsbCBmb3VuZCBlbGVtZW50c1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcXVlcnlBbGwoc2VsZWN0b3IsIGJhc2VFbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKCFiYXNlRWxlbWVudCkgYmFzZUVsZW1lbnQgPSBkb2N1bWVudDtcclxuICAgICAgICByZXR1cm4gYmFzZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZXMgYSBzdHJpbmcgb2YgSFRNTCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0cy4gSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdHJ1ZSxcclxuICAgICAqIHRoZSBwYXJzZWQgSFRNTCB3aWxsIGJlIHJldHVybmVkIGFzIGEgZG9jdW1lbnQgZnJhZ21lbnQge0BzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50RnJhZ21lbnR9LlxyXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIGlmIHlvdSBoYXZlIGEgbGlzdCBvZiBlbGVtZW50cyBhdCB0aGUgdG9wIGxldmVsLCB0aGV5IGNhbiB0aGVuIGJlIGFwcGVuZGVkIGFsbCBhdCBvbmNlIHRvIGFub3RoZXIgbm9kZS5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgZmFsc2UsIHRoZW4gdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHRoZSBsaXN0IG9mIHBhcnNlZFxyXG4gICAgICogbm9kZXMgYW5kIHRoZXJlIHdlcmUgbXVsdGlwbGUgdG9wIGxldmVsIG5vZGVzLCBvdGhlcndpc2UgdGhlIHNpbmdsZSBub2RlIGlzIHJldHVybmVkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGh0bWwgLSBIVE1MIHRvIGJlIHBhcnNlZFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJhZ21lbnQ9ZmFsc2VdIC0gV2hldGhlciBvciBub3QgdGhlIHJldHVybiBzaG91bGQgYmUgdGhlIHJhdyBgRG9jdW1lbnRGcmFnbWVudGBcclxuICAgICAqIEByZXR1cm5zIHsoRG9jdW1lbnRGcmFnbWVudHxOb2RlTGlzdHxIVE1MRWxlbWVudCl9IC0gVGhlIHJlc3VsdCBvZiBIVE1MIHBhcnNpbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHBhcnNlSFRNTChodG1sLCBmcmFnbWVudCA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XHJcbiAgICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gaHRtbDtcclxuICAgICAgICBjb25zdCBub2RlID0gdGVtcGxhdGUuY29udGVudC5jbG9uZU5vZGUodHJ1ZSk7XHJcbiAgICAgICAgaWYgKGZyYWdtZW50KSByZXR1cm4gbm9kZTtcclxuICAgICAgICByZXR1cm4gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA+IDEgPyBub2RlLmNoaWxkTm9kZXMgOiBub2RlLmNoaWxkTm9kZXNbMF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEFsdGVybmF0ZSBuYW1lIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLnBhcnNlSFRNTH0gKi9cclxuICAgIHN0YXRpYyBjcmVhdGVFbGVtZW50KGh0bWwsIGZyYWdtZW50ID0gZmFsc2UpIHtyZXR1cm4gdGhpcy5wYXJzZUhUTUwoaHRtbCwgZnJhZ21lbnQpO31cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIHN0cmluZyBvZiBodG1sIGFuZCBlc2NhcGVzIGl0IHVzaW5nIHRoZSBicm93ZXIncyBvd24gZXNjYXBpbmcgbWVjaGFuaXNtLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwgLSBodG1sIHRvIGJlIGVzY2FwZWRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGVzY2FwZUhUTUwoaHRtbCkge1xyXG4gICAgICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIik7XHJcbiAgICAgICAgY29uc3Qgc3BhbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcclxuICAgICAgICBzcGFuRWxlbWVudC5hcHBlbmQodGV4dE5vZGUpO1xyXG4gICAgICAgIHRleHROb2RlLm5vZGVWYWx1ZSA9IGh0bWw7XHJcbiAgICAgICAgcmV0dXJuIHNwYW5FbGVtZW50LmlubmVySFRNTDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBsaXN0IG9mIGNsYXNzZXMgZnJvbSB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGVkaXQgY2xhc3NlcyBvZlxyXG4gICAgICogQHBhcmFtIHsuLi5zdHJpbmd9IGNsYXNzZXMgLSBOYW1lcyBvZiBjbGFzc2VzIHRvIGFkZFxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gYGVsZW1lbnRgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYWRkQ2xhc3MoZWxlbWVudCwgLi4uY2xhc3Nlcykge1xyXG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLmZsYXQoKS5maWx0ZXIoYyA9PiBjKTtcclxuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNsYXNzZXMubGVuZ3RoOyBjKyspIGNsYXNzZXNbY10gPSBjbGFzc2VzW2NdLnRvU3RyaW5nKCkuc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLmZsYXQoKS5maWx0ZXIoYyA9PiBjKTtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoLi4uY2xhc3Nlcyk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgbGlzdCBvZiBjbGFzc2VzIGZyb20gdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcclxuICAgICAqIEBwYXJhbSB7Li4uc3RyaW5nfSBjbGFzc2VzIC0gTmFtZXMgb2YgY2xhc3NlcyB0byByZW1vdmVcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIGBlbGVtZW50YCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHJlbW92ZUNsYXNzKGVsZW1lbnQsIC4uLmNsYXNzZXMpIHtcclxuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNsYXNzZXMubGVuZ3RoOyBjKyspIGNsYXNzZXNbY10gPSBjbGFzc2VzW2NdLnRvU3RyaW5nKCkuc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLmZsYXQoKS5maWx0ZXIoYyA9PiBjKTtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoLi4uY2xhc3Nlcyk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGVuIG9ubHkgb25lIGFyZ3VtZW50IGlzIHByZXNlbnQ6IFRvZ2dsZSBjbGFzcyB2YWx1ZTtcclxuICAgICAqIGkuZS4sIGlmIGNsYXNzIGV4aXN0cyB0aGVuIHJlbW92ZSBpdCBhbmQgcmV0dXJuIGZhbHNlLCBpZiBub3QsIHRoZW4gYWRkIGl0IGFuZCByZXR1cm4gdHJ1ZS5cclxuICAgICAqIFdoZW4gYSBzZWNvbmQgYXJndW1lbnQgaXMgcHJlc2VudDpcclxuICAgICAqIElmIHRoZSBzZWNvbmQgYXJndW1lbnQgZXZhbHVhdGVzIHRvIHRydWUsIGFkZCBzcGVjaWZpZWQgY2xhc3MgdmFsdWUsIGFuZCBpZiBpdCBldmFsdWF0ZXMgdG8gZmFsc2UsIHJlbW92ZSBpdC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZWRpdCBjbGFzc2VzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NuYW1lIC0gTmFtZSBvZiBjbGFzcyB0byB0b2dnbGVcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luZGljYXRvcl0gLSBPcHRpb25hbCBpbmRpY2F0b3IgZm9yIGlmIHRoZSBjbGFzcyBzaG91bGQgYmUgdG9nZ2xlZFxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gYGVsZW1lbnRgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgdG9nZ2xlQ2xhc3MoZWxlbWVudCwgY2xhc3NuYW1lLCBpbmRpY2F0b3IpIHtcclxuICAgICAgICBjbGFzc25hbWUgPSBjbGFzc25hbWUudG9TdHJpbmcoKS5zcGxpdChcIiBcIikuZmlsdGVyKGMgPT4gYyk7XHJcbiAgICAgICAgaWYgKHR5cGVvZihpbmRpY2F0b3IpICE9PSBcInVuZGVmaW5lZFwiKSBjbGFzc25hbWUuZm9yRWFjaChjID0+IGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShjLCBpbmRpY2F0b3IpKTtcclxuICAgICAgICBlbHNlIGNsYXNzbmFtZS5mb3JFYWNoKGMgPT4gZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKGMpKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiBhbiBlbGVtZW50IGhhcyBhIHNwZWNpZmljIGNsYXNzXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGVkaXQgY2xhc3NlcyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzbmFtZSAtIE5hbWUgb2YgY2xhc3MgdG8gY2hlY2tcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAtIGB0cnVlYCBpZiB0aGUgZWxlbWVudCBoYXMgdGhlIGNsYXNzLCBgZmFsc2VgIG90aGVyd2lzZS5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGhhc0NsYXNzKGVsZW1lbnQsIGNsYXNzbmFtZSkge1xyXG4gICAgICAgIHJldHVybiBjbGFzc25hbWUudG9TdHJpbmcoKS5zcGxpdChcIiBcIikuZmlsdGVyKGMgPT4gYykuZXZlcnkoYyA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXBsYWNlcyBvbmUgY2xhc3Mgd2l0aCBhbm90aGVyXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGVkaXQgY2xhc3NlcyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9sZE5hbWUgLSBOYW1lIG9mIGNsYXNzIHRvIHJlcGxhY2VcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdOYW1lIC0gTmV3IG5hbWUgZm9yIHRoZSBjbGFzc1xyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gYGVsZW1lbnRgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcmVwbGFjZUNsYXNzKGVsZW1lbnQsIG9sZE5hbWUsIG5ld05hbWUpIHtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZXBsYWNlKG9sZE5hbWUsIG5ld05hbWUpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwZW5kcyBgdGhpc05vZGVgIHRvIGB0aGF0Tm9kZWBcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhpc05vZGUgLSBOb2RlIHRvIGJlIGFwcGVuZGVkIHRvIGFub3RoZXIgbm9kZVxyXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGF0Tm9kZSAtIE5vZGUgZm9yIGB0aGlzTm9kZWAgdG8gYmUgYXBwZW5kZWQgdG9cclxuICAgICAqIEByZXR1cm5zIHtOb2RlfSAtIGB0aGlzTm9kZWAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBhcHBlbmRUbyh0aGlzTm9kZSwgdGhhdE5vZGUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKHRoYXROb2RlKSA9PSBcInN0cmluZ1wiKSB0aGF0Tm9kZSA9IHRoaXMucXVlcnkodGhhdE5vZGUpO1xyXG4gICAgICAgIGlmICghdGhhdE5vZGUpIHJldHVybiBudWxsO1xyXG4gICAgICAgIHRoYXROb2RlLmFwcGVuZCh0aGlzTm9kZSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNOb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJlcGVuZHMgYHRoaXNOb2RlYCB0byBgdGhhdE5vZGVgXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoaXNOb2RlIC0gTm9kZSB0byBiZSBwcmVwZW5kZWQgdG8gYW5vdGhlciBub2RlXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoYXROb2RlIC0gTm9kZSBmb3IgYHRoaXNOb2RlYCB0byBiZSBwcmVwZW5kZWQgdG9cclxuICAgICAqIEByZXR1cm5zIHtOb2RlfSAtIGB0aGlzTm9kZWAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwcmVwZW5kVG8odGhpc05vZGUsIHRoYXROb2RlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih0aGF0Tm9kZSkgPT0gXCJzdHJpbmdcIikgdGhhdE5vZGUgPSB0aGlzLnF1ZXJ5KHRoYXROb2RlKTtcclxuICAgICAgICBpZiAoIXRoYXROb2RlKSByZXR1cm4gbnVsbDtcclxuICAgICAgICB0aGF0Tm9kZS5wcmVwZW5kKHRoaXNOb2RlKTtcclxuICAgICAgICByZXR1cm4gdGhpc05vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnNlcnQgYWZ0ZXIgYSBzcGVjaWZpYyBlbGVtZW50LCBzaW1pbGFyIHRvIGpRdWVyeSdzIGB0aGlzRWxlbWVudC5pbnNlcnRBZnRlcihvdGhlckVsZW1lbnQpYC5cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhpc05vZGUgLSBUaGUgbm9kZSB0byBpbnNlcnRcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0Tm9kZSAtIE5vZGUgdG8gaW5zZXJ0IGFmdGVyIGluIHRoZSB0cmVlXHJcbiAgICAgKiBAcmV0dXJucyB7Tm9kZX0gLSBgdGhpc05vZGVgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaW5zZXJ0QWZ0ZXIodGhpc05vZGUsIHRhcmdldE5vZGUpIHtcclxuICAgICAgICB0YXJnZXROb2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXNOb2RlLCB0YXJnZXROb2RlLm5leHRTaWJsaW5nKTtcclxuICAgICAgICByZXR1cm4gdGhpc05vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnNlcnQgYWZ0ZXIgYSBzcGVjaWZpYyBlbGVtZW50LCBzaW1pbGFyIHRvIGpRdWVyeSdzIGB0aGlzRWxlbWVudC5hZnRlcihuZXdFbGVtZW50KWAuXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoaXNOb2RlIC0gVGhlIG5vZGUgdG8gaW5zZXJ0XHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IG5ld05vZGUgLSBOb2RlIHRvIGluc2VydCBhZnRlciBpbiB0aGUgdHJlZVxyXG4gICAgICogQHJldHVybnMge05vZGV9IC0gYHRoaXNOb2RlYCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGFmdGVyKHRoaXNOb2RlLCBuZXdOb2RlKSB7XHJcbiAgICAgICAgdGhpc05vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgdGhpc05vZGUubmV4dFNpYmxpbmcpO1xyXG4gICAgICAgIHJldHVybiB0aGlzTm9kZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIG5leHQgc2libGluZyBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCB0aGUgbmV4dCBzaWJsaW5nIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiXCJdIC0gT3B0aW9uYWwgc2VsZWN0b3JcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIFRoZSBzaWJsaW5nIGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG5leHQoZWxlbWVudCwgc2VsZWN0b3IgPSBcIlwiKSB7XHJcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yID8gZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiKyBcIiArIHNlbGVjdG9yKSA6IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgc3Vic2VxdWVudCBzaWJsaW5ncy5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IG5leHQgc2libGluZ3Mgb2ZcclxuICAgICAqIEByZXR1cm5zIHtOb2RlTGlzdH0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgbmV4dEFsbChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIn4gKlwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHN1YnNlcXVlbnQgc2libGluZ3MgdW50aWwgYW4gZWxlbWVudCBtYXRjaGVzIHRoZSBzZWxlY3Rvci5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBmb2xsb3dpbmcgc2libGluZ3Mgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHN0b3AgYXRcclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgbmV4dFVudGlsKGVsZW1lbnQsIHNlbGVjdG9yKSB7XHJcbiAgICAgICAgY29uc3QgbmV4dCA9IFtdOyBcclxuICAgICAgICB3aGlsZSAoZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcgJiYgIWVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nLm1hdGNoZXMoc2VsZWN0b3IpKSBuZXh0LnB1c2goZWxlbWVudCA9IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKTtcclxuICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHByZXZpb3VzIHNpYmxpbmcgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIHByZXZpb3VzIHNpYmxpbmcgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3I9XCJcIl0gLSBPcHRpb25hbCBzZWxlY3RvclxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gVGhlIHNpYmxpbmcgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcHJldmlvdXMoZWxlbWVudCwgc2VsZWN0b3IgPSBcIlwiKSB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XHJcbiAgICAgICAgaWYgKHNlbGVjdG9yKSByZXR1cm4gcHJldmlvdXMgJiYgcHJldmlvdXMubWF0Y2hlcyhzZWxlY3RvcikgPyBwcmV2aW91cyA6IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgcHJlY2VlZGluZyBzaWJsaW5ncy5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHByZWNlZWRpbmcgc2libGluZ3Mgb2ZcclxuICAgICAqIEByZXR1cm5zIHtOb2RlTGlzdH0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcHJldmlvdXNBbGwoZWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gW107XHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZykgcHJldmlvdXMucHVzaChlbGVtZW50ID0gZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKTtcclxuICAgICAgICByZXR1cm4gcHJldmlvdXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBwcmVjZWVkaW5nIHNpYmxpbmdzIHVudGlsIGFuIGVsZW1lbnQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCB0aGUgcHJlY2VlZGluZyBzaWJsaW5ncyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gc3RvcCBhdFxyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHNpYmxpbmdzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwcmV2aW91c1VudGlsKGVsZW1lbnQsIHNlbGVjdG9yKSB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBbXTsgXHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZyAmJiAhZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLm1hdGNoZXMoc2VsZWN0b3IpKSBwcmV2aW91cy5wdXNoKGVsZW1lbnQgPSBlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcpO1xyXG4gICAgICAgIHJldHVybiBwcmV2aW91cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmQgd2hpY2ggaW5kZXggaW4gY2hpbGRyZW4gYSBjZXJ0YWluIG5vZGUgaXMuIFNpbWlsYXIgdG8galF1ZXJ5J3MgYCQuaW5kZXgoKWBcclxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUgLSBUaGUgbm9kZSB0byBmaW5kIGl0cyBpbmRleCBpbiBwYXJlbnRcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEluZGV4IG9mIHRoZSBub2RlXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBpbmRleEluUGFyZW50KG5vZGUpIHtcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUucGFyZW50Tm9kZS5jaGlsZE5vZGVzO1xyXG4gICAgICAgIGxldCBudW0gPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldID09IG5vZGUpIHJldHVybiBudW07XHJcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXS5ub2RlVHlwZSA9PSAxKSBudW0rKztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBTaG9ydGhhbmQgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMuaW5kZXhJblBhcmVudH0gKi9cclxuICAgIHN0YXRpYyBpbmRleChub2RlKSB7cmV0dXJuIHRoaXMuaW5kZXhJblBhcmVudChub2RlKTt9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBwYXJlbnQgb2YgdGhlIGVsZW1lbnQgaWYgaXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsXHJcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyBudWxsLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgcGFyZW50IG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiXCJdIC0gU2VsZWN0b3IgdG8gbWF0Y2ggcGFyZW50XHJcbiAgICAgKiBAcmV0dXJucyB7KEVsZW1lbnR8bnVsbCl9IC0gVGhlIHNpYmxpbmcgZWxlbWVudCBvciBudWxsXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwYXJlbnQoZWxlbWVudCwgc2VsZWN0b3IgPSBcIlwiKSB7XHJcbiAgICAgICAgcmV0dXJuICFzZWxlY3RvciB8fCBlbGVtZW50LnBhcmVudEVsZW1lbnQubWF0Y2hlcyhzZWxlY3RvcikgPyBlbGVtZW50LnBhcmVudEVsZW1lbnQgOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgY2hpbGRyZW4gb2YgRWxlbWVudCB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciBpZiBwcm92aWRlZC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IGFsbCBjaGlsZHJlbiBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gbWF0Y2ggdGhlIGNoaWxkcmVuIHRvXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2YgY2hpbGRyZW5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGZpbmRDaGlsZChlbGVtZW50LCBzZWxlY3Rvcikge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCI6c2NvcGUgPiBcIiArIHNlbGVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYWxsIGNoaWxkcmVuIG9mIEVsZW1lbnQgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IgaWYgcHJvdmlkZWQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBhbGwgY2hpbGRyZW4gb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIG1hdGNoIHRoZSBjaGlsZHJlbiB0b1xyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIGNoaWxkcmVuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBmaW5kQ2hpbGRyZW4oZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiOnNjb3BlID4gXCIgKyBzZWxlY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCBhbmNlc3RvcnMgb2YgRWxlbWVudCB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciBpZiBwcm92aWRlZC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IGFsbCBwYXJlbnRzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiXCJdIC0gU2VsZWN0b3IgdG8gbWF0Y2ggdGhlIHBhcmVudHMgdG9cclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBwYXJlbnRzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwYXJlbnRzKGVsZW1lbnQsIHNlbGVjdG9yID0gXCJcIikge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudHMgPSBbXTtcclxuICAgICAgICBpZiAoc2VsZWN0b3IpIHdoaWxlIChlbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnRFbGVtZW50LmNsb3Nlc3Qoc2VsZWN0b3IpKSBwYXJlbnRzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudC5jbG9zZXN0KHNlbGVjdG9yKSk7XHJcbiAgICAgICAgZWxzZSB3aGlsZSAoZWxlbWVudC5wYXJlbnRFbGVtZW50KSBwYXJlbnRzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudCk7XHJcbiAgICAgICAgcmV0dXJuIHBhcmVudHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBhbmNlc3RvcnMgdW50aWwgYW4gZWxlbWVudCBtYXRjaGVzIHRoZSBzZWxlY3Rvci5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBhbmNlc3RvcnMgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHN0b3AgYXRcclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBwYXJlbnRzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwYXJlbnRzVW50aWwoZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgICAgICBjb25zdCBwYXJlbnRzID0gW107XHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQucGFyZW50RWxlbWVudCAmJiAhZWxlbWVudC5wYXJlbnRFbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpKSBwYXJlbnRzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudCk7XHJcbiAgICAgICAgcmV0dXJuIHBhcmVudHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCBzaWJsaW5ncyBvZiB0aGUgZWxlbWVudCB0aGF0IG1hdGNoIHRoZSBzZWxlY3Rvci5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IGFsbCBzaWJsaW5ncyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcj1cIipcIl0gLSBTZWxlY3RvciB0byBtYXRjaCB0aGUgc2libGluZ3MgdG9cclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgc2libGluZ3MoZWxlbWVudCwgc2VsZWN0b3IgPSBcIipcIikge1xyXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbikuZmlsdGVyKGUgPT4gZSAhPSBlbGVtZW50ICYmIGUubWF0Y2hlcyhzZWxlY3RvcikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBvciBnZXRzIGNzcyBzdHlsZXMgZm9yIGEgc3BlY2lmaWMgZWxlbWVudC4gSWYgYHZhbHVlYCBpcyBwcm92aWRlZFxyXG4gICAgICogdGhlbiBpdCBzZXRzIHRoZSBzdHlsZSBhbmQgcmV0dXJucyB0aGUgZWxlbWVudCB0byBhbGxvdyBmb3IgY2hhaW5pbmcsXHJcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgc3R5bGUuICBcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2V0IHRoZSBDU1Mgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUgLSBBdHRyaWJ1dGUgdG8gZ2V0IG9yIHNldFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt2YWx1ZV0gLSBWYWx1ZSB0byBzZXQgZm9yIGF0dHJpYnV0ZVxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR8c3RyaW5nfSAtIFdoZW4gc2V0dGluZyBhIHZhbHVlLCBlbGVtZW50IGlzIHJldHVybmVkIGZvciBjaGFpbmluZywgb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyByZXR1cm5lZC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNzcyhlbGVtZW50LCBhdHRyaWJ1dGUsIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGdsb2JhbC5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpW2F0dHJpYnV0ZV07XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZVthdHRyaWJ1dGVdID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIG9yIGdldHMgdGhlIHdpZHRoIGZvciBhIHNwZWNpZmljIGVsZW1lbnQuIElmIGB2YWx1ZWAgaXMgcHJvdmlkZWRcclxuICAgICAqIHRoZW4gaXQgc2V0cyB0aGUgd2lkdGggYW5kIHJldHVybnMgdGhlIGVsZW1lbnQgdG8gYWxsb3cgZm9yIGNoYWluaW5nLFxyXG4gICAgICogb3RoZXJ3aXNlIHJldHVybnMgdGhlIHdpZHRoLiAgXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHNldCB0aGUgQ1NTIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ZhbHVlXSAtIFdpZHRoIHRvIHNldFxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR8c3RyaW5nfSAtIFdoZW4gc2V0dGluZyBhIHZhbHVlLCBlbGVtZW50IGlzIHJldHVybmVkIGZvciBjaGFpbmluZywgb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyByZXR1cm5lZC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIHdpZHRoKGVsZW1lbnQsIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkud2lkdGgpO1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgb3IgZ2V0cyB0aGUgaGVpZ2h0IGZvciBhIHNwZWNpZmljIGVsZW1lbnQuIElmIGB2YWx1ZWAgaXMgcHJvdmlkZWRcclxuICAgICAqIHRoZW4gaXQgc2V0cyB0aGUgaGVpZ2h0IGFuZCByZXR1cm5zIHRoZSBlbGVtZW50IHRvIGFsbG93IGZvciBjaGFpbmluZyxcclxuICAgICAqIG90aGVyd2lzZSByZXR1cm5zIHRoZSBoZWlnaHQuICBcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2V0IHRoZSBDU1Mgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdIC0gSGVpZ2h0IHRvIHNldFxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR8c3RyaW5nfSAtIFdoZW4gc2V0dGluZyBhIHZhbHVlLCBlbGVtZW50IGlzIHJldHVybmVkIGZvciBjaGFpbmluZywgb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyByZXR1cm5lZC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGhlaWdodChlbGVtZW50LCB2YWx1ZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YodmFsdWUpID09IFwidW5kZWZpbmVkXCIpIHJldHVybiBwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmhlaWdodCk7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGlubmVyIHRleHQgb2YgYW4gZWxlbWVudCBpZiBnaXZlbiBhIHZhbHVlLCBvdGhlcndpc2UgcmV0dXJucyBpdC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2V0IHRoZSB0ZXh0IG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3RleHRdIC0gQ29udGVudCB0byBzZXRcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gRWl0aGVyIHRoZSBzdHJpbmcgc2V0IGJ5IHRoaXMgY2FsbCBvciB0aGUgY3VycmVudCB0ZXh0IGNvbnRlbnQgb2YgdGhlIG5vZGUuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyB0ZXh0KGVsZW1lbnQsIHRleHQpIHtcclxuICAgICAgICBpZiAodHlwZW9mKHRleHQpID09IFwidW5kZWZpbmVkXCIpIHJldHVybiBlbGVtZW50LnRleHRDb250ZW50O1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnRleHRDb250ZW50ID0gdGV4dDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGlubmVyV2lkdGggb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJldHJpZXZlIGlubmVyIHdpZHRoIG9mXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0gVGhlIGlubmVyIHdpZHRoIG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaW5uZXJXaWR0aChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2xpZW50V2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBpbm5lckhlaWdodCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gcmV0cmlldmUgaW5uZXIgaGVpZ2h0IG9mXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0gVGhlIGlubmVyIGhlaWdodCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGlubmVySGVpZ2h0KGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5jbGllbnRIZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBvdXRlcldpZHRoIG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byByZXRyaWV2ZSBvdXRlciB3aWR0aCBvZlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSAtIFRoZSBvdXRlciB3aWR0aCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIG91dGVyV2lkdGgoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgb3V0ZXJIZWlnaHQgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJldHJpZXZlIG91dGVyIGhlaWdodCBvZlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSAtIFRoZSBvdXRlciBoZWlnaHQgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBvdXRlckhlaWdodChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSBlbGVtZW50IGluIHRoZSBwYWdlLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgb2Zmc2V0IG9mXHJcbiAgICAgKiBAcmV0dXJuIHtPZmZzZXR9IC0gVGhlIG9mZnNldCBvZiB0aGUgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb2Zmc2V0KGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IGxpc3RlbmVycygpIHsgcmV0dXJuIHRoaXMuX2xpc3RlbmVycyB8fCAodGhpcy5fbGlzdGVuZXJzID0ge30pOyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlzIHNpbWlsYXIgdG8galF1ZXJ5J3MgYG9uYCBmdW5jdGlvbiBhbmQgY2FuICpob3BlZnVsbHkqIGJlIHVzZWQgaW4gdGhlIHNhbWUgd2F5LlxyXG4gICAgICogXHJcbiAgICAgKiBSYXRoZXIgdGhhbiBhdHRlbXB0IHRvIGV4cGxhaW4sIEknbGwgc2hvdyBzb21lIGV4YW1wbGUgdXNhZ2VzLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYWRkIGEgY2xpY2sgbGlzdGVuZXIgKGluIHRoZSBgbXlQbHVnaW5gIG5hbWVzcGFjZSkgdG8gYGVsZW1lbnRgLlxyXG4gICAgICogYERPTVRvb2xzLm9uKGVsZW1lbnQsIFwiY2xpY2subXlQbHVnaW5cIiwgKCkgPT4ge2NvbnNvbGUubG9nKFwiY2xpY2tlZCFcIik7fSk7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYWRkIGEgY2xpY2sgbGlzdGVuZXIgKGluIHRoZSBgbXlQbHVnaW5gIG5hbWVzcGFjZSkgdG8gYGVsZW1lbnRgIHRoYXQgb25seSBmaXJlcyB3aGVuIHRoZSB0YXJnZXQgaXMgYSBgLmJsb2NrYCBlbGVtZW50LlxyXG4gICAgICogYERPTVRvb2xzLm9uKGVsZW1lbnQsIFwiY2xpY2subXlQbHVnaW5cIiwgXCIuYmxvY2tcIiwgKCkgPT4ge2NvbnNvbGUubG9nKFwiY2xpY2tlZCFcIik7fSk7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYWRkIGEgY2xpY2sgbGlzdGVuZXIgKHdpdGhvdXQgbmFtZXNwYWNlKSB0byBgZWxlbWVudGAuXHJcbiAgICAgKiBgRE9NVG9vbHMub24oZWxlbWVudCwgXCJjbGlja1wiLCAoKSA9PiB7Y29uc29sZS5sb2coXCJjbGlja2VkIVwiKTt9KTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCBhZGQgYSBjbGljayBsaXN0ZW5lciAod2l0aG91dCBuYW1lc3BhY2UpIHRvIGBlbGVtZW50YCB0aGF0IG9ubHkgZmlyZXMgb25jZS5cclxuICAgICAqIGBjb25zdCBjYW5jZWwgPSBET01Ub29scy5vbihlbGVtZW50LCBcImNsaWNrXCIsICgpID0+IHtjb25zb2xlLmxvZyhcImZpcmVkIVwiKTsgY2FuY2VsKCk7fSk7YFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGFkZCBsaXN0ZW5lciB0b1xyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50IC0gRXZlbnQgdG8gbGlzdGVuIHRvIHdpdGggb3B0aW9uIG5hbWVzcGFjZSAoZS5nLiBcImV2ZW50Lm5hbWVzcGFjZVwiKVxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGNhbGxhYmxlKX0gZGVsZWdhdGUgLSBTZWxlY3RvciB0byBydW4gb24gZWxlbWVudCB0byBsaXN0ZW4gdG9cclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtjYWxsYmFja10gLSBGdW5jdGlvbiB0byBmaXJlIG9uIGV2ZW50XHJcbiAgICAgKiBAcmV0dXJucyB7bW9kdWxlOkRPTVRvb2xzfkNhbmNlbExpc3RlbmVyfSAtIEEgZnVuY3Rpb24gdGhhdCB3aWxsIHVuZG8gdGhlIGxpc3RlbmVyXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBvbihlbGVtZW50LCBldmVudCwgZGVsZWdhdGUsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgY29uc3QgW3R5cGUsIG5hbWVzcGFjZV0gPSBldmVudC5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgY29uc3QgaGFzRGVsZWdhdGUgPSBkZWxlZ2F0ZSAmJiBjYWxsYmFjaztcclxuICAgICAgICBpZiAoIWNhbGxiYWNrKSBjYWxsYmFjayA9IGRlbGVnYXRlO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50RnVuYyA9ICFoYXNEZWxlZ2F0ZSA/IGNhbGxiYWNrIDogZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKGRlbGVnYXRlKSkge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChuYW1lc3BhY2UpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdKSB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0NhbmNlbCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNhbmNlbCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5zcGxpY2UodGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5maW5kSW5kZXgobCA9PiBsLmV2ZW50ID09IHR5cGUgJiYgbC5lbGVtZW50ID09IGVsZW1lbnQpLCAxKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGV2ZW50OiB0eXBlLFxyXG4gICAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudCxcclxuICAgICAgICAgICAgICAgIGNhbmNlbDogbmV3Q2FuY2VsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3Q2FuY2VsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2FuY2VsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRnVuY3Rpb25hbGl0eSBmb3IgdGhpcyBtZXRob2QgbWF0Y2hlcyB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLm9ufSBidXQgYXV0b21hdGljYWxseSBjYW5jZWxzIGl0c2VsZlxyXG4gICAgICogYW5kIHJlbW92ZXMgdGhlIGxpc3RlbmVyIHVwb24gdGhlIGZpcnN0IGZpcmluZyBvZiB0aGUgZGVzaXJlZCBldmVudC5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBhZGQgbGlzdGVuZXIgdG9cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIEV2ZW50IHRvIGxpc3RlbiB0byB3aXRoIG9wdGlvbiBuYW1lc3BhY2UgKGUuZy4gXCJldmVudC5uYW1lc3BhY2VcIilcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xjYWxsYWJsZSl9IGRlbGVnYXRlIC0gU2VsZWN0b3IgdG8gcnVuIG9uIGVsZW1lbnQgdG8gbGlzdGVuIHRvXHJcbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBbY2FsbGJhY2tdIC0gRnVuY3Rpb24gdG8gZmlyZSBvbiBldmVudFxyXG4gICAgICogQHJldHVybnMge21vZHVsZTpET01Ub29sc35DYW5jZWxMaXN0ZW5lcn0gLSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCB1bmRvIHRoZSBsaXN0ZW5lclxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb25jZShlbGVtZW50LCBldmVudCwgZGVsZWdhdGUsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgY29uc3QgW3R5cGUsIG5hbWVzcGFjZV0gPSBldmVudC5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgY29uc3QgaGFzRGVsZWdhdGUgPSBkZWxlZ2F0ZSAmJiBjYWxsYmFjaztcclxuICAgICAgICBpZiAoIWNhbGxiYWNrKSBjYWxsYmFjayA9IGRlbGVnYXRlO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50RnVuYyA9ICFoYXNEZWxlZ2F0ZSA/IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcclxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgfSA6IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmICghZXZlbnQudGFyZ2V0Lm1hdGNoZXMoZGVsZWdhdGUpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcclxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChuYW1lc3BhY2UpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdKSB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0NhbmNlbCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNhbmNlbCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5zcGxpY2UodGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5maW5kSW5kZXgobCA9PiBsLmV2ZW50ID09IHR5cGUgJiYgbC5lbGVtZW50ID09IGVsZW1lbnQpLCAxKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGV2ZW50OiB0eXBlLFxyXG4gICAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudCxcclxuICAgICAgICAgICAgICAgIGNhbmNlbDogbmV3Q2FuY2VsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3Q2FuY2VsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2FuY2VsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBfX29mZkFsbChldmVudCwgZWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IFt0eXBlLCBuYW1lc3BhY2VdID0gZXZlbnQuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIGxldCBtYXRjaEZpbHRlciA9IGxpc3RlbmVyID0+IGxpc3RlbmVyLmV2ZW50ID09IHR5cGUsIGRlZmF1bHRGaWx0ZXIgPSBfID0+IF87XHJcbiAgICAgICAgaWYgKGVsZW1lbnQpIG1hdGNoRmlsdGVyID0gbCA9PiBsLmV2ZW50ID09IHR5cGUgJiYgbC5lbGVtZW50ID09IGVsZW1lbnQsIGRlZmF1bHRGaWx0ZXIgPSBsID0+IGwuZWxlbWVudCA9PSBlbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0gfHwgW107XHJcbiAgICAgICAgY29uc3QgbGlzdCA9IHR5cGUgPyBsaXN0ZW5lcnMuZmlsdGVyKG1hdGNoRmlsdGVyKSA6IGxpc3RlbmVycy5maWx0ZXIoZGVmYXVsdEZpbHRlcik7XHJcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBsaXN0Lmxlbmd0aDsgYysrKSBsaXN0W2NdLmNhbmNlbCgpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgaXMgc2ltaWxhciB0byBqUXVlcnkncyBgb2ZmYCBmdW5jdGlvbiBhbmQgY2FuICpob3BlZnVsbHkqIGJlIHVzZWQgaW4gdGhlIHNhbWUgd2F5LlxyXG4gICAgICogXHJcbiAgICAgKiBSYXRoZXIgdGhhbiBhdHRlbXB0IHRvIGV4cGxhaW4sIEknbGwgc2hvdyBzb21lIGV4YW1wbGUgdXNhZ2VzLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGEgY2xpY2sgbGlzdGVuZXIgY2FsbGVkIGBvbkNsaWNrYCAoaW4gdGhlIGBteVBsdWdpbmAgbmFtZXNwYWNlKSBmcm9tIGBlbGVtZW50YC5cclxuICAgICAqIGBET01Ub29scy5vZmYoZWxlbWVudCwgXCJjbGljay5teVBsdWdpblwiLCBvbkNsaWNrKTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYSBjbGljayBsaXN0ZW5lciBjYWxsZWQgYG9uQ2xpY2tgIChpbiB0aGUgYG15UGx1Z2luYCBuYW1lc3BhY2UpIGZyb20gYGVsZW1lbnRgIHRoYXQgb25seSBmaXJlZCB3aGVuIHRoZSB0YXJnZXQgaXMgYSBgLmJsb2NrYCBlbGVtZW50LlxyXG4gICAgICogYERPTVRvb2xzLm9mZihlbGVtZW50LCBcImNsaWNrLm15UGx1Z2luXCIsIFwiLmJsb2NrXCIsIG9uQ2xpY2spO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhIGNsaWNrIGxpc3RlbmVyICh3aXRob3V0IG5hbWVzcGFjZSkgZnJvbSBgZWxlbWVudGAuXHJcbiAgICAgKiBgRE9NVG9vbHMub2ZmKGVsZW1lbnQsIFwiY2xpY2tcIiwgb25DbGljayk7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGFsbCBsaXN0ZW5lcnMgaW4gbmFtZXNwYWNlIGBteVBsdWdpbmAgZnJvbSBgZWxlbWVudGAuXHJcbiAgICAgKiBgRE9NVG9vbHMub2ZmKGVsZW1lbnQsIFwiLm15UGx1Z2luXCIpO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhbGwgY2xpY2sgbGlzdGVuZXJzIGluIG5hbWVzcGFjZSBgbXlQbHVnaW5gIGZyb20gKmFsbCBlbGVtZW50cyouXHJcbiAgICAgKiBgRE9NVG9vbHMub2ZmKFwiY2xpY2subXlQbHVnaW5cIik7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGFsbCBsaXN0ZW5lcnMgaW4gbmFtZXNwYWNlIGBteVBsdWdpbmAgZnJvbSAqYWxsIGVsZW1lbnRzKi5cclxuICAgICAqIGBET01Ub29scy5vZmYoXCIubXlQbHVnaW5cIik7YFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0geyhFbGVtZW50fHN0cmluZyl9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJlbW92ZSBsaXN0ZW5lciBmcm9tXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2V2ZW50XSAtIEV2ZW50IHRvIGxpc3RlbiB0byB3aXRoIG9wdGlvbiBuYW1lc3BhY2UgKGUuZy4gXCJldmVudC5uYW1lc3BhY2VcIilcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xjYWxsYWJsZSl9IFtkZWxlZ2F0ZV0gLSBTZWxlY3RvciB0byBydW4gb24gZWxlbWVudCB0byBsaXN0ZW4gdG9cclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtjYWxsYmFja10gLSBGdW5jdGlvbiB0byBmaXJlIG9uIGV2ZW50XHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBUaGUgb3JpZ2luYWwgZWxlbWVudCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG9mZihlbGVtZW50LCBldmVudCwgZGVsZWdhdGUsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZihlbGVtZW50KSA9PSBcInN0cmluZ1wiKSByZXR1cm4gdGhpcy5fX29mZkFsbChlbGVtZW50KTtcclxuICAgICAgICBjb25zdCBbdHlwZSwgbmFtZXNwYWNlXSA9IGV2ZW50LnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBpZiAobmFtZXNwYWNlKSByZXR1cm4gdGhpcy5fX29mZkFsbChldmVudCwgZWxlbWVudCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGhhc0RlbGVnYXRlID0gZGVsZWdhdGUgJiYgY2FsbGJhY2s7XHJcbiAgICAgICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBkZWxlZ2F0ZTtcclxuICAgICAgICBjb25zdCBldmVudEZ1bmMgPSAhaGFzRGVsZWdhdGUgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQubWF0Y2hlcyhkZWxlZ2F0ZSkpIHtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIGZvciB3aGVuIHRoZSBub2RlIGlzIGFkZGVkL3JlbW92ZWQgZnJvbSB0aGUgZG9jdW1lbnQgYm9keS5cclxuICAgICAqIFRoZSBsaXN0ZW5lciBpcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgdXBvbiBmaXJpbmcuXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIC0gbm9kZSB0byB3YWl0IGZvclxyXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gY2FsbGJhY2sgLSBmdW5jdGlvbiB0byBiZSBwZXJmb3JtZWQgb24gZXZlbnRcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb25Nb3VudCAtIGRldGVybWluZXMgaWYgaXQgc2hvdWxkIGZpcmUgb24gTW91bnQgb3Igb24gVW5tb3VudFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb25Nb3VudENoYW5nZShub2RlLCBjYWxsYmFjaywgb25Nb3VudCA9IHRydWUpIHtcclxuICAgICAgICBjb25zdCB3cmFwcGVkQ2FsbGJhY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIudW5zdWJzY3JpYmUod3JhcHBlZENhbGxiYWNrKTtcclxuICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMub2JzZXJ2ZXIuc3Vic2NyaWJlKHdyYXBwZWRDYWxsYmFjaywgbXV0YXRpb24gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBub2RlcyA9IEFycmF5LmZyb20ob25Nb3VudCA/IG11dGF0aW9uLmFkZGVkTm9kZXMgOiBtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xyXG4gICAgICAgICAgICBjb25zdCBkaXJlY3RNYXRjaCA9IG5vZGVzLmluZGV4T2Yobm9kZSkgPiAtMTtcclxuICAgICAgICAgICAgY29uc3QgcGFyZW50TWF0Y2ggPSBub2Rlcy5zb21lKHBhcmVudCA9PiBwYXJlbnQuY29udGFpbnMobm9kZSkpO1xyXG4gICAgICAgICAgICByZXR1cm4gZGlyZWN0TWF0Y2ggfHwgcGFyZW50TWF0Y2g7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFNob3J0aGFuZCBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5vbk1vdW50Q2hhbmdlfSB3aXRoIHRoaXJkIHBhcmFtZXRlciBgdHJ1ZWAgKi9cclxuICAgIHN0YXRpYyBvbk1vdW50KG5vZGUsIGNhbGxiYWNrKSB7IHJldHVybiB0aGlzLm9uTW91bnRDaGFuZ2Uobm9kZSwgY2FsbGJhY2spOyB9XHJcblxyXG4gICAgLyoqIFNob3J0aGFuZCBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5vbk1vdW50Q2hhbmdlfSB3aXRoIHRoaXJkIHBhcmFtZXRlciBgZmFsc2VgICovXHJcbiAgICBzdGF0aWMgb25Vbm1vdW50KG5vZGUsIGNhbGxiYWNrKSB7IHJldHVybiB0aGlzLm9uTW91bnRDaGFuZ2Uobm9kZSwgY2FsbGJhY2ssIGZhbHNlKTsgfVxyXG5cclxuICAgIC8qKiBBbGlhcyBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5vbk1vdW50fSAqL1xyXG4gICAgc3RhdGljIG9uQWRkZWQobm9kZSwgY2FsbGJhY2spIHsgcmV0dXJuIHRoaXMub25Nb3VudChub2RlLCBjYWxsYmFjayk7IH1cclxuXHJcbiAgICAvKiogQWxpYXMgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMub25Vbm1vdW50fSAqL1xyXG4gICAgc3RhdGljIG9uUmVtb3ZlZChub2RlLCBjYWxsYmFjaykgeyByZXR1cm4gdGhpcy5vblVubW91bnQobm9kZSwgY2FsbGJhY2ssIGZhbHNlKTsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIHdoaWNoIGNvbWJpbmVzIG11bHRpcGxlIGVsZW1lbnRzIGludG8gb25lIHBhcmVudCBlbGVtZW50XHJcbiAgICAgKiBAcGFyYW0ge0FycmF5PEhUTUxFbGVtZW50Pn0gZWxlbWVudHMgLSBhcnJheSBvZiBlbGVtZW50cyB0byBwdXQgaW50byBhIHNpbmdsZSBwYXJlbnRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHdyYXAoZWxlbWVudHMpIHtcclxuICAgICAgICBjb25zdCBkb21XcmFwcGVyID0gdGhpcy5wYXJzZUhUTUwoYDxkaXYgY2xhc3M9XCJkb20td3JhcHBlclwiPjwvZGl2PmApO1xyXG4gICAgICAgIGZvciAobGV0IGUgPSAwOyBlIDwgZWxlbWVudHMubGVuZ3RoOyBlKyspIGRvbVdyYXBwZXIuYXBwZW5kQ2hpbGQoZWxlbWVudHNbZV0pO1xyXG4gICAgICAgIHJldHVybiBkb21XcmFwcGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzb2x2ZXMgdGhlIG5vZGUgdG8gYW4gSFRNTEVsZW1lbnQuIFRoaXMgaXMgbWFpbmx5IHVzZWQgYnkgbGlicmFyeSBtb2R1bGVzLlxyXG4gICAgICogQHBhcmFtIHsoalF1ZXJ5fEVsZW1lbnQpfSBub2RlIC0gbm9kZSB0byByZXNvbHZlXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyByZXNvbHZlRWxlbWVudChub2RlKSB7XHJcbiAgICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIGpRdWVyeSkgJiYgIShub2RlIGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBqUXVlcnkgPyBub2RlWzBdIDogbm9kZTtcclxuICAgIH1cclxufVxyXG5cclxud2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkRPTSA9IERPTVRvb2xzIiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5jb25zdCBDb25zdGFudHMgPSB7XHJcbiAgICBFbW9qaVJlZ2V4OiAvPGE/XFwuKFxcdyspXFwuKFxcZCspPi9nXHJcbn1cclxuXHJcbmxldCBDdXN0b21FbW9qaU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLkN1c3RvbUVtb2ppKVswXVxyXG5sZXQgRW1vamlNb2R1bGVBcGkgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXN0b21FbW9qaUJ5SWQpWzBdXHJcbmxldCBBdXRvY29tcGxldGVNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJBdXRvY29tcGxldGVcIilbMF1cclxubGV0IEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzID0gQkRNb2R1bGVzLmdldChlID0+IGUuZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucylbMF1cclxubGV0IEVtb2ppTW9kdWxlUXVlcnkgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5xdWVyeUVtb2ppUmVzdWx0cylbMF1cclxubGV0IE1lc3NhZ2VzID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuTWVzc2FnZXMgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzLkVNT0pJX01BVENISU5HKVswXVxyXG5sZXQgZ3VpbGRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRHdWlsZCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGRzICYmICFlLmRlZmF1bHQuaXNGZXRjaGluZylbMF1cclxubGV0IGVtb2ppU2VhcmNoID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0RGlzYW1iaWd1YXRlZEVtb2ppQ29udGV4dClcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBFbW9qaU1vZHVsZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuaW5pdCgpLmNhdGNoKGVyciA9PiBVdGlscy5lcnIoXCJFbW9qaU1vZHVsZVwiLCBcIkFuIGVycm9yIG9jY3VyZWRcIiwgZXJyKSkgLy8gYmV0dGVyIGxvZ2dpbmdcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0KCl7XHJcbiAgICAgICAgLyoqIEVtb2ppIEF1dG9Db21wbGV0ZSAqL1xyXG4gICAgICAgIGlmKCFBdXRvY29tcGxldGVNb2R1bGUpQXV0b2NvbXBsZXRlTW9kdWxlID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIkF1dG9jb21wbGV0ZVwiKVxyXG4gICAgICAgIGlmKCFBdXRvQ29tcGxldGlvblRlbXBsYXRlcylBdXRvQ29tcGxldGlvblRlbXBsYXRlcyA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5nZXRBdXRvY29tcGxldGVPcHRpb25zKVxyXG4gICAgICAgIGlmKCFFbW9qaU1vZHVsZVF1ZXJ5KUVtb2ppTW9kdWxlUXVlcnkgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQucXVlcnlFbW9qaVJlc3VsdHMpXHJcbiAgICAgICAgaWYoIU1lc3NhZ2VzKU1lc3NhZ2VzID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzICYmIGUuZGVmYXVsdC5NZXNzYWdlcy5FTU9KSV9NQVRDSElORylcclxuICAgICAgICBpZighZ3VpbGRNb2R1bGUpZ3VpbGRNb2R1bGUgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGQgJiYgZS5kZWZhdWx0LmdldEd1aWxkcyAmJiAhZS5kZWZhdWx0LmlzRmV0Y2hpbmcpXHJcbiAgICAgICAgaWYoIWVtb2ppU2VhcmNoKWVtb2ppU2VhcmNoID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldERpc2FtYmlndWF0ZWRFbW9qaUNvbnRleHQpXHJcblxyXG4gICAgICAgIGlmKEF1dG9jb21wbGV0ZU1vZHVsZSAmJiBBdXRvQ29tcGxldGlvblRlbXBsYXRlcyAmJiBFbW9qaU1vZHVsZVF1ZXJ5ICYmIE1lc3NhZ2VzICYmIGd1aWxkTW9kdWxlICYmIGVtb2ppU2VhcmNoKXtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYFBhdGNoaW5nIGdldEF1dG9jb21wbGV0ZU9wdGlvbnMgb2YgQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXNgLCBBdXRvQ29tcGxldGlvblRlbXBsYXRlcylcclxuICAgICAgICAgICAgY29uc3QgZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyA9IEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzLmdldEF1dG9jb21wbGV0ZU9wdGlvbnNcclxuICAgICAgICAgICAgQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMuZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyA9IGZ1bmN0aW9uKGUsIHQsIG4sIHIsIGEpe1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRBdXRvY29tcGxldGVPcHRpb25zLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxyXG4gICAgICAgICAgICAgICAgdmFsdWUuTElHSFRDT1JEX0VNT0pJUyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzKGFyZzEsIGFyZzIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGl0aW9uID0gYXJnMi5sZW5ndGggPiAxICYmIFwiLlwiID09PSBhcmcxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEVtb2ppVXNhYmxlKGNvbmRpdGlvbilcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlSZXN1bHRzKHQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0cyA9IEVtb2ppTW9kdWxlUXVlcnkuZGVmYXVsdC5xdWVyeUVtb2ppUmVzdWx0cyh0LCBlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0c1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyUmVzdWx0cyhlLCB0LCBuLCByLCBhKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEQoZSwgdCwgYS5lbW9qaXMsIG4sIHIsIE1lc3NhZ2VzLmRlZmF1bHQuTWVzc2FnZXMuRU1PSklfTUFUQ0hJTkcsIE1lc3NhZ2VzLmRlZmF1bHQuTWVzc2FnZXMuRU1PSkksIEF1dG9jb21wbGV0ZU1vZHVsZS5kZWZhdWx0LkVtb2ppLCAoZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaTogZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGUuaWQgfHwgZS51bmlxdWVOYW1lIHx8IGUubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50aW5lbDogXCIuXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbGQ6IG51bGwgIT0gZS5ndWlsZElkID8gZ3VpbGRNb2R1bGUuZGVmYXVsdC5nZXRHdWlsZChlLmd1aWxkSWQpIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSwgKGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIi5cIiArIGUgKyBcIi5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGdldFBsYWluVGV4dChpZCwgZ3VpbGQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1vamlzID0gZ3VpbGQuZW1vamlzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBlbW9qaXMgfHwgbnVsbCA9PSBlbW9qaXNbaWRdKSByZXR1cm4gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVtb2ppID0gZW1vamlzW2lkXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQW5pbWF0ZWQgPSBlbW9qaS5hbmltYXRlZCA/IFwiYVwiIDogXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtb2ppLm1hbmFnZWQgfHwgbnVsbCA9PSBlbW9qaS5pZCA/IFwiLlwiICsgZW1vamkubmFtZSArIFwiLlwiIDogXCI8XCIgKyBpc0FuaW1hdGVkICsgXCIuXCIgKyAoZW1vamkub3JpZ2luYWxOYW1lIHx8IGVtb2ppLm5hbWUpICsgXCIuXCIgKyBlbW9qaS5pZCArIFwiPlwiXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBnZXRSYXdUZXh0KGlkLCBndWlsZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbW9qaXMgPSBndWlsZC5lbW9qaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGVtb2ppcyB8fCBudWxsID09IGVtb2ppc1tpZF0pIHJldHVybiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1vamkgPSBlbW9qaXNbaWRdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbmltYXRlZCA9IGVtb2ppLmFuaW1hdGVkID8gXCJhXCIgOiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1vamkubWFuYWdlZCB8fCBudWxsID09IGVtb2ppLmlkID8gXCIuXCIgKyBlbW9qaS5uYW1lICsgXCIuXCIgOiBcIjxcIiArIGlzQW5pbWF0ZWQgKyBcIi5cIiArIChlbW9qaS5vcmlnaW5hbE5hbWUgfHwgZW1vamkubmFtZSkgKyBcIi5cIiArIGVtb2ppLmlkICsgXCI+XCJcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKG5ldyBFcnJvcihcIkNvdWxkbid0IHN0YXJ0IGF1dG9jb21wbGV0aW9uIG9mIExpZ2h0Y29yZCdzIGVtb2ppcy5cIikpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiogRW1vamkgZGlzcGxheSAqL1xyXG4gICAgICAgIHdoaWxlICghQkRWMi5NZXNzYWdlQ29tcG9uZW50KSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5jYW5jZWxFbW9qaVJlbmRlcil7IC8vIFRPRE86IFByb3BlciBlbW9qaSBmb3JtYXR0aW5nIC8gcmVuZGVyaW5nXHJcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsRW1vdGVSZW5kZXIgPSBVdGlscy5tb25rZXlQYXRjaChCRFYyLk1lc3NhZ2VDb21wb25lbnQsIFwiZGVmYXVsdFwiLCB7YmVmb3JlOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0sIFwiY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5tZXNzYWdlXCIpXHJcbiAgICAgICAgICAgICAgICBpZighbWVzc2FnZSlyZXR1cm5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLCBcImNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMuY29udGVudFwiKVxyXG4gICAgICAgICAgICAgICAgaWYoIWNvbnRlbnQgfHwgIWNvbnRlbnQubGVuZ3RoKXJldHVyblxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIEB0eXBlIHt7XHJcbiAgICAgICAgICAgICAgICAgKiAgcmF3OiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgKiAgbmFtZTogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICogIGlkOiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgKiAgYW5pbWF0ZWQ6IGJvb2xlYW5cclxuICAgICAgICAgICAgICAgICAqIH1bXX1cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgbGV0IGVtb2ppcyA9IFtdXHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBbXVxyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBub2RlIG9mIGNvbnRlbnQpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yobm9kZSkgIT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudC5wdXNoKG5vZGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyc2VkO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBoYXNQYXJzZWQgPSBmYWxzZVxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGRvIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkID0gQ29uc3RhbnRzLkVtb2ppUmVnZXguZXhlYyhub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUGFyc2VkID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIUVtb2ppTW9kdWxlQXBpKUVtb2ppTW9kdWxlQXBpID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VzdG9tRW1vamlCeUlkKVswXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1vamkgPSBFbW9qaU1vZHVsZUFwaS5kZWZhdWx0LmdldEN1c3RvbUVtb2ppQnlJZChwYXJzZWRbMl0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlbW9qaSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamlzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlZDogZW1vamkuYW5pbWF0ZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGVtb2ppLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBlbW9qaS5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3OiBwYXJzZWRbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamlzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlZDogcGFyc2VkWzBdLnN0YXJ0c1dpdGgoXCI8YVwiKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcGFyc2VkWzFdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcGFyc2VkWzJdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXc6IHBhcnNlZFswXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChwYXJzZWQpO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoaGFzUGFyc2VkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd29yZHMgPSBub2RlLnNwbGl0KFwiIFwiKS5tYXAoKHdvcmQsIGluZGV4LCBhcnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF3b3JkKXJldHVybiBcIlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbW9qaSA9IGVtb2ppcy5maW5kKGUgPT4gZS5yYXcgPT0gd29yZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFlbW9qaSlyZXR1cm4gd29yZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIUN1c3RvbUVtb2ppTW9kdWxlKUN1c3RvbUVtb2ppTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuQ3VzdG9tRW1vamkpWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChDdXN0b21FbW9qaU1vZHVsZS5DdXN0b21FbW9qaSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGAuJHtlbW9qaS5uYW1lfS5gLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaUlkOiBlbW9qaS5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZWQ6IGVtb2ppLmFuaW1hdGVkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW1ib2FibGU6IGFyci5sZW5ndGggPT09IDEgJiYgY29udGVudC5sZW5ndGggPT09IDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwcmV2aW91cy5sZW5ndGggPT09IDApcmV0dXJuIFtjdXJyZW50XVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIGN1cnJlbnQgPT09IFwic3RyaW5nXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBwcmV2aW91c1twcmV2aW91cy5sZW5ndGggLSAxXSA9PT0gXCJzdHJpbmdcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzW3ByZXZpb3VzLmxlbmd0aCAtIDFdICs9IGAgJHtjdXJyZW50fWBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzLnB1c2goXCIgXCIrY3VycmVudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzLnB1c2goXCIgXCIsIGN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQucHVzaCguLi53b3JkcylcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudC5wdXNoKG5vZGUpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgd2hpbGUoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0uY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5jb250ZW50WzBdKXtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLmNvbnRlbnQuc2hpZnQoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgd2hpbGUobmV3Q29udGVudFswXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5tZXRob2RBcmd1bWVudHNbMF0uY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5jb250ZW50LnB1c2gobmV3Q29udGVudC5zaGlmdCgpKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9fSk7XHJcbiAgICAgICAgfS8qXHJcbiAgICAgICAgbGV0IHVzZXJNb2R1bGVcclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUgPT09IFwiRW1vamlQaWNrZXJMaXN0Um93XCIpXHJcbiAgICAgICAgLnRoZW4oRW1vamlQaWNrZXJMaXN0Um93ID0+IHtcclxuICAgICAgICAgICAgbGV0IGNsYXNzcyA9IEVtb2ppUGlja2VyTGlzdFJvdy5kZWZhdWx0XHJcbiAgICAgICAgICAgIEVtb2ppUGlja2VyTGlzdFJvdy5kZWZhdWx0ID0gY2xhc3MgRW1vamlQaWNrZXJMaXN0Um93IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICAgICAgICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZW5kZXIoKXtcclxuICAgICAgICAgICAgICAgICAgICBpZighdXNlck1vZHVsZSl1c2VyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIXVzZXJNb2R1bGUpcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoY2xhc3NzLCB0aGlzLnByb3BzKVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCB1c2VyID0gdXNlck1vZHVsZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKClcclxuICAgICAgICAgICAgICAgICAgICBpZighdXNlci5oYXNQcmVtaXVtU3Vic2NyaXB0aW9uKXJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGNsYXNzcywgdGhpcy5wcm9wcylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoY2xhc3NzLCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnByb3BzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppRGVzY3JpcHRvcnM6IHRoaXMucHJvcHMuZW1vamlEZXNjcmlwdG9ycy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmlzRGlzYWJsZWQgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH0pKSAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgRW1vamlQaWNrZXJMaXN0Um93LmRlZmF1bHQuZGlzcGxheU5hbWUgPSBcIkVtb2ppUGlja2VyTGlzdFJvd1wiXHJcbiAgICAgICAgfSkqL1xyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUoKXtcclxuICAgICAgICBpZiAoIXRoaXMuY2FuY2VsRW1vdGVSZW5kZXIpIHJldHVybjtcclxuICAgICAgICB0aGlzLmNhbmNlbEVtb3RlUmVuZGVyKCk7XHJcbiAgICAgICAgdGhpcy5jYW5jZWxFbW90ZVJlbmRlciA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnQoKXtcclxuICAgICAgICBcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gRChlLCB0LCBuLCByLCBvLCBpLCBzLCB1LCBsLCBjKSB7XHJcbiAgICBpZiAobnVsbCA9PSBuIHx8IDAgPT09IG4ubGVuZ3RoKSByZXR1cm4gbnVsbDtcclxuICAgIHZhciBkID0gbi5tYXAoKGZ1bmN0aW9uKGUsIG4pIHtcclxuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCh1LCBPYmplY3QuYXNzaWduKHtcclxuICAgICAgICAgICAgb25DbGljazogbyxcclxuICAgICAgICAgICAgb25Ib3ZlcjogcixcclxuICAgICAgICAgICAgc2VsZWN0ZWQ6IHQgPT09IG4sXHJcbiAgICAgICAgICAgIGluZGV4OiBuXHJcbiAgICAgICAgfSwgbChlLCBuKSkpXHJcbiAgICB9KSk7XHJcbiAgICByZXR1cm4gW1IoaSwgcywgZSwgYyksIGRdXHJcbn1cclxuXHJcbmZ1bmN0aW9uIFIoZSwgdCwgbiwgcikge1xyXG4gICAgdmFyIGEgPSAobi5sZW5ndGggPiAwID8gZS5mb3JtYXQoe1xyXG4gICAgICAgIHByZWZpeDogcihuKVxyXG4gICAgfSkgOiB0KVxyXG4gICAgaWYoQXJyYXkuaXNBcnJheShhKSl7XHJcbiAgICAgICAgYS51bnNoaWZ0KFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdHJvbmdcIiwge30sIFwiW0xpZ2h0Y29yZF0gXCIpKVxyXG4gICAgfWVsc2V7XHJcbiAgICAgICAgYSA9IFwiW0xJR0hUQ09SRF0gXCIrYVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQXV0b2NvbXBsZXRlTW9kdWxlLmRlZmF1bHQuVGl0bGUsIHtcclxuICAgICAgICB0aXRsZTogYVxyXG4gICAgfSwgYSlcclxufVxyXG5SLmRpc3BsYXlOYW1lID0gXCJyZW5kZXJIZWFkZXJcIjtcclxuXHJcbmxldCBFbW9qaUZpbHRlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZClbMF1cclxubGV0IGlzRW1vamlEaXNhYmxlZCA9IEVtb2ppRmlsdGVyTW9kdWxlICYmIEVtb2ppRmlsdGVyTW9kdWxlLmRlZmF1bHQuaXNFbW9qaURpc2FibGVkXHJcbmxldCBpc1VzYWJsZSA9IGZhbHNlXHJcbmxldCBoYXNQYXRjaGVkID0gZmFsc2VcclxuXHJcbmZ1bmN0aW9uIHNldEVtb2ppVXNhYmxlKHVzYWJsZSl7XHJcbiAgICBpc1VzYWJsZSA9IHVzYWJsZVxyXG4gICAgaWYoaGFzUGF0Y2hlZClyZXR1cm5cclxuICAgIGlmKCFFbW9qaUZpbHRlck1vZHVsZSlFbW9qaUZpbHRlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZClbMF1cclxuICAgIGlmKCFFbW9qaUZpbHRlck1vZHVsZSlyZXR1cm5cclxuICAgIGlmKCFpc0Vtb2ppRGlzYWJsZWQpaXNFbW9qaURpc2FibGVkID0gRW1vamlGaWx0ZXJNb2R1bGUuZGVmYXVsdC5pc0Vtb2ppRGlzYWJsZWRcclxuXHJcbiAgICBoYXNQYXRjaGVkID0gdHJ1ZVxyXG4gICAgRW1vamlGaWx0ZXJNb2R1bGUuZGVmYXVsdC5pc0Vtb2ppRGlzYWJsZWQgPSBmdW5jdGlvbihlbW9qaSl7XHJcbiAgICAgICAgaWYoaXNVc2FibGUpe1xyXG4gICAgICAgICAgICBpZihlbW9qaS5zdXJyb2dhdGVzIHx8IGVtb2ppLmRpdmVyc2l0eSlyZXR1cm4gdHJ1ZVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGlzRW1vamlEaXNhYmxlZC5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cylcclxuICAgIH1cclxufSIsImltcG9ydCBub2RlRmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIlxyXG5pbXBvcnQgKiBhcyBlbGVjdHJvbiBmcm9tIFwiZWxlY3Ryb25cIlxyXG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSBcImNyeXB0b1wiXHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCJcclxuaW1wb3J0IHRvb2x0aXBXcmFwIGZyb20gXCIuLi91aS90b29sdGlwV3JhcFwiXHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiXHJcbmltcG9ydCB7IGNyZWF0ZVJlYWRTdHJlYW0sIHdyaXRlRmlsZVN5bmMgfSBmcm9tIFwiZnNcIlxyXG5pbXBvcnQgeyBiYXNlbmFtZSwgam9pbiB9IGZyb20gXCJwYXRoXCJcclxuaW1wb3J0IGNvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCJcclxuaW1wb3J0IHsgYWRkb25DYWNoZSB9IGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCJcclxuXHJcbmNvbnN0IGNhY2hlID0ge31cclxuY29uc3QgY2FjaGUyID0ge31cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBQbHVnaW5DZXJ0aWZpZXIge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuUGx1Z2luQ2VydGlmaWVyID0gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIHBhdGNoKGF0dGFjaG1lbnQsIGlkKXtcclxuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcclxuICAgICAgICAgICAgcHJvY2Vzc0F0dGFjaG1lbnQoYXR0YWNobWVudCwgaWQpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBzdGFydCgpe1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBpc1RydXN0ZWQoaGFzaCl7XHJcbiAgICAgICAgcmV0dXJuIGNhY2hlW2hhc2hdICYmICFjYWNoZVtoYXNoXS5zdXNwZWN0XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjaGVja1ZpcnVzZXMoaGFzaCwgZGF0YSwgcmVzdWx0Q2FsbGJhY2ssIHJlbW92ZUNhbGxiYWNrLCBmaWxlbmFtZSl7XHJcbiAgICBkYXRhID0gZGF0YS50b1N0cmluZyhcInV0ZjhcIilcclxuICAgIGxldCBpc0hhcm1mdWwgPSBmYWxzZVxyXG4gICAgZm9yKGxldCBrZXl3b3JkIG9mIGRhdGEuc3BsaXQoL1teXFx3XFxkXSsvZykpe1xyXG4gICAgICAgIGZvcihsZXQgb29mIG9mIFtcclxuICAgICAgICAgICAgXCJ0b2tlblwiLFxyXG4gICAgICAgICAgICBcImVtYWlsXCIsXHJcbiAgICAgICAgICAgIFwicGhvbmVcIixcclxuICAgICAgICAgICAgXCJNRkFcIixcclxuICAgICAgICAgICAgXCIyZmFcIixcclxuICAgICAgICAgICAgXCJjaGlsZF9wcm9jZXNzXCIsXHJcbiAgICAgICAgICAgIFwibG9jYWxTdG9yYWdlXCIsXHJcbiAgICAgICAgICAgIFwiZXZhbFwiLFxyXG4gICAgICAgICAgICBcImdldEdsb2JhbFwiLFxyXG4gICAgICAgICAgICBcIkJyb3dzZXJXaW5kb3dcIlxyXG4gICAgICAgIF0pe1xyXG4gICAgICAgICAgICBpZihrZXl3b3JkLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMob29mLnRvTG93ZXJDYXNlKCkpICYmICFrZXl3b3JkLnRvTG93ZXJDYXNlKCkgPT09IFwiZG9tdG9rZW5saXN0XCIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cob29mLCBrZXl3b3JkKVxyXG4gICAgICAgICAgICAgICAgaXNIYXJtZnVsID0gXCJ0b2tlbiBzdGVhbGVyL3ZpcnVzXCJcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH0gXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGlzSGFybWZ1bClicmVha1xyXG4gICAgfVxyXG5cclxuICAgIGlmKCFpc0hhcm1mdWwpe1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3Qgbm9fY29tbWVudHMgPSBkYXRhLnJlcGxhY2UoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC98KFteXFxcXDpdfF4pXFwvXFwvLiokL2dtLCBcIlwiKS50cmltKCkvLyByZW1vdmluZyB0aGUgTUVUQSBjb21tZW50IGZyb20gcGx1Z2luc1xyXG4gICAgICAgIGlmKCgvdmFyIFtcXHdcXGRfJF0rPVxcW1wiL2dpKS50ZXN0KG5vX2NvbW1lbnRzKSl7XHJcbiAgICAgICAgICAgIGlzSGFybWZ1bCA9IFwib2JmdXNjYXRpb24vaGlkZGVuIGNvZGVcIlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoIWlzSGFybWZ1bCl7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4cHMgPSBbXHJcbiAgICAgICAgICAgICAgICAvKiogaGV4YWRlY2ltYWwgKi9cclxuICAgICAgICAgICAgICAgIC9fMHhcXHd7NH1cXCgnMHhbXFxkYWJjZGVmXSsnXFwpL2csXHJcbiAgICAgICAgICAgICAgICAvXzB4XFx3ezR9XFwoJzB4W1xcZGFiY2RlZl0rJ1ssIF0rJ1teJ117NH0nXFwpL2csIC8vIF8weDhkYjcoJzB4MCcsICd4MV1mJylcclxuICAgICAgICAgICAgICAgIC8qKiBtYW5nbGVkICovXHJcbiAgICAgICAgICAgICAgICAvXFx3K1xcKCcweFtcXGRhYmNkZWZdKydcXCkvZywgLy8gYignMHgwJylcclxuICAgICAgICAgICAgICAgIC9cXHcrXFwoJzB4W1xcZGFiY2RlZl0rJ1ssIF0rJ1teJ117NH0nXFwpL2csIC8vIGIoJzB4MCcsICd4MV1mJylcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICBmb3IobGV0IHJlZ2V4IG9mIHJlZ2V4cHMpe1xyXG4gICAgICAgICAgICAgICAgaWYoaXNIYXJtZnVsKWJyZWFrXHJcbiAgICAgICAgICAgICAgICBpZihyZWdleC50ZXN0KG5vX2NvbW1lbnRzKSlpc0hhcm1mdWwgPSBcIm9iZnVzY2F0aW9uL2hpZGRlbiBjb2RlXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZighaXNIYXJtZnVsKXJldHVybiByZW1vdmVDYWxsYmFjayhoYXNoKVxyXG4gICAgY2FjaGVbaGFzaF0gPSB7XHJcbiAgICAgICAgc3VzcGVjdDogdHJ1ZSxcclxuICAgICAgICBuYW1lOiBoYXNoVG9VcmxbaGFzaF0uc3BsaXQoXCIvXCIpLnBvcCgpLFxyXG4gICAgICAgIHR5cGU6IGhhc2hUb1VybFtoYXNoXS5lbmRzV2l0aChcIi5qc1wiKSA/IFwiUGx1Z2luXCIgOiBcIlRoZW1lXCIsXHJcbiAgICAgICAgaGFybTogaXNIYXJtZnVsLFxyXG4gICAgICAgIGhhc2g6IGhhc2gsXHJcbiAgICAgICAgZmlsZW5hbWVcclxuICAgIH1cclxuICAgIFxyXG4gICAgY29uc29sZS5sb2coYEZvdW5kIHBvdGVudGlhbGx5IGRhbmdlcm91cyAke2NhY2hlW2hhc2hdLnR5cGUudG9Mb3dlckNhc2UoKX06ICR7Y2FjaGVbaGFzaF0ubmFtZX1gKVxyXG5cclxuICAgIHJlc3VsdENhbGxiYWNrKGNhY2hlW2hhc2hdKVxyXG59XHJcblxyXG5jb25zdCBoYXNoVG9VcmwgPSB7fVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSGFzaChoYXNoLCBkYXRhLCBmaWxlbmFtZSwgcmVzdWx0Q2FsbGJhY2ssIHJlbW92ZUNhbGxiYWNrKXtcclxuICAgIGNvbnNvbGUubG9nKGBGaWxlOiAke2ZpbGVuYW1lfSBoYXNoOiAke2hhc2h9YClcclxuICAgIGlmKCFjYWNoZVtoYXNoXSl7XHJcbiAgICAgICAgbm9kZUZldGNoKFwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL0xpZ2h0Y29yZC9maWxlaGFzaGVzQG1hc3Rlci9oYXNoZXMvXCIraGFzaCwgeyAvLyBVc2luZyBub2RlLWZldGNoIHRvIGJ5cGFzcyBjb3JzXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgIFwiVXNlci1BZ2VudFwiOiBlbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCkudXNlckFnZW50IC8vIGhhdmUgdG8gc2V0IHVzZXItYWdlbnRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pLnRoZW4oYXN5bmMgcmVzID0+IHtcclxuICAgICAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXtcclxuICAgICAgICAgICAgICAgIGlmKGZpbGVuYW1lLmVuZHNXaXRoKFwiLnRoZW1lLmNzc1wiKSlyZXR1cm4gcmVtb3ZlQ2FsbGJhY2soaGFzaClcclxuICAgICAgICAgICAgICAgIGNoZWNrVmlydXNlcyhoYXNoLCBkYXRhLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2ssIGZpbGVuYW1lKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzLmpzb24oKVxyXG4gICAgICAgICAgICByZXN1bHQuaGFzaCA9IGhhc2hcclxuICAgICAgICAgICAgcmVzdWx0LmZpbGVuYW1lID0gZmlsZW5hbWVcclxuXHJcbiAgICAgICAgICAgIGNhY2hlW2hhc2hdID0gcmVzdWx0XHJcblxyXG4gICAgICAgICAgICByZXN1bHRDYWxsYmFjayhyZXN1bHQpXHJcbiAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBDb3VsZCBub3QgcmVhZCBmcm9tIGdpdGh1Yi4gJHtlcnJ9YClcclxuICAgICAgICAgICAgaWYoZmlsZW5hbWUuZW5kc1dpdGgoXCIudGhlbWUuY3NzXCIpKXJldHVybiByZW1vdmVDYWxsYmFjayhoYXNoKVxyXG4gICAgICAgICAgICBjaGVja1ZpcnVzZXMoaGFzaCwgZGF0YSwgcmVzdWx0Q2FsbGJhY2ssIHJlbW92ZUNhbGxiYWNrLCBmaWxlbmFtZSlcclxuICAgICAgICB9KVxyXG4gICAgfWVsc2V7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY2FjaGVbaGFzaF1cclxuXHJcbiAgICAgICAgcmVzdWx0Q2FsbGJhY2socmVzdWx0KVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0ZpbGUoX19wYXRoLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2sgPSAoaGFzaCkgPT4ge30sIGlzRnJvbUxvYWRlciA9IGZhbHNlKXsgICAgXHJcbiAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGEyNTZcIilcclxuICAgIGxldCBkYXRhID0gQnVmZmVyLmFsbG9jKDApXHJcblxyXG4gICAgY3JlYXRlUmVhZFN0cmVhbShfX3BhdGgpLm9uKFwiZGF0YVwiLCBjaHVuayA9PiB7XHJcbiAgICAgICAgZGF0YSA9IEJ1ZmZlci5jb25jYXQoW2RhdGEsIGNodW5rXSlcclxuICAgICAgICBoYXNoLnVwZGF0ZShjaHVuaylcclxuICAgIH0pLm9uKFwiZW5kXCIsICgpID0+IHtcclxuICAgICAgICBjb25zdCBoYXNoUmVzdWx0ID0gaGFzaC5kaWdlc3QoXCJoZXhcIilcclxuXHJcbiAgICAgICAgaGFzaFRvVXJsW2hhc2hSZXN1bHRdID0gX19wYXRoXHJcblxyXG4gICAgICAgIGlmKGlzRnJvbUxvYWRlciAmJiBhZGRvbkNhY2hlW2hhc2hSZXN1bHRdKXtcclxuICAgICAgICAgICAgbGV0IHZhbHVlID0gYWRkb25DYWNoZVtoYXNoUmVzdWx0XVxyXG4gICAgICAgICAgICBpZih2YWx1ZS50aW1lc3RhbXAgPCAoRGF0ZS5ub3coKSAtIDYuMDQ4ZSs4KSl7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgYWRkb25DYWNoZVtoYXNoUmVzdWx0XVxyXG4gICAgICAgICAgICAgICAgY29udGVudE1hbmFnZXIuc2F2ZUFkZG9uQ2FjaGUoKVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHJlc3VsdENhbGxiYWNrKHZhbHVlLnJlc3VsdClcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjaGVja0hhc2goaGFzaFJlc3VsdCwgZGF0YSwgYmFzZW5hbWUoX19wYXRoKSwgcmVzdWx0Q2FsbGJhY2ssIHJlbW92ZUNhbGxiYWNrKVxyXG4gICAgfSlcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NBdHRhY2htZW50KGF0dGFjaG1lbnQsIGlkKXtcclxuICAgIGlmKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkpcmV0dXJuXHJcbiAgICBpZighYXR0YWNobWVudC51cmwuc3RhcnRzV2l0aChcImh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL1wiKSlyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJlbW92ZSgpXHJcbiAgICBpZighYXR0YWNobWVudC5maWxlbmFtZS5lbmRzV2l0aChcIi5wbHVnaW4uanNcIikgJiYgIWF0dGFjaG1lbnQuZmlsZW5hbWUuZW5kc1dpdGgoXCIudGhlbWUuY3NzXCIpKXJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkucmVtb3ZlKClcclxuXHJcbiAgICBub2RlRmV0Y2goYXR0YWNobWVudC51cmwsIHtcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgIFwiVXNlci1BZ2VudFwiOiBlbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCkudXNlckFnZW50XHJcbiAgICAgICAgfVxyXG4gICAgfSkudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl0aHJvdyBuZXcgRXJyb3IoXCJGaWxlIGRvZXNuJ3QgZXhpc3QuXCIpXHJcbiAgICAgICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpXHJcbiAgICAgICAgbGV0IGRhdGEgPSBCdWZmZXIuYWxsb2MoMClcclxuICAgICAgICByZXMuYm9keS5vbihcImRhdGFcIiwgY2h1bmsgPT4ge1xyXG4gICAgICAgICAgICBkYXRhID0gQnVmZmVyLmNvbmNhdChbZGF0YSwgY2h1bmtdKVxyXG4gICAgICAgICAgICBoYXNoLnVwZGF0ZShjaHVuaylcclxuICAgICAgICB9KVxyXG4gICAgICAgIHJlcy5ib2R5Lm9uKFwiZW5kXCIsICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaGFzaFJlc3VsdCA9IGhhc2guZGlnZXN0KFwiaGV4XCIpXHJcblxyXG4gICAgICAgICAgICBjYWNoZTJbYXR0YWNobWVudC51cmxdID0gaGFzaFJlc3VsdFxyXG4gICAgICAgICAgICBoYXNoVG9VcmxbaGFzaFJlc3VsdF0gPSBhdHRhY2htZW50LnVybFxyXG5cclxuICAgICAgICAgICAgY2hlY2tIYXNoKGhhc2hSZXN1bHQsIGRhdGEsIGF0dGFjaG1lbnQuZmlsZW5hbWUsIChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlbmRlclRvRWxlbWVudHMoaWQsIHJlc3VsdCwgYXR0YWNobWVudC5maWxlbmFtZSlcclxuICAgICAgICAgICAgfSwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcclxuICAgICAgICAgICAgICAgIGlmKGVsZW0pZWxlbS5yZW1vdmUoKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9KS5jYXRjaCgoKT0+e30pXHJcbn1cclxuXHJcbmxldCBmbG93ZXJTdGFyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZmxvd2VyU3RhckNvbnRhaW5lcilbMF1cclxubGV0IGNoaWxkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY2hpbGRDb250YWluZXIpWzBdXHJcblxyXG4vKipcclxuICogXHJcbiAqIEBwYXJhbSB7SFRNTERpdkVsZW1lbnRbXX0gZWxlbWVudHMgXHJcbiAqIEBwYXJhbSB7e3R5cGU6IFwiVGhlbWVcInxcIlBsdWdpblwiLCBuYW1lOiBzdHJpbmcsIG9mZmljaWFsPzogYm9vbGVhbn18e3N1c3BlY3Q6dHJ1ZSwgdHlwZTogXCJUaGVtZVwifFwiUGx1Z2luXCIsIG5hbWU6IHN0cmluZywgaGFybTogc3RyaW5nfX0gcmVzdWx0XHJcbiAqL1xyXG5mdW5jdGlvbiByZW5kZXJUb0VsZW1lbnRzKGlkLCByZXN1bHQsIGZpbGVuYW1lKXtcclxuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxyXG4gICAgaWYoIWRpdiB8fCBkaXYuY2hpbGROb2Rlcy5sZW5ndGggPiAwKXJldHVybiAvLyBhbHJlYWR5IGNlcnRpZmllZC9kaXYgZG9lcyBub3QgZXhpc3QgYW55bW9yZS5cclxuXHJcbiAgICBpZighZmxvd2VyU3Rhck1vZHVsZSlmbG93ZXJTdGFyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZmxvd2VyU3RhckNvbnRhaW5lcilbMF1cclxuICAgIGlmKCFjaGlsZE1vZHVsZSljaGlsZE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNoaWxkQ29udGFpbmVyKVswXVxyXG4gICAgXHJcbiAgICBpZihyZXN1bHQuc3VzcGVjdCl7XHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICBkaXYucGFyZW50Tm9kZS5zdHlsZS5ib3JkZXJDb2xvciA9IFwicmdiKDI0MCwgNzEsIDcxKVwiXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBcclxuICAgICAgICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSBcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGxldCBuZXh0Tm9kZSA9IChub2RlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGNoaWxkLnRhZ05hbWUgPT09IFwiQVwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZG93bmxvYWQgdGhpcyA/XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVGhlIFwiK3Jlc3VsdC50eXBlLnRvTG93ZXJDYXNlKCkrXCIgKipcIitmaWxlbmFtZStcIioqIG1pZ2h0IGJlIGRhbmdlcm91cyAqKihcIityZXN1bHQuaGFybStcIikqKi4gXFxuXFxuKipXZSBkb24ndCByZWNvbW1hbmQgdG8gZG93bmxvYWQgaXQqKi4gSG93ZXZlciwgeW91IGNhbiBzdGlsbCBkbyBpdCBiZWxvdy5cIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogXCJEb3dubG9hZCBBbnl3YXlcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsVGV4dDogXCJEb24ndCAhXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhbmdlcjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DYW5jZWw6ICgpID0+IHt9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbmZpcm06ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZWN0cm9uLnJlbW90ZS5zaGVsbC5vcGVuRXh0ZXJuYWwoY2hpbGQuaHJlZilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihbXCJkaXZcIl0uaW5jbHVkZXMoY2hpbGQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHROb2RlKGNoaWxkKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBuZXh0Tm9kZShkaXYucGFyZW50Tm9kZSlcclxuICAgICAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7dGV4dDogcmVzdWx0LnR5cGUrXCIgXCIrcmVzdWx0Lm5hbWUrXCIgaXMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzLlwifSwgXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXJDb250YWluZXIsIHN0eWxlOiB7d2lkdGg6IFwiMjBweFwiLCBoZWlnaHQ6IFwiMjBweFwifX0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge2NsYXNzTmFtZTogQkRNb2R1bGVzLmdldChlID0+IGUuc3ZnKVswXS5zdmcsIFwiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIyMHB4XCIsaGVpZ2h0OlwiMjBweFwiLHZpZXdCb3g6XCIwIDAgNDAgMzJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6XCIwXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6XCIwXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOlwiMzJcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OlwiMzJcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFzazpcInVybCgjc3ZnLW1hc2stYXZhdGFyLXN0YXR1cy1yb3VuZC0zMilcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDpcIiNmMDQ3NDdcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFzazpcInVybCgjc3ZnLW1hc2stc3RhdHVzLWRuZClcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOkJETW9kdWxlcy5nZXQoZSA9PiBlLnBvaW50ZXJFdmVudHMpWzBdLnBvaW50ZXJFdmVudHNcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKSwgZGl2KVxyXG4gICAgfWVsc2UgaWYoIXJlc3VsdC5vZmZpY2lhbCl7XHJcbiAgICAgICAgZGl2LnBhcmVudE5vZGUuc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiM0MDg3ZWRcIlxyXG4gICAgICAgIGxldCBzcGFuID0gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7c3R5bGU6IHtkaXNwbGF5OiBcImluaGVyaXRcIn19LCBbXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IHJlc3VsdC50eXBlK1wiIFwiK3Jlc3VsdC5uYW1lK1wiIGlzIGNlcnRpZmllZCBieSBMaWdodGNvcmQuXCJ9LCBcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXJDb250YWluZXIsIHN0eWxlOiB7d2lkdGg6IFwiMjBweFwiLCBoZWlnaHQ6IFwiMjBweFwiLCBmbG9hdDogXCJsZWZ0XCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyLCBcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDE2IDE1LjJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6XCIjNGY1NDVjXCIsIFwiZmlsbC1ydWxlXCI6XCJldmVub2RkXCIsZDpcIm0xNiA3LjZjMCAuNzktMS4yOCAxLjM4LTEuNTIgMi4wOXMuNDQgMiAwIDIuNTktMS44NC4zNS0yLjQ2LjgtLjc5IDEuODQtMS41NCAyLjA5LTEuNjctLjgtMi40Ny0uOC0xLjc1IDEtMi40Ny44LS45Mi0xLjY0LTEuNTQtMi4wOS0yLS4xOC0yLjQ2LS44LjIzLTEuODQgMC0yLjU5LTEuNTQtMS4zLTEuNTQtMi4wOSAxLjI4LTEuMzggMS41Mi0yLjA5LS40NC0yIDAtMi41OSAxLjg1LS4zNSAyLjQ4LS44Ljc4LTEuODQgMS41My0yLjEyIDEuNjcuODMgMi40Ny44MyAxLjc1LTEgMi40Ny0uOC45MSAxLjY0IDEuNTMgMi4wOSAyIC4xOCAyLjQ2LjgtLjIzIDEuODQgMCAyLjU5IDEuNTQgMS4zIDEuNTQgMi4wOXpcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogY2hpbGRNb2R1bGUuY2hpbGRDb250YWluZXJ9LCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDE2IDE1LjJcIn0sIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZmlsbDpcIiNmZmZmZmZcIixkOlwiTTcuNCwxMS4xNyw0LDguNjIsNSw3LjI2bDIsMS41M0wxMC42NCw0bDEuMzYsMVpcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IFwiSW5zdGFsbCB0aGlzIFwiK3Jlc3VsdC50eXBlLnRvTG93ZXJDYXNlKCkrXCIgb24gTGlnaHRjb3JkLlwifSwgXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyQ29udGFpbmVyLCBzdHlsZToge3dpZHRoOiBcIjIwcHhcIiwgaGVpZ2h0OiBcIjIwcHhcIn0sIG9uQ2xpY2soKXtcclxuICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRvd25sb2FkIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiA/XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkxpZ2h0Y29yZCB3aWxsIGF1dG9tYXRpY2FsbHkgaW5zdGFsbCBhbmQgbGF1bmNoIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIi4gWW91IGRvbid0IGhhdmUgYW55dGhpbmcgdG8gZG8uXCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogXCJEb3dubG9hZCBhbmQgSW5zdGFsbFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsVGV4dDogXCJJJ3ZlIGNoYW5nZWQgbXkgbWluZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFuZ2VyOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsOiAoKSA9PiB7fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29uZmlybTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rID0gZ2V0S2V5ZWRBcnJheShjYWNoZTIpLmZpbmQoZSA9PiBlWzFdID09PSByZXN1bHQuaGFzaClbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhsaW5rKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVGZXRjaChsaW5rKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGFzeW5jIHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl0aHJvdyBuZXcgRXJyb3IoXCJTdGF0dXMgd2FzIG5vdCAyMDBcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCByZXMuYnVmZmVyKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluc3RhbGxQYXRoID0gam9pbihyZXN1bHQudHlwZSA9PT0gXCJQbHVnaW5cIiA/IGNvbnRlbnRNYW5hZ2VyLl9wbHVnaW5zRm9sZGVyIDogY29udGVudE1hbmFnZXIuX3RoZW1lc0ZvbGRlciwgcmVzdWx0LmZpbGVuYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhpbnN0YWxsUGF0aClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVGaWxlU3luYyhpbnN0YWxsUGF0aCwgY29udGVudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KHJlc3VsdC50eXBlK1wiIHN1Y2Nlc2Z1bGx5IGluc3RhbGxlZC5cIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyciA6IG5ldyBFcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChlcnIubWVzc2FnZSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJlcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXIsIFwiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIyMHB4XCIsaGVpZ2h0OlwiMjBweFwiLHZpZXdCb3g6XCIwIDAgMjQgMjRcIixzdHlsZTp7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBcInJnYig2NywgMTgxLCAxMjkpXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGcgZmlsbD1cIm5vbmVcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGNsYXNzPVwiZmlsbFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICBdKVxyXG4gICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKHNwYW4sIGRpdilcclxuICAgIH1lbHNle1xyXG4gICAgICAgIGRpdi5wYXJlbnROb2RlLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjNDA4N2VkXCJcclxuICAgICAgICBsZXQgc3BhbiA9IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge3N0eWxlOiB7ZGlzcGxheTogXCJpbmhlcml0XCJ9fSwgW1xyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQodG9vbHRpcFdyYXAsIHt0ZXh0OiByZXN1bHQudHlwZStcIiBcIityZXN1bHQubmFtZStcIiB3YXMgbWFkZSBieSB0aGUgZGV2ZWxvcGVycyBvZiBMaWdodGNvcmQuXCIsIHN0eWxlOlwiYnJhbmRcIn0sIFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhckNvbnRhaW5lciwgc3R5bGU6IHt3aWR0aDogXCIyMHB4XCIsIGhlaWdodDogXCIyMHB4XCIsIGZsb2F0OiBcImxlZnRcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXIsIFwiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIyMHB4XCIsaGVpZ2h0OlwiMjBweFwiLHZpZXdCb3g6XCIwIDAgMTYgMTUuMlwiLHN0cm9rZTpcIiMzNjM5M2ZcIixzdHlsZTp7Y29sb3I6XCIjNDA4N2VkXCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZmlsbDpcImN1cnJlbnRDb2xvclwiLCBcImZpbGwtcnVsZVwiOlwiZXZlbm9kZFwiLGQ6XCJtMTYgNy42YzAgLjc5LTEuMjggMS4zOC0xLjUyIDIuMDlzLjQ0IDIgMCAyLjU5LTEuODQuMzUtMi40Ni44LS43OSAxLjg0LTEuNTQgMi4wOS0xLjY3LS44LTIuNDctLjgtMS43NSAxLTIuNDcuOC0uOTItMS42NC0xLjU0LTIuMDktMi0uMTgtMi40Ni0uOC4yMy0xLjg0IDAtMi41OS0xLjU0LTEuMy0xLjU0LTIuMDkgMS4yOC0xLjM4IDEuNTItMi4wOS0uNDQtMiAwLTIuNTkgMS44NS0uMzUgMi40OC0uOC43OC0xLjg0IDEuNTMtMi4xMiAxLjY3LjgzIDIuNDcuODMgMS43NS0xIDIuNDctLjguOTEgMS42NCAxLjUzIDIuMDkgMiAuMTggMi40Ni44LS4yMyAxLjg0IDAgMi41OSAxLjU0IDEuMyAxLjU0IDIuMDl6XCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGNoaWxkTW9kdWxlLmNoaWxkQ29udGFpbmVyfSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCAxNiAxNS4yXCJ9LCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6XCIjZmZmZmZmXCIsZDpcIk0xMC43LDUuMjhhMi45LDIuOSwwLDAsMC0yLjExLjg2LjExLjExLDAsMCwwLDAsLjE2bDEuMDUuOTRhLjExLjExLDAsMCwwLC4xNSwwLDEuMjcsMS4yNywwLDAsMSwuOS0uMzNjLjY1LDAsLjY1LjczLjY1LjczYS42NC42NCwwLDAsMS0uNjUuNjUsMS43MywxLjczLDAsMCwxLTEuMTgtLjU0Yy0uMzEtLjI2LS4zNi0uMzItLjczLS42NlM3LjA2LDUuMjgsNS42NSw1LjI4QTIuMjYsMi4yNiwwLDAsMCwzLjM3LDcuNTYsMi41OSwyLjU5LDAsMCwwLDMuODIsOWEyLjE4LDIuMTgsMCwwLDAsMS44My44OSwyLjk0LDIuOTQsMCwwLDAsMi4xLS44MS4xMS4xMSwwLDAsMCwwLS4xNkw2Ljc0LDhBLjExLjExLDAsMCwwLDYuNiw4YTEuNTgsMS41OCwwLDAsMS0uOTQuMjloMEEuNzEuNzEsMCwwLDEsNSw3LjU2SDVhLjYzLjYzLDAsMCwxLC42NS0uNjRjLjcxLDAsMS40Mi43NSwxLjk0LDEuMjcuNzUuNzYsMS42NiwxLjc5LDMuMTEsMS43NEEyLjI4LDIuMjgsMCwwLDAsMTMsNy42NGEyLjU5LDIuNTksMCwwLDAtLjQ1LTEuNDdBMi4xNCwyLjE0LDAsMCwwLDEwLjcsNS4yOFpcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IFwiSW5zdGFsbCB0aGlzIFwiK3Jlc3VsdC50eXBlLnRvTG93ZXJDYXNlKCkrXCIgb24gTGlnaHRjb3JkLlwifSwgXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyQ29udGFpbmVyLCBzdHlsZToge3dpZHRoOiBcIjIwcHhcIiwgaGVpZ2h0OiBcIjIwcHhcIn0sIG9uQ2xpY2soKXtcclxuICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRvd25sb2FkIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiA/XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkxpZ2h0Y29yZCB3aWxsIGF1dG9tYXRpY2FsbHkgZG93bmxvYWQgYW5kIGxvYWQgdGhpcyBcIityZXN1bHQudHlwZS50b0xvd2VyQ2FzZSgpK1wiLiBZb3UgbXVzdCBlbmFibGUgaXQgaW4gdGhlIHNldHRpbmdzLlwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybVRleHQ6IFwiRG93bmxvYWQgYW5kIEluc3RhbGxcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbFRleHQ6IFwiSSd2ZSBjaGFuZ2VkIG15IG1pbmRcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhbmdlcjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbDogKCkgPT4ge30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbmZpcm06ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9IGdldEtleWVkQXJyYXkoY2FjaGUyKS5maW5kKGUgPT4gZVsxXSA9PT0gcmVzdWx0Lmhhc2gpWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUZldGNoKGxpbmspXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXRocm93IG5ldyBFcnJvcihcIlN0YXR1cyB3YXMgbm90IDIwMFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGF3YWl0IHJlcy5idWZmZXIoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5zdGFsbFBhdGggPSBqb2luKHJlc3VsdC50eXBlID09PSBcIlBsdWdpblwiID8gY29udGVudE1hbmFnZXIuX3BsdWdpbnNGb2xkZXIgOiBjb250ZW50TWFuYWdlci5fdGhlbWVzRm9sZGVyLCByZXN1bHQuZmlsZW5hbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUZpbGVTeW5jKGluc3RhbGxQYXRoLCBjb250ZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QocmVzdWx0LnR5cGUrXCIgc3VjY2VzZnVsbHkgaW5zdGFsbGVkLlwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyIDogbmV3IEVycm9yKGVycilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KGVyci5tZXNzYWdlLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhciwgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCAyNCAyNFwiLHN0eWxlOntcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFwicmdiKDY3LCAxODEsIDEyOSlcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJmaWxsXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIF0pXHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoc3BhbiwgZGl2KVxyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRLZXllZEFycmF5KG9iail7XHJcbiAgICBsZXQgYXJyID0gW11cclxuICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChrID0+IHtcclxuICAgICAgICBhcnIucHVzaChbaywgb2JqW2tdXSlcclxuICAgIH0pXHJcbiAgICByZXR1cm4gYXJyXHJcbn1cclxuXHJcbmxldCBrZXkgPSBudWxsXHJcbmxldCBzYXZlID0gbnVsbFxyXG5cclxud2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQobT0+bS5PYmplY3RTdG9yYWdlKVxyXG4udGhlbihsb2NhbFN0b3JhZ2VNb2R1bGUgPT4ge1xyXG4gICAgbGV0IGxvY2FsU3RvcmFnZSA9IGxvY2FsU3RvcmFnZU1vZHVsZS5pbXBsXHJcbiAgICBzYXZlID0gZnVuY3Rpb24oKXtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0KFwiUGx1Z2luQ2VydGlmaWVyS2V5RW5jcnlwdGlvbl9fXCIsIGJ0b2EoSlNPTi5zdHJpbmdpZnkoa2V5KSkpXHJcbiAgICB9XHJcbiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgc2F2ZSgpXHJcbiAgICB9LCAxMDAwMDApO1xyXG4gICAgdHJ5e1xyXG4gICAgICAgIGxldCB2YWwgPSBzYWZlSlNPTlBhcnNlKGF0b2IobG9jYWxTdG9yYWdlLmdldChcIlBsdWdpbkNlcnRpZmllcktleUVuY3J5cHRpb25fX1wiKSkpXHJcbiAgICAgICAgaWYodmFsIGluc3RhbmNlb2YgRXJyb3IgfHwgIUFycmF5LmlzQXJyYXkodmFsKSB8fCB2YWwubGVuZ3RoICE9PSAyIHx8IHZhbC5maW5kKGUgPT4gdHlwZW9mIGUgIT09IFwic3RyaW5nXCIpIHx8IEJ1ZmZlci5mcm9tKHZhbFswXSwgXCJiYXNlNjRcIikubGVuZ3RoICE9PSAxNiB8fCBCdWZmZXIuZnJvbSh2YWxbMV0sIFwiYmFzZTY0XCIpLmxlbmd0aCAhPT0gMzIpe1xyXG4gICAgICAgICAgICBnZW5lcmF0ZUtleSgpXHJcbiAgICAgICAgICAgIHNhdmUoKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAga2V5ID0gdmFsXHJcbiAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgZ2VuZXJhdGVLZXkoKVxyXG4gICAgICAgIHNhdmUoKVxyXG4gICAgfVxyXG59KVxyXG5cclxuZnVuY3Rpb24gZ2VuZXJhdGVLZXkoKXtcclxuICAgIGtleSA9IFtjcnlwdG8ucmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKFwiYmFzZTY0XCIpLCBjcnlwdG8ucmFuZG9tQnl0ZXMoMzIpLnRvU3RyaW5nKFwiYmFzZTY0XCIpXVxyXG59XHJcblxyXG5mdW5jdGlvbiBzYWZlSlNPTlBhcnNlKGpzb24pe1xyXG4gICAgdHJ5e1xyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGpzb24pXHJcbiAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBFcnJvciA/IG5ldyBFcnJvcihlKSA6IGVcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRlY3J5cHRTZXR0aW5nc0NhY2hlKGRhdGEpe1xyXG4gICAgdHJ5e1xyXG4gICAgICAgIGxldCBkZWNpcGhlciA9IGNyeXB0by5jcmVhdGVEZWNpcGhlcml2KFwiYWVzLTI1Ni1jYmNcIiwgQnVmZmVyLmZyb20oa2V5WzFdLCBcImJhc2U2NFwiKSwgQnVmZmVyLmZyb20oa2V5WzBdLCBcImJhc2U2NFwiKSlcclxuICAgICAgICBsZXQgZGVjcnlwdGVkID0gZGVjaXBoZXIudXBkYXRlKEJ1ZmZlci5mcm9tKGRhdGEsIFwiYmFzZTY0XCIpKTtcclxuICAgICAgICBkZWNyeXB0ZWQgPSBCdWZmZXIuY29uY2F0KFtkZWNyeXB0ZWQsIGRlY2lwaGVyLmZpbmFsKCldKTtcclxuICAgICAgICByZXR1cm4gZGVjcnlwdGVkLnRvU3RyaW5nKFwidXRmOFwiKVxyXG4gICAgfWNhdGNoKGUpe1xyXG4gICAgICAgIHJldHVybiBcInt9XCJcclxuICAgIH1cclxufVxyXG5leHBvcnQgZnVuY3Rpb24gZW5jcnlwdFNldHRpbmdzQ2FjaGUoZGF0YSl7XHJcbiAgICBsZXQgYXJncyA9IFtCdWZmZXIuZnJvbShrZXlbMV0sIFwiYmFzZTY0XCIpLCBCdWZmZXIuZnJvbShrZXlbMF0sIFwiYmFzZTY0XCIpXVxyXG4gICAgXHJcbiAgICBsZXQgY2lwaGVyID0gY3J5cHRvLmNyZWF0ZUNpcGhlcml2KCdhZXMtMjU2LWNiYycsIC4uLmFyZ3MpO1xyXG4gICAgbGV0IGVuY3J5cHRlZCA9IGNpcGhlci51cGRhdGUoQnVmZmVyLmZyb20oZGF0YSwgXCJ1dGY4XCIpKTtcclxuICAgIGVuY3J5cHRlZCA9IEJ1ZmZlci5jb25jYXQoW2VuY3J5cHRlZCwgY2lwaGVyLmZpbmFsKCldKTtcclxuICAgIHJldHVybiBlbmNyeXB0ZWQudG9TdHJpbmcoXCJiYXNlNjRcIilcclxufSIsImltcG9ydCB7YmRwbHVnaW5FcnJvcnMsIHBsdWdpbkNvb2tpZSwgc2V0dGluZ3NDb29raWUsIGJkcGx1Z2luc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIjtcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XG5pbXBvcnQgQkRFdmVudHMgZnJvbSBcIi4vYmRFdmVudHNcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xuXG5jbGFzcyBQbHVnaW5Nb2R1bGUge1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5QbHVnaW5Nb2R1bGUgPSB0aGlzXG4gICAgfVxuICAgIGdldCBmb2xkZXIoKSB7cmV0dXJuIENvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXI7fVxufVxuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmxvYWRQbHVnaW5zID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIHRoaXMubG9hZFBsdWdpbkRhdGEoKTtcbiAgICBiZHBsdWdpbkVycm9ycy5zcGxpY2UoMCwgMCwgLi4uKGF3YWl0IENvbnRlbnRNYW5hZ2VyLmxvYWRQbHVnaW5zKCkpKTtcbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmtleXMoYmRwbHVnaW5zKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHBsdWdpbiwgbmFtZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGx1Z2luID0gYmRwbHVnaW5zW3BsdWdpbnNbaV1dLnBsdWdpbjtcbiAgICAgICAgICAgIG5hbWUgPSBwbHVnaW4uZ2V0TmFtZSgpO1xuICAgICAgICAgICAgaWYgKHBsdWdpbi5sb2FkICYmIHR5cGVvZihwbHVnaW4ubG9hZCkgPT0gXCJmdW5jdGlvblwiKSBwbHVnaW4ubG9hZCgpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHBsdWdpbkNvb2tpZVtuYW1lXSA9IGZhbHNlO1xuICAgICAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBuYW1lICsgXCIgY291bGQgbm90IGJlIGxvYWRlZC5cIiwgZXJyKTtcbiAgICAgICAgICAgIGJkcGx1Z2luRXJyb3JzLnB1c2goe25hbWU6IG5hbWUsIGZpbGU6IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5maWxlbmFtZSwgbWVzc2FnZTogXCJsb2FkKCkgY291bGQgbm90IGJlIGZpcmVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVyci5tZXNzYWdlLCBzdGFjazogZXJyLnN0YWNrfX0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBsdWdpbkNvb2tpZVtuYW1lXSkgcGx1Z2luQ29va2llW25hbWVdID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHBsdWdpbkNvb2tpZVtuYW1lXSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwbHVnaW4uc3RhcnQoKTtcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW4uZ2V0TmFtZSgpfSB2JHtwbHVnaW4uZ2V0VmVyc2lvbigpfSBoYXMgc3RhcnRlZC5gKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHBsdWdpbkNvb2tpZVtuYW1lXSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIFV0aWxzLmVycihcIlBsdWdpbnNcIiwgbmFtZSArIFwiIGNvdWxkIG5vdCBiZSBzdGFydGVkLlwiLCBlcnIpO1xuICAgICAgICAgICAgICAgIGJkcGx1Z2luRXJyb3JzLnB1c2goe25hbWU6IG5hbWUsIGZpbGU6IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5maWxlbmFtZSwgbWVzc2FnZTogXCJzdGFydCgpIGNvdWxkIG5vdCBiZSBmaXJlZC5cIiwgZXJyb3I6IHttZXNzYWdlOiBlcnIubWVzc2FnZSwgc3RhY2s6IGVyci5zdGFja319KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwKSlcbiAgICB9XG4gICAgdGhpcy5zYXZlUGx1Z2luRGF0YSgpO1xuXG4gICAgcmVxdWlyZShcImVsZWN0cm9uXCIpLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKS5vbihcImRpZC1uYXZpZ2F0ZS1pbi1wYWdlXCIsIHRoaXMuY2hhbm5lbFN3aXRjaC5iaW5kKHRoaXMpKTtcbiAgICAvLyBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTVcIl0pIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInBsdWdpblwiKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuc3RhcnRQbHVnaW4gPSBmdW5jdGlvbihwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLnN0YXJ0KCk7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldE5hbWUoKX0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gaGFzIHN0YXJ0ZWQuYCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpfSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSBjb3VsZCBub3QgYmUgc3RhcnRlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XG4gICAgICAgIHBsdWdpbkNvb2tpZVtwbHVnaW5dID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBwbHVnaW4gKyBcIiBjb3VsZCBub3QgYmUgc3RhcnRlZC5cIiwgZXJyKTtcbiAgICB9XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnN0b3BQbHVnaW4gPSBmdW5jdGlvbihwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLnN0b3AoKTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpfSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSBoYXMgc3RvcHBlZC5gKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCl9IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IGNvdWxkIG5vdCBiZSBzdG9wcGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcbiAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpICsgXCIgY291bGQgbm90IGJlIHN0b3BwZWQuXCIsIGVycik7XG4gICAgfVxufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5lbmFibGVQbHVnaW4gPSBmdW5jdGlvbiAocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xuICAgIGlmIChwbHVnaW5Db29raWVbcGx1Z2luXSkgcmV0dXJuO1xuICAgIHBsdWdpbkNvb2tpZVtwbHVnaW5dID0gdHJ1ZTtcbiAgICB0aGlzLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgdGhpcy5zdGFydFBsdWdpbihwbHVnaW4sIHJlbG9hZCk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5hYmxlUGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZGlzYWJsZVBsdWdpbiA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgaWYgKCFwbHVnaW5Db29raWVbcGx1Z2luXSkgcmV0dXJuO1xuICAgIHBsdWdpbkNvb2tpZVtwbHVnaW5dID0gZmFsc2U7XG4gICAgdGhpcy5zYXZlUGx1Z2luRGF0YSgpO1xuICAgIHRoaXMuc3RvcFBsdWdpbihwbHVnaW4sIHJlbG9hZCk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS50b2dnbGVQbHVnaW4gPSBmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgaWYgKHBsdWdpbkNvb2tpZVtwbHVnaW5dKSB0aGlzLmRpc2FibGVQbHVnaW4ocGx1Z2luKTtcbiAgICBlbHNlIHRoaXMuZW5hYmxlUGx1Z2luKHBsdWdpbik7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlUGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUubG9hZFBsdWdpbiA9IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lKSB7XG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCBDb250ZW50TWFuYWdlci5sb2FkQ29udGVudChmaWxlbmFtZSwgXCJwbHVnaW5cIik7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IFtlcnJvcl19KTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7ZmlsZW5hbWV9IGNvdWxkIG5vdCBiZSBsb2FkZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7ZmlsZW5hbWV9IGNvdWxkIG5vdCBiZSBsb2FkZWQuYCwgZXJyb3IpO1xuICAgIH1cbiAgICBjb25zdCBwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykuZmluZChwID0+IChjb25zb2xlLmxvZyhwLmZpbGVuYW1lLCBmaWxlbmFtZSkpIHx8IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWUpLnBsdWdpbjtcbiAgICB0cnkgeyBpZiAocGx1Z2luLmxvYWQgJiYgdHlwZW9mKHBsdWdpbi5sb2FkKSA9PSBcImZ1bmN0aW9uXCIpIHBsdWdpbi5sb2FkKCk7fVxuICAgIGNhdGNoIChlcnIpIHtpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBbZXJyXX0pO31cbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW4uZ2V0TmFtZSgpfSB2JHtwbHVnaW4uZ2V0VmVyc2lvbigpfSB3YXMgbG9hZGVkLmApO1xuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbi5nZXROYW1lKCl9IHYke3BsdWdpbi5nZXRWZXJzaW9uKCl9IHdhcyBsb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJwbHVnaW4tbG9hZGVkXCIsIHBsdWdpbi5nZXROYW1lKCkpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS51bmxvYWRQbHVnaW4gPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHBsdWdpbnNbZmlsZW5hbWVPck5hbWVdO1xuICAgIGlmICghYmRwbHVnaW4pIHJldHVybjtcbiAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbi5wbHVnaW4uZ2V0TmFtZSgpO1xuICAgIGlmIChwbHVnaW5Db29raWVbcGx1Z2luXSkgdGhpcy5kaXNhYmxlUGx1Z2luKHBsdWdpbiwgdHJ1ZSk7XG4gICAgY29uc3QgZXJyb3IgPSBDb250ZW50TWFuYWdlci51bmxvYWRDb250ZW50KGJkcGx1Z2luc1twbHVnaW5dLmZpbGVuYW1lLCBcInBsdWdpblwiKTtcbiAgICBkZWxldGUgYmRwbHVnaW5zW3BsdWdpbl07XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IFtlcnJvcl19KTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2lufSBjb3VsZCBub3QgYmUgdW5sb2FkZWQuIEl0IG1heSBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7cGx1Z2lufSBjb3VsZCBub3QgYmUgdW5sb2FkZWQuIEl0IG1heSBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuYCwgZXJyb3IpO1xuICAgIH1cbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW59IHdhcyB1bmxvYWRlZC5gKTtcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW59IHdhcyB1bmxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInBsdWdpbi11bmxvYWRlZFwiLCBwbHVnaW4pO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHBsdWdpbnNbZmlsZW5hbWVPck5hbWVdO1xuICAgIGlmICghYmRwbHVnaW4pIHJldHVybjtcbiAgICB0aGlzLnVubG9hZFBsdWdpbihiZHBsdWdpbi5maWxlbmFtZSk7XG4gICAgY29uc3QgZnVsbFBhdGggPSByZXF1aXJlKFwicGF0aFwiKS5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIsIGJkcGx1Z2luLmZpbGVuYW1lKTtcbiAgICByZXF1aXJlKFwiZnNcIikudW5saW5rU3luYyhmdWxsUGF0aCk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnJlbG9hZFBsdWdpbiA9IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XG4gICAgY29uc3QgYmRwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkcGx1Z2luc1tmaWxlbmFtZU9yTmFtZV07XG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuIHRoaXMubG9hZFBsdWdpbihmaWxlbmFtZU9yTmFtZSk7XG4gICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW4ucGx1Z2luLmdldE5hbWUoKTtcbiAgICBjb25zdCBlbmFibGVkID0gcGx1Z2luQ29va2llW3BsdWdpbl07XG4gICAgaWYgKGVuYWJsZWQpIHRoaXMuc3RvcFBsdWdpbihwbHVnaW4sIHRydWUpO1xuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgQ29udGVudE1hbmFnZXIucmVsb2FkQ29udGVudChiZHBsdWdpbnNbcGx1Z2luXS5maWxlbmFtZSwgXCJwbHVnaW5cIik7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IFtlcnJvcl19KTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2lufSBjb3VsZCBub3QgYmUgcmVsb2FkZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7cGx1Z2lufSBjb3VsZCBub3QgYmUgcmVsb2FkZWQuYCwgZXJyb3IpO1xuICAgIH1cbiAgICBpZiAoYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmxvYWQgJiYgdHlwZW9mKGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5sb2FkKSA9PSBcImZ1bmN0aW9uXCIpIGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5sb2FkKCk7XG4gICAgaWYgKGVuYWJsZWQpIHRoaXMuc3RhcnRQbHVnaW4ocGx1Z2luLCB0cnVlKTtcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW59IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IHdhcyByZWxvYWRlZC5gKTtcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW59IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IHdhcyByZWxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInBsdWdpbi1yZWxvYWRlZFwiLCBwbHVnaW4pO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5yZWxvYWQgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMucmVsb2FkUGx1Z2luKG5hbWUpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5lZGl0ID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcbiAgICBjb25zb2xlLmxvZyhcIkVkaXQgXCIgKyBmaWxlbmFtZU9yTmFtZSk7XG4gICAgY29uc3QgYmRwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkcGx1Z2luc1tmaWxlbmFtZU9yTmFtZV07XG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVxdWlyZShcInBhdGhcIikucmVzb2x2ZShDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyLCBiZHBsdWdpbi5maWxlbmFtZSk7XG4gICAgY29uc29sZS5sb2coXCJFZGl0IFwiICsgZnVsbFBhdGgpO1xuICAgIHJlcXVpcmUoXCJlbGVjdHJvblwiKS5zaGVsbC5vcGVuSXRlbShgJHtmdWxsUGF0aH1gKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUudXBkYXRlUGx1Z2luTGlzdCA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBDb250ZW50TWFuYWdlci5sb2FkTmV3Q29udGVudChcInBsdWdpblwiKTtcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIHJlc3VsdHMuYWRkZWQpIHRoaXMubG9hZFBsdWdpbihmaWxlbmFtZSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHJlc3VsdHMucmVtb3ZlZCkgdGhpcy51bmxvYWRQbHVnaW4obmFtZSk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmxvYWRQbHVnaW5EYXRhID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHNhdmVkID0gRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInBsdWdpbnNcIik7XG4gICAgaWYgKHNhdmVkKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocGx1Z2luQ29va2llLCBzYXZlZCk7XG4gICAgfVxufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5zYXZlUGx1Z2luRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICBEYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwicGx1Z2luc1wiLCBwbHVnaW5Db29raWUpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5uZXdNZXNzYWdlID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHBsdWdpbnMgPSBPYmplY3Qua2V5cyhiZHBsdWdpbnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbnNbcGx1Z2luc1tpXV0ucGx1Z2luO1xuICAgICAgICBpZiAoIXBsdWdpbkNvb2tpZVtwbHVnaW4uZ2V0TmFtZSgpXSkgY29udGludWU7XG4gICAgICAgIGlmICh0eXBlb2YgcGx1Z2luLm9uTWVzc2FnZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0cnkgeyBwbHVnaW4ub25NZXNzYWdlKCk7IH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBcIlVuYWJsZSB0byBmaXJlIG9uTWVzc2FnZSBmb3IgXCIgKyBwbHVnaW4uZ2V0TmFtZSgpICsgXCIuXCIsIGVycik7IH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuY2hhbm5lbFN3aXRjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmtleXMoYmRwbHVnaW5zKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW5zW3BsdWdpbnNbaV1dLnBsdWdpbjtcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbcGx1Z2luLmdldE5hbWUoKV0pIGNvbnRpbnVlO1xuICAgICAgICBpZiAodHlwZW9mIHBsdWdpbi5vblN3aXRjaCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0cnkgeyBwbHVnaW4ub25Td2l0Y2goKTsgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikgeyBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIFwiVW5hYmxlIHRvIGZpcmUgb25Td2l0Y2ggZm9yIFwiICsgcGx1Z2luLmdldE5hbWUoKSArIFwiLlwiLCBlcnIpOyB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnJhd09ic2VydmVyID0gZnVuY3Rpb24oZSkge1xuICAgIGNvbnN0IHBsdWdpbnMgPSBPYmplY3Qua2V5cyhiZHBsdWdpbnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbnNbcGx1Z2luc1tpXV0ucGx1Z2luO1xuICAgICAgICBpZiAoIXBsdWdpbkNvb2tpZVtwbHVnaW4uZ2V0TmFtZSgpXSkgY29udGludWU7XG4gICAgICAgIGlmICh0eXBlb2YgcGx1Z2luLm9ic2VydmVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRyeSB7IHBsdWdpbi5vYnNlcnZlcihlKTsgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikgeyBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIFwiVW5hYmxlIHRvIGZpcmUgb2JzZXJ2ZXIgZm9yIFwiICsgcGx1Z2luLmdldE5hbWUoKSArIFwiLlwiLCBlcnIpOyB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgUGx1Z2luTW9kdWxlKCk7IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCB3ZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi93ZWJwYWNrTW9kdWxlc1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuaW1wb3J0IFYyQ19QdWJsaWNTZXJ2ZXJzIGZyb20gXCIuLi91aS9wdWJsaWNzZXJ2ZXJzL3B1YmxpY1NlcnZlcnNcIjtcclxuaW1wb3J0IExheWVyIGZyb20gXCIuLi91aS9wdWJsaWNzZXJ2ZXJzL2xheWVyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVjJfUHVibGljU2VydmVycyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5fYXBwZW5kQnV0dG9uID0gdGhpcy5fYXBwZW5kQnV0dG9uLmJpbmQodGhpcyk7XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLlYyX1B1YmxpY1NlcnZlcnMgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KExheWVyLCB7cm9vdElkOiBcInB1YnNsYXllcnJvb3RcIiwgaWQ6IFwicHVic2xheWVyXCJ9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVjJDX1B1YmxpY1NlcnZlcnMsIHtyb290SWQ6IFwicHVic2xheWVycm9vdFwifSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByb290KCkge1xyXG4gICAgICAgIGNvbnN0IF9yb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJwdWJzbGF5ZXJyb290XCIpO1xyXG4gICAgICAgIGlmICghX3Jvb3QpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluamVjdFJvb3QoKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfcm9vdDtcclxuICAgIH1cclxuXHJcbiAgICBpbmplY3RSb290KCkge1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZUxheWVyc1xyXG4gICAgICAgIF0gPSBbXHJcbiAgICAgICAgICAgIFV0aWxzLnJlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLmxheWVycyAmJiBlLmxheWVyKVswXS5sYXllcnMpXHJcbiAgICAgICAgXVxyXG4gICAgICAgIGNvbnN0IGxheWVycyA9IERPTS5xdWVyeShcIi5sYXllcnMsIC5cIitjbGFzc05hbWVMYXllcnMpO1xyXG4gICAgICAgIGlmICghbGF5ZXJzKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgbGF5ZXJzLmFwcGVuZChET00uY3JlYXRlRWxlbWVudChcIjxkaXYgaWQ9J3B1YnNsYXllcnJvb3QnPlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3Q7XHJcbiAgICAgICAgaWYgKCFyb290KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRkFJTEVEIFRPIExPQ0FURSBST09UOiAubGF5ZXJzXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKHRoaXMuY29tcG9uZW50LCByb290KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgYnV0dG9uKCkge1xyXG4gICAgICAgIGNvbnN0IGJ0biA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtcHViLWxpXCIgY2xhc3M9XCIke0JEVjIuZ3VpbGRDbGFzc2VzLmxpc3RJdGVtfVwiPmApO1xyXG4gICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtMVwiXSkgYnRuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICBjb25zdCBsYWJlbCA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtcHViLWJ1dHRvblwiIGNsYXNzPVwiJHtcIndyYXBwZXItMjVlVkluIFwiICsgQkRWMi5ndWlsZENsYXNzZXMuY2lyY2xlQnV0dG9uTWFza31cIj5wdWJsaWM8L2Rpdj5gKTtcclxuICAgICAgICBsYWJlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge3RoaXMucmVuZGVyKCk7fSk7XHJcbiAgICAgICAgYnRuLmFwcGVuZChsYWJlbCk7XHJcbiAgICAgICAgcmV0dXJuIGJ0bjtcclxuICAgIH1cclxuXHJcbiAgICBfYXBwZW5kQnV0dG9uKCkge1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZXR1dG9yaWFsQ29udGFpbmVyXHJcbiAgICAgICAgXSA9IFtcclxuICAgICAgICAgICAgVXRpbHMucmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuZG93bmxvYWRQcm9ncmVzcyAmJiBlLnR1dG9yaWFsQ29udGFpbmVyKVswXS50dXRvcmlhbENvbnRhaW5lcilcclxuICAgICAgICBdXHJcbiAgICAgICAgaWYgKERPTS5xdWVyeShcIiNiZC1wdWItbGlcIikpIHJldHVybjtcclxuICAgICAgICBjb25zdCBndWlsZHMgPSBET00ucXVlcnkoYGRpdi4ke2NsYXNzTmFtZXR1dG9yaWFsQ29udGFpbmVyfSA+IGRpdmApO1xyXG4gICAgICAgIERPTS5hZnRlcihndWlsZHMsIHRoaXMuYnV0dG9uKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRCdXR0b24oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3VpbGRQYXRjaCkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IEd1aWxkTGlzdCA9IHdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHQgJiYgbS5kZWZhdWx0LmRpc3BsYXlOYW1lID09IFwiTmF2aWdhYmxlR3VpbGRzXCIpO1xyXG4gICAgICAgIGNvbnN0IEd1aWxkTGlzdE9sZCA9IHdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiR3VpbGRzXCIpO1xyXG4gICAgICAgIGlmICghR3VpbGRMaXN0ICYmICFHdWlsZExpc3RPbGQpIFV0aWxzLndhcm4oXCJQdWJsaWNTZXJ2ZXJcIiwgXCJDYW4ndCBmaW5kIEd1aWxkTGlzdCBjb21wb25lbnRcIik7XHJcbiAgICAgICAgdGhpcy5ndWlsZFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goR3VpbGRMaXN0ID8gR3VpbGRMaXN0IDogR3VpbGRMaXN0T2xkLnByb3RvdHlwZSwgR3VpbGRMaXN0ID8gXCJkZWZhdWx0XCIgOiBcInJlbmRlclwiLCB7YWZ0ZXI6IHRoaXMuX2FwcGVuZEJ1dHRvbn0pO1xyXG4gICAgICAgIHRoaXMuX2FwcGVuZEJ1dHRvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUJ1dHRvbigpIHtcclxuICAgICAgICB0aGlzLmd1aWxkUGF0Y2goKTtcclxuICAgICAgICBkZWxldGUgdGhpcy5ndWlsZFBhdGNoO1xyXG4gICAgICAgIGNvbnN0IGJ1dHRvbiA9IERPTS5xdWVyeShcIiNiZC1wdWItbGlcIik7XHJcbiAgICAgICAgaWYgKGJ1dHRvbikgYnV0dG9uLnJlbW92ZSgpO1xyXG4gICAgfVxyXG59OyIsImltcG9ydCB7c2V0dGluZ3MsIHNldHRpbmdzQ29va2llLCBzZXR0aW5nc1JQQ30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBWMl9TZXR0aW5nc1BhbmVsX1NpZGViYXIgZnJvbSBcIi4vc2V0dGluZ3NQYW5lbFNpZGViYXJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgY29sb3JlZFRleHQgZnJvbSBcIi4vY29sb3JlZFRleHRcIjtcclxuaW1wb3J0IHRmSG91ciBmcm9tIFwiLi8yNGhvdXJcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuaW1wb3J0IHB1YmxpY1NlcnZlcnNNb2R1bGUgZnJvbSBcIi4vcHVibGljU2VydmVyc1wiO1xyXG5pbXBvcnQgdm9pY2VNb2RlIGZyb20gXCIuL3ZvaWNlTW9kZVwiO1xyXG5pbXBvcnQgQ2xhc3NOb3JtYWxpemVyIGZyb20gXCIuL2NsYXNzTm9ybWFsaXplclwiO1xyXG5pbXBvcnQgZE1vZGUgZnJvbSBcIi4vZGV2TW9kZVwiO1xyXG5cclxuaW1wb3J0IFNlY3Rpb25lZFNldHRpbmdzUGFuZWwgZnJvbSBcIi4uL3VpL3NlY3Rpb25lZFNldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IENzc0VkaXRvciBmcm9tIFwiLi4vdWkvY3NzRWRpdG9yXCI7XHJcbmltcG9ydCBDYXJkTGlzdCBmcm9tIFwiLi4vdWkvYWRkb25saXN0XCI7XHJcbmltcG9ydCBWMkNfUHJlc2VuY2VTZXR0aW5ncyBmcm9tIFwiLi4vdWkvcHJlc2VuY2VTZXR0aW5nc1wiO1xyXG5pbXBvcnQgQ3VzdG9tUmljaFByZXNlbmNlIGZyb20gXCIuL0N1c3RvbVJpY2hQcmVzZW5jZVwiO1xyXG5pbXBvcnQgVjJDX0FjY291bnRJbmZvcyBmcm9tIFwiLi4vdWkvQWNjb3VudEluZm9zXCI7XHJcbmltcG9ydCB7IHJlbW90ZSB9IGZyb20gXCJlbGVjdHJvblwiO1xyXG5pbXBvcnQgQW50aUFkRE0gZnJvbSBcIi4vQW50aUFkRE1cIjtcclxuaW1wb3J0IGJsdXJQcml2YXRlIGZyb20gXCIuL2JsdXJQcml2YXRlXCI7XHJcbmltcG9ydCBkaXNhYmxlVHlwaW5nIGZyb20gXCIuL2Rpc2FibGVUeXBpbmdcIjtcclxuaW1wb3J0IEFwaVByZXZpZXcgZnJvbSBcIi4uL3VpL0FwaVByZXZpZXdcIjtcclxuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi4vdWkvc3dpdGNoXCI7XHJcbmltcG9ydCBNYXJnaW5Ub3AgZnJvbSBcIi4uL3VpL21hcmdpbnRvcFwiO1xyXG5pbXBvcnQgd2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuaW1wb3J0IHRvb2x0aXBXcmFwIGZyb20gXCIuLi91aS90b29sdGlwV3JhcFwiO1xyXG5pbXBvcnQgSGlzdG9yeSBmcm9tIFwiLi4vdWkvaWNvbnMvaGlzdG9yeVwiO1xyXG5pbXBvcnQgY29yZSBmcm9tIFwiLi9jb3JlXCI7XHJcblxyXG5jbGFzcyBCRFNpZGViYXJIZWFkZXIgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBzaWRlYmFyQ29tcG9uZW50cyA9IHdlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLlNlcGFyYXRvciAmJiBlLkhlYWRlciAmJiBlLkl0ZW0pXHJcblxyXG4gICAgICAgIGNvbnN0IGNoYW5nZWxvZ0J1dHRvbiA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQodG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkNoYW5nZWxvZ1wifSwgXHJcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtzdHlsZToge2Zsb2F0OiBcInJpZ2h0XCIsIGN1cnNvcjogXCJwb2ludGVyXCJ9LCBjbGFzc05hbWU6IFwiYmQtY2hhbmdlbG9nLWJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7VXRpbHMuc2hvd0NoYW5nZWxvZ01vZGFsKGJiZENoYW5nZWxvZyk7fX0sXHJcbiAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KEhpc3RvcnksIHtjbGFzc05hbWU6IFwiYmQtaWNvblwiLCBzaXplOiBcIjE2cHhcIn0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgICAgIGxldCByZW5kZXJlZCA9IG5ldyBzaWRlYmFyQ29tcG9uZW50cy5IZWFkZXIoe1xyXG4gICAgICAgICAgICBjaGlsZHJlbjogUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgXCJCYW5kYWdlZCBCRFwiLCBjaGFuZ2Vsb2dCdXR0b24pLFxyXG4gICAgICAgICAgICBjbGFzc05hbWU6IFwidWktdGFiLWJhci1oZWFkZXJcIlxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmV0dXJuIHJlbmRlcmVkXHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCBpc0NsZWFyaW5nQ2FjaGUgPSBmYWxzZVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFYyX1NldHRpbmdzUGFuZWwge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTZXR0aW5ncyA9IHRoaXMudXBkYXRlU2V0dGluZ3MuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNpZGViYXIgPSBuZXcgVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyKCk7XHJcblxyXG4gICAgICAgIHRoaXMucmVnaXN0ZXJDb21wb25lbnRzKClcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3RlckNvbXBvbmVudHMoKXtcclxuICAgICAgICAvKiogTGlnaHRjb3JkICovXHJcbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwibGlnaHRjb3JkXCIsIG1ha2VDb21wb25lbnQodGhpcy5saWdodGNvcmRDb21wb25lbnQuYmluZCh0aGlzKSkpXHJcbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwic3RhdHVzXCIsIG1ha2VDb21wb25lbnQodGhpcy5QcmVzZW5jZUNvbXBvbmVudC5iaW5kKHRoaXMpKSlcclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJhY2NvdW50aW5mb1wiLCBtYWtlQ29tcG9uZW50KHRoaXMuQWNjb3VudEluZm9zQ29tcG9uZW50LmJpbmQodGhpcykpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcImxjYXBpcHJldmlld1wiLCBtYWtlQ29tcG9uZW50KHRoaXMuQXBpUHJldmlld0NvbXBvbmVudC5iaW5kKHRoaXMpKSlcclxuXHJcbiAgICAgICAgLyogQmFuZGFnZWQgQkQgKi9cclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJCRENoYW5nZWxvZ1RpdGxlXCIsIG1ha2VDb21wb25lbnQoKCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IEJEU2lkZWJhckhlYWRlcigpLnJlbmRlcigpXHJcbiAgICAgICAgfSkpXHJcbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwiY29yZVwiLCBtYWtlQ29tcG9uZW50KHRoaXMuY29yZUNvbXBvbmVudC5iaW5kKHRoaXMpKSlcclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJjdXN0b21jc3NcIiwgbWFrZUNvbXBvbmVudCh0aGlzLmN1c3RvbUNzc0NvbXBvbmVudC5iaW5kKHRoaXMpKSlcclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJwbHVnaW5zXCIsIG1ha2VDb21wb25lbnQodGhpcy5yZW5kZXJBZGRvblBhbmUoXCJwbHVnaW5zXCIpKSlcclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJ0aGVtZXNcIiwgbWFrZUNvbXBvbmVudCh0aGlzLnJlbmRlckFkZG9uUGFuZShcInRoZW1lc1wiKSkpXHJcbiAgICB9XHJcbiAgICBcclxuICAgIGdldCBjb3JlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLmdldFNldHRpbmdzKFwiY29yZVwiKTtcclxuICAgICAgICBjb25zdCBjYXRlZ29yaWVzID0gWy4uLm5ldyBTZXQoc2V0dGluZ3MubWFwKHMgPT4gcy5jYXRlZ29yeSkpXTtcclxuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGNhdGVnb3JpZXMubWFwKGMgPT4ge3JldHVybiB7dGl0bGU6IGMsIHNldHRpbmdzOiBzZXR0aW5ncy5maWx0ZXIocyA9PiBzLmNhdGVnb3J5ID09IGMpfTt9KTtcclxuICAgICAgICByZXR1cm4gc2VjdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxpZ2h0Y29yZFNldHRpbmdzKCkge1xyXG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5nZXRTZXR0aW5ncyhcImxpZ2h0Y29yZFwiKTtcclxuICAgICAgICBjb25zdCBjYXRlZ29yaWVzID0gWy4uLm5ldyBTZXQoc2V0dGluZ3MubWFwKHMgPT4gcy5jYXRlZ29yeSkpXTtcclxuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGNhdGVnb3JpZXMubWFwKGMgPT4ge3JldHVybiB7dGl0bGU6IGMsIHNldHRpbmdzOiBzZXR0aW5ncy5maWx0ZXIocyA9PiBzLmNhdGVnb3J5ID09IGMpfTt9KTtcclxuICAgICAgICByZXR1cm4gc2VjdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IFByZXNlbmNlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2V0dGluZ3MoXCJzdGF0dXNcIilcclxuICAgIH1cclxuXHJcbiAgICBnZXRTZXR0aW5ncyhjYXRlZ29yeSkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhzZXR0aW5ncykucmVkdWNlKChhcnIsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nID0gc2V0dGluZ3Nba2V5XTtcclxuICAgICAgICAgICAgaWYgKHNldHRpbmcuY2F0ID09PSBjYXRlZ29yeSAmJiBzZXR0aW5nLmltcGxlbWVudGVkICYmICFzZXR0aW5nLmhpZGRlbikge1xyXG4gICAgICAgICAgICAgICAgc2V0dGluZy50ZXh0ID0ga2V5O1xyXG4gICAgICAgICAgICAgICAgYXJyLnB1c2goc2V0dGluZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGFycjtcclxuICAgICAgICB9LCBbXSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIG9uQ2hhbmdlKGlkLCBjaGVja2VkLCBzaWRlYmFyKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTZXR0aW5ncyhpZCwgY2hlY2tlZCwgc2lkZWJhcik7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlU2V0dGluZ3MoaWQsIGVuYWJsZWQsIHNpZGViYXIpIHtcclxuICAgICAgICBpZighW1wibGlnaHRjb3JkLThcIiwgXCJub193aW5kb3dfYm91bmRcIiwgXCJlbmFibGVfZ2xhc3N0cm9uXCIsIFwibGlnaHRjb3JkLTEwXCJdLmluY2x1ZGVzKGlkKSlzZXR0aW5nc0Nvb2tpZVtpZF0gPSBlbmFibGVkO1xyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtMlwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsXCIpO1xyXG4gICAgICAgICAgICBlbHNlIERPTS5yZW1vdmVDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWxcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtM1wiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsLWNoYW5cIik7XHJcbiAgICAgICAgICAgIGVsc2UgRE9NLnJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbC1jaGFuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgcHVibGljU2VydmVyc01vZHVsZS5hZGRCdXR0b24oKTtcclxuICAgICAgICAgICAgZWxzZSBwdWJsaWNTZXJ2ZXJzTW9kdWxlLnJlbW92ZUJ1dHRvbigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTRcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgdm9pY2VNb2RlLnN0YXJ0KCk7XHJcbiAgICAgICAgICAgIGVsc2Ugdm9pY2VNb2RlLnN0b3AoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy01XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIERPTS5hZGRDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkYS1kYXJrXCIpO1xyXG4gICAgICAgICAgICBlbHNlIERPTS5yZW1vdmVDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkYS1kYXJrXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVuYWJsZWQgJiYgaWQgPT0gXCJiZGEtZ3MtNlwiKSB0ZkhvdXIuaW5qZWN0MjRIb3VyKCk7XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy03XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIGNvbG9yZWRUZXh0LmluamVjdENvbG9yZWRUZXh0KCk7XHJcbiAgICAgICAgICAgIGVsc2UgY29sb3JlZFRleHQucmVtb3ZlQ29sb3JlZFRleHQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImZvcmstcHMtNFwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBDbGFzc05vcm1hbGl6ZXIuc3RhcnQoKTtcclxuICAgICAgICAgICAgZWxzZSBDbGFzc05vcm1hbGl6ZXIuc3RvcCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiZm9yay1wcy01XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInBsdWdpblwiKTtcclxuICAgICAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgQ29udGVudE1hbmFnZXIudW53YXRjaENvbnRlbnQoXCJwbHVnaW5cIik7XHJcbiAgICAgICAgICAgICAgICBDb250ZW50TWFuYWdlci51bndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJmb3JrLXdwLTFcIikge1xyXG4gICAgICAgICAgICBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKFwidHJhbnNwYXJlbnRcIiwgZW5hYmxlZCk7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKFwiYmFja2dyb3VuZENvbG9yXCIsIG51bGwpO1xyXG4gICAgICAgICAgICBlbHNlIFV0aWxzLnNldFdpbmRvd1ByZWZlcmVuY2UoXCJiYWNrZ3JvdW5kQ29sb3JcIiwgXCIjMmYzMTM2XCIpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy04XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIGRNb2RlLnN0YXJ0RGVidWdMaXN0ZW5lcigpO1xyXG4gICAgICAgICAgICBlbHNlIGRNb2RlLnN0b3BEZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJmb3JrLWRtLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgZE1vZGUuc3RhcnRDb3B5U2VsZWN0b3IoKTtcclxuICAgICAgICAgICAgZWxzZSBkTW9kZS5zdG9wQ29weVNlbGVjdG9yKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT09IFwicmVhY3REZXZUb29sc1wiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSByZWFjdERldlRvb2xzLnN0YXJ0KCk7XHJcbiAgICAgICAgICAgIGVsc2UgcmVhY3REZXZUb29scy5zdG9wKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtMVwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmRldk1vZGUgPSB0cnVlXHJcbiAgICAgICAgICAgIGVsc2Ugd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5kZXZNb2RlID0gZmFsc2VcclxuICAgICAgICAgICAgc2lkZWJhci5mb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtMlwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmNhbGxSaW5naW5nQmVhdCA9IHRydWVcclxuICAgICAgICAgICAgZWxzZSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmNhbGxSaW5naW5nQmVhdCA9IGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB7XHJcbiAgICAgICAgICAgICAgICBDdXN0b21SaWNoUHJlc2VuY2UuZW5hYmxlKClcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzU3RvcmUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIHR5cGVvZiBlLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgJiYgXCJzaG93Q3VycmVudEdhbWVcIiBpbiBlLmRlZmF1bHQpWzBdXHJcbiAgICAgICAgICAgICAgICBpZihzZXR0aW5nc1N0b3JlICYmICFzZXR0aW5nc1N0b3JlLmRlZmF1bHQuc2hvd0N1cnJlbnRHYW1lKXtcclxuICAgICAgICAgICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC51cGRhdGVSZW1vdGVTZXR0aW5ncylbMF0uZGVmYXVsdC51cGRhdGVSZW1vdGVTZXR0aW5ncyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDdXJyZW50R2FtZTogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBDdXN0b21SaWNoUHJlc2VuY2UuZGlzYWJsZSgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtM1wiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpLnNldEFsd2F5c09uVG9wKHRydWUpXHJcbiAgICAgICAgICAgIGVsc2UgcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKS5zZXRBbHdheXNPblRvcChmYWxzZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC00XCIpIHtcclxuICAgICAgICAgICAgaWYoZW5hYmxlZCl7XHJcbiAgICAgICAgICAgICAgICBBbnRpQWRETS5lbmFibGUoKVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIEFudGlBZERNLmRpc2FibGUoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtNlwiKSB7XHJcbiAgICAgICAgICAgIGlmKGVuYWJsZWQpe1xyXG4gICAgICAgICAgICAgICAgYmx1clByaXZhdGUuZW5hYmxlKClcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBibHVyUHJpdmF0ZS5kaXNhYmxlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTdcIikge1xyXG4gICAgICAgICAgICBpZihlbmFibGVkKXtcclxuICAgICAgICAgICAgICAgIGRpc2FibGVUeXBpbmcuZW5hYmxlKClcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlVHlwaW5nLmRpc2FibGUoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtOFwiKXtcclxuICAgICAgICAgICAgbGV0IGFwcFNldHRpbmdzID0gcmVtb3RlLmdldEdsb2JhbChcImFwcFNldHRpbmdzXCIpXHJcbiAgICAgICAgICAgIGFwcFNldHRpbmdzLnNldChcImlzVGFic1wiLCBlbmFibGVkKVxyXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zYXZlKClcclxuICAgICAgICAgICAgcmVtb3RlLmFwcC5yZWxhdW5jaCgpXHJcbiAgICAgICAgICAgIHJlbW90ZS5hcHAuZXhpdCgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtMTBcIil7XHJcbiAgICAgICAgICAgIGNvcmUubWV0aG9kcy5Ob3RpZmljYXRpb25zVXNlU2hpbShlbmFibGVkKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcIm5vX3dpbmRvd19ib3VuZFwiKXtcclxuICAgICAgICAgICAgbGV0IGFwcFNldHRpbmdzID0gcmVtb3RlLmdldEdsb2JhbChcImFwcFNldHRpbmdzXCIpXHJcbiAgICAgICAgICAgIGFwcFNldHRpbmdzLnNldChcIk5PX1dJTkRPV1NfQk9VTkRcIiwgZW5hYmxlZClcclxuXHJcbiAgICAgICAgICAgIGFwcFNldHRpbmdzLmRlbGV0ZShcIklTX01BWElNSVpFRFwiKVxyXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5kZWxldGUoXCJJU19NSU5JTUlaRURcIikgXHJcbiAgICAgICAgICAgIGFwcFNldHRpbmdzLmRlbGV0ZShcIldJTkRPV19CT1VORFNcIilcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGFwcFNldHRpbmdzLnNhdmUoKVxyXG4gICAgICAgICAgICByZW1vdGUuYXBwLnJlbGF1bmNoKClcclxuICAgICAgICAgICAgcmVtb3RlLmFwcC5leGl0KClcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcImVuYWJsZV9nbGFzc3Ryb25cIil7XHJcbiAgICAgICAgICAgIGxldCBhcHBTZXR0aW5ncyA9IHJlbW90ZS5nZXRHbG9iYWwoXCJhcHBTZXR0aW5nc1wiKVxyXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zZXQoXCJHTEFTU1RST05cIiwgZW5hYmxlZClcclxuICAgICAgICAgICAgYXBwU2V0dGluZ3Muc2F2ZSgpXHJcbiAgICAgICAgICAgIHJlbW90ZS5hcHAucmVsYXVuY2goKVxyXG4gICAgICAgICAgICByZW1vdGUuYXBwLmV4aXQoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0aWFsaXplU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llLnJlYWN0RGV2VG9vbHMpIHJlYWN0RGV2VG9vbHMuc3RhcnQoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtMlwiXSkgRE9NLmFkZENsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbFwiKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtM1wiXSkgRE9NLmFkZENsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbC1jaGFuXCIpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy0xXCJdKSBwdWJsaWNTZXJ2ZXJzTW9kdWxlLmFkZEJ1dHRvbigpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy00XCJdKSB2b2ljZU1vZGUuc3RhcnQoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtNVwiXSkgRE9NLmFkZENsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmRhLWRhcmtcIik7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTZcIl0pIHRmSG91ci5pbmplY3QyNEhvdXIoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtN1wiXSkgY29sb3JlZFRleHQuaW5qZWN0Q29sb3JlZFRleHQoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTRcIl0pIENsYXNzTm9ybWFsaXplci5zdGFydCgpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC0xXCJdKSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmRldk1vZGUgPSB0cnVlXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTJcIl0pIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuY2FsbFJpbmdpbmdCZWF0ID0gdHJ1ZVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC1wcmVzZW5jZS0xXCJdKSBDdXN0b21SaWNoUHJlc2VuY2UuZW5hYmxlKClcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtM1wiXSkgcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKS5zZXRBbHdheXNPblRvcCh0cnVlKVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC00XCJdKSBBbnRpQWRETS5lbmFibGUoKVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC02XCJdKSBibHVyUHJpdmF0ZS5lbmFibGUoKVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC03XCJdKSBkaXNhYmxlVHlwaW5nLmVuYWJsZSgpXHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSkge1xyXG4gICAgICAgICAgICBDb250ZW50TWFuYWdlci53YXRjaENvbnRlbnQoXCJwbHVnaW5cIik7XHJcbiAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLThcIl0pIGRNb2RlLnN0YXJ0RGVidWdMaXN0ZW5lcigpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstZG0tMVwiXSkgZE1vZGUuc3RhcnRDb3B5U2VsZWN0b3IoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBzYXZlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIsIHNldHRpbmdzQ29va2llKTtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwicnBjXCIsIHNldHRpbmdzUlBDKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5nc0Nvb2tpZSwgRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIpKTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzUlBDLCBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJTaWRlYmFyKHNpZGViYXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zaWRlYmFyLnJlbmRlcihzaWRlYmFyKTtcclxuICAgIH1cclxuXHJcbiAgICBjb3JlQ29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VjdGlvbmVkU2V0dGluZ3NQYW5lbCwge2tleTogXCJjc3BhbmVsXCIsIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLCBzZWN0aW9uczogdGhpcy5jb3JlU2V0dGluZ3N9KVxyXG4gICAgfVxyXG5cclxuICAgIGxpZ2h0Y29yZENvbXBvbmVudChzaWRlYmFyLCBmb3JjZVVwZGF0ZSkge1xyXG4gICAgICAgIGxldCBhcHBTZXR0aW5ncyA9IHJlbW90ZS5nZXRHbG9iYWwoXCJhcHBTZXR0aW5nc1wiKVxyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHRoaXMubGlnaHRjb3JkU2V0dGluZ3MubWFwKChzZWN0aW9uLCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICAgICAgICAgIChpID09PSAwID8gbnVsbCA6IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChNYXJnaW5Ub3ApKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoMlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGl0bGUgaDIgbWFyZ2luLXJlc2V0IG1hcmdpbi1ib3R0b20tMjBcIn0sIHNlY3Rpb24udGl0bGUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uc2V0dGluZ3MubWFwKHNldHRpbmcgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNDaGVja2VkID0gc2V0dGluZ3NDb29raWVbc2V0dGluZy5pZF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0dGluZy5pZCA9PT0gXCJsaWdodGNvcmQtOFwiKWlzQ2hlY2tlZCA9IGFwcFNldHRpbmdzLmdldChcImlzVGFic1wiLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldHRpbmcuaWQgPT09IFwibm9fd2luZG93X2JvdW5kXCIpaXNDaGVja2VkID0gYXBwU2V0dGluZ3MuZ2V0KFwiTk9fV0lORE9XU19CT1VORFwiLCBmYWxzZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0dGluZy5pZCA9PT0gXCJlbmFibGVfZ2xhc3N0cm9uXCIpaXNDaGVja2VkID0gYXBwU2V0dGluZ3MuZ2V0KFwiR0xBU1NUUk9OXCIsIHRydWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldHRpbmcuaWQgPT09IFwibGlnaHRjb3JkLTEwXCIpaXNDaGVja2VkID0gIWFwcFNldHRpbmdzLmdldChcIkRFRkFVTFRfTk9USUZJQ0FUSU9OU1wiLCB0cnVlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmV0dXJuVmFsdWUgPSBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU3dpdGNoLCB7aWQ6IHNldHRpbmcuaWQsIGtleTogc2V0dGluZy5pZCwgZGF0YTogc2V0dGluZywgY2hlY2tlZDogaXNDaGVja2VkLCBvbkNoYW5nZTogKGlkLCBjaGVja2VkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKGlkLCBjaGVja2VkLCBzaWRlYmFyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfX0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldHRpbmcuaWQgPT0gXCJsaWdodGNvcmQtOFwiICYmIGlzQ2hlY2tlZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFwiZ3JlZW5cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vazogXCJvdXRsaW5lZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBcInNtYWxsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdmVyQ29sb3I6IFwiYnJhbmRcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY29yZE5hdGl2ZS5pcGMuc2VuZChcIk5FV19UQUJcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlcjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFwiT3BlbiBhIG5ldyBUYWJcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWVcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9KSwgXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24sIHtcclxuICAgICAgICAgICAgICAgIGNvbG9yOiBcInllbGxvd1wiLFxyXG4gICAgICAgICAgICAgICAgbG9vazogXCJnaG9zdFwiLFxyXG4gICAgICAgICAgICAgICAgc2l6ZTogXCJtZWRpdW1cIixcclxuICAgICAgICAgICAgICAgIGhvdmVyQ29sb3I6IFwicmVkXCIsXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrKCl7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJTaG91bGQgcmVsYXVuY2hcIilcclxuICAgICAgICAgICAgICAgICAgICByZW1vdGUuYXBwLnJlbGF1bmNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogcmVtb3RlLnByb2Nlc3MuYXJndi5zbGljZSgxKS5jb25jYXQoW1wiLS1kaXNhYmxlLWJldHRlcmRpc2NvcmRcIl0pXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICByZW1vdGUuYXBwLnF1aXQoKVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHdyYXBwZXI6IHRydWVcclxuICAgICAgICAgICAgfSwgXCJSZWxhdW5jaCB3aXRob3V0IEJldHRlckRpc2NvcmRcIiksXHJcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24sIHtcclxuICAgICAgICAgICAgICAgIGNvbG9yOiBcInllbGxvd1wiLFxyXG4gICAgICAgICAgICAgICAgbG9vazogXCJnaG9zdFwiLFxyXG4gICAgICAgICAgICAgICAgc2l6ZTogXCJtZWRpdW1cIixcclxuICAgICAgICAgICAgICAgIGhvdmVyQ29sb3I6IFwicmVkXCIsXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoaXNDbGVhcmluZ0NhY2hlKXJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgIGlzQ2xlYXJpbmdDYWNoZSA9IHRydWVcclxuICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJDbGVhcmluZyBjYWNoZS4uLlwiLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaW5mb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICBmb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpLnNlc3Npb24uY2xlYXJDYWNoZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJDYWNoZSBpcyBjbGVhcmVkICFcIiwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdWNjZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDbGVhcmluZ0NhY2hlID0gZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkLiBDaGVjayBjb25zb2xlIGZvciBtb3JlIGluZm9ybWF0aW9ucy5cIiwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJlcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2xlYXJpbmdDYWNoZSA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlVXBkYXRlKClcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHdyYXBwZXI6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogaXNDbGVhcmluZ0NhY2hlXHJcbiAgICAgICAgICAgIH0sIFwiQ2xlYXIgY2FjaGVcIilcclxuICAgICAgICBdXHJcbiAgICB9XHJcblxyXG4gICAgUHJlc2VuY2VDb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChWMkNfUHJlc2VuY2VTZXR0aW5ncywge1xyXG4gICAgICAgICAgICBrZXk6IFwibHBwYW5uZWxcIixcclxuICAgICAgICAgICAgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIFxyXG4gICAgICAgICAgICBzZXR0aW5nczogdGhpcy5QcmVzZW5jZVNldHRpbmdzXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBBY2NvdW50SW5mb3NDb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChWMkNfQWNjb3VudEluZm9zLCB7XHJcbiAgICAgICAgICAgIGtleTogXCJsYXBhbm5lbFwiXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBBcGlQcmV2aWV3Q29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQXBpUHJldmlldywge1xyXG4gICAgICAgICAgICBrZXk6IFwibGFwaXBhbm5lbFwiXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBjdXN0b21Dc3NDb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDc3NFZGl0b3IsIHtrZXk6IFwiY3NzZWRpdG9yXCJ9KVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlckFkZG9uUGFuZSh0eXBlKSB7XHJcbiAgICAgICAgLy8gSSBrbm93IHRoaXMgc2hvdWxkbid0IGJlIGhlcmUsIGJ1dCB3aGVuIGl0IGlzbid0LFxyXG4gICAgICAgIC8vIFJlYWN0IHJlZnVzZXMgdG8gY2hhbmdlIHRoZSBidXR0b24gd2hlbiBnb2luZ1xyXG4gICAgICAgIC8vIGJldHdlZW4gcGx1Z2lucyBhbmQgdGhlbWVzIHBhZ2UuLi4gc29tZXRoaW5nXHJcbiAgICAgICAgLy8gdG8gZGVidWcgbGF0ZXIuXHJcbiAgICAgICAgY2xhc3MgQ29udGVudExpc3QgZXh0ZW5kcyBCRFYyLnJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByZWZpeCA9IHRoaXMucHJvcHMudHlwZS5yZXBsYWNlKFwic1wiLCBcIlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICBvbkNoYW5nZSgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UodGhpcy5wcm9wcy50eXBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICByZW5kZXIoKSB7cmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47fVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvcmlnaW5hbFJlbmRlciA9IENvbnRlbnRMaXN0LnByb3RvdHlwZS5yZW5kZXI7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnRlbnRMaXN0LnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xyXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbigpIHtjb25zb2xlLndhcm4oXCJBZGRvbiBwb2xpY3kgZm9yIHBsdWdpbnMgIzUgaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC93aWtpL0FkZG9uLVBvbGljaWVzI3BsdWdpbnNcIik7fSxcclxuICAgICAgICAgICAgZ2V0OiAoKSA9PiBvcmlnaW5hbFJlbmRlclxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENvbnRlbnRMaXN0LCB7dHlwZX0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDYXJkTGlzdCwge3R5cGV9KSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxyXG4vKipcclxuICogTm8gbmVlZCB0byBleHBvcnQgc2V0dGluZ3NQYW5lbCBvbiB3aW5kb3dcclxuICovXHJcblxyXG5mdW5jdGlvbiBtYWtlQ29tcG9uZW50KGNoaWxkcmVuKXtcclxuICAgIGNsYXNzIFNldHRpbmdDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgICAgIHJlbmRlcigpe1xyXG4gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW4oc2lkZWJhciwgKCkgPT4gdGhpcy5mb3JjZVVwZGF0ZSgpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBzaWRlYmFyXHJcbiAgICByZXR1cm4gKHMpID0+IHtcclxuICAgICAgICBzaWRlYmFyID0gc1xyXG4gICAgICAgIHJldHVybiBTZXR0aW5nQ29tcG9uZW50XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBWMl9TZXR0aW5nc1BhbmVsX1NpZGViYXIge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMucGFuZWxzID0ge31cclxuICAgIH1cclxuXHJcbiAgICByZWdpc3RlcihwYW5lbCwgY29tcG9uZW50KXtcclxuICAgICAgICB0aGlzLnBhbmVsc1twYW5lbF0gPSBjb21wb25lbnRcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb21wb25lbnQocGFuZWwsIHNpZGViYXIpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBhbmVsc1twYW5lbF0oc2lkZWJhcilcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXRlbXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIFt7XHJcbiAgICAgICAgICAgIHRleHQ6IFwiQmV0dGVyRGlzY29yZCBTZXR0aW5nc1wiLCBcclxuICAgICAgICAgICAgaWQ6IFwiY29yZVwiXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICB0ZXh0OiBcIlBsdWdpbnNcIiwgXHJcbiAgICAgICAgICAgIGlkOiBcInBsdWdpbnNcIlxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgdGV4dDogXCJUaGVtZXNcIiwgXHJcbiAgICAgICAgICAgIGlkOiBcInRoZW1lc1wiXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICB0ZXh0OiBcIkN1c3RvbSBDU1NcIiwgXHJcbiAgICAgICAgICAgIGlkOiBcImN1c3RvbWNzc1wiXHJcbiAgICAgICAgfV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IExDaXRlbXMoKXtcclxuICAgICAgICBsZXQgaXRlbXMgPSBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRleHQ6IFwiTGlnaHRjb3JkIFNldHRpbmdzXCIsXHJcbiAgICAgICAgICAgICAgICBpZDogXCJsaWdodGNvcmRcIlxyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIlJpY2hQcmVzZW5jZVwiLCBcclxuICAgICAgICAgICAgICAgIGlkOiBcInN0YXR1c1wiXHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIHRleHQ6IFwiQWNjb3VudCBJbmZvXCIsXHJcbiAgICAgICAgICAgICAgICBpZDogXCJhY2NvdW50aW5mb1wiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IExDRGV2SXRlbXMoKXtcclxuICAgICAgICBsZXQgaXRlbXMgPSBbXVxyXG4gICAgICAgIGlmKCF3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmRldk1vZGUpcmV0dXJuIGl0ZW1zXHJcbiAgICAgICAgaXRlbXMucHVzaCguLi5bXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNlY3Rpb246IFwiRElWSURFUlwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNlY3Rpb246IFwiSEVBREVSXCIsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogXCJMaWdodGNvcmQgQXBpXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGV4dDogXCJDb21wb25lbnRzIFByZXZpZXdcIixcclxuICAgICAgICAgICAgICAgIGlkOiBcImxjYXBpcHJldmlld1wiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdKVxyXG4gICAgICAgIHJldHVybiBpdGVtc1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcihzaWRlYmFyKSB7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJIRUFERVJcIixcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBcIkxpZ2h0Y29yZFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIC4uLnRoaXMuTENpdGVtcy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246IGUuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGUudGV4dCxcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmdldENvbXBvbmVudChlLmlkLCBzaWRlYmFyKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgLi4udGhpcy5MQ0Rldkl0ZW1zLm1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKGUuc2VjdGlvbilyZXR1cm4gZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uOiBlLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBlLnRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogdGhpcy5nZXRDb21wb25lbnQoZS5pZCwgc2lkZWJhcilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNlY3Rpb246IFwiRElWSURFUlwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNlY3Rpb246IFwiQ1VTVE9NXCIsXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmdldENvbXBvbmVudChcIkJEQ2hhbmdlbG9nVGl0bGVcIilcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgLi4udGhpcy5pdGVtcy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246IGUuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGUudGV4dCxcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmdldENvbXBvbmVudChlLmlkLCBzaWRlYmFyKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJESVZJREVSXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIE5vIG5lZWQgdG8gZXhwb3J0IHNldHRpbmdzUGFuZWxTaWRlYmFyIG9uIHdpbmRvd1xyXG4gKi8iLCJpbXBvcnQge2JkdGhlbWVFcnJvcnMsIHRoZW1lQ29va2llLCBzZXR0aW5nc0Nvb2tpZSwgYmR0aGVtZXN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IEJERXZlbnRzIGZyb20gXCIuL2JkRXZlbnRzXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5jbGFzcyBUaGVtZU1vZHVsZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5UaGVtZU1vZHVsZSA9IHRoaXNcclxuICAgIH1cclxuICAgIGdldCBmb2xkZXIoKSB7cmV0dXJuIENvbnRlbnRNYW5hZ2VyLnRoZW1lc0ZvbGRlcjt9XHJcbn1cclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5sb2FkVGhlbWVzID0gYXN5bmMgZnVuY3Rpb24gKCkge1xyXG4gICAgdGhpcy5sb2FkVGhlbWVEYXRhKCk7XHJcbiAgICBiZHRoZW1lRXJyb3JzLnNwbGljZSgwLCAwLCAuLi4oYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZFRoZW1lcygpKSk7XHJcbiAgICBjb25zdCB0aGVtZXMgPSBPYmplY3Qua2V5cyhiZHRoZW1lcyk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGVtZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWVzW3RoZW1lc1tpXV07XHJcbiAgICAgICAgaWYgKCF0aGVtZUNvb2tpZVt0aGVtZS5uYW1lXSkgdGhlbWVDb29raWVbdGhlbWUubmFtZV0gPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhlbWVDb29raWVbdGhlbWUubmFtZV0pIERPTS5hZGRTdHlsZShET00uZXNjYXBlSUQodGhlbWUuaWQpLCB1bmVzY2FwZSh0aGVtZS5jc3MpKTtcclxuXHJcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTApKVxyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCB0aGVtZSBpbiB0aGVtZUNvb2tpZSkge1xyXG4gICAgICAgIGlmICghYmR0aGVtZXNbdGhlbWVdKSBkZWxldGUgdGhlbWVDb29raWVbdGhlbWVdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zYXZlVGhlbWVEYXRhKCk7XHJcbiAgICAvLyBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTVcIl0pIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmVuYWJsZVRoZW1lID0gZnVuY3Rpb24obmFtZSwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHRoZW1lQ29va2llW25hbWVdID0gdHJ1ZTtcclxuICAgIHRoaXMuc2F2ZVRoZW1lRGF0YSgpO1xyXG4gICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lc1tuYW1lXTtcclxuICAgIERPTS5hZGRTdHlsZShET00uZXNjYXBlSUQodGhlbWUuaWQpLCB1bmVzY2FwZSh0aGVtZS5jc3MpKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWUubmFtZX0gdiR7dGhlbWUudmVyc2lvbn0gaGFzIGJlZW4gYXBwbGllZC5gKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAobmFtZSwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHJldHVybiB0aGlzLmVuYWJsZVRoZW1lKG5hbWUsIHJlbG9hZCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZGlzYWJsZVRoZW1lID0gZnVuY3Rpb24obmFtZSwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHRoZW1lQ29va2llW25hbWVdID0gZmFsc2U7XHJcbiAgICB0aGlzLnNhdmVUaGVtZURhdGEoKTtcclxuICAgIGNvbnN0IHRoZW1lID0gYmR0aGVtZXNbbmFtZV07XHJcbiAgICBET00ucmVtb3ZlU3R5bGUoRE9NLmVzY2FwZUlEKHRoZW1lLmlkKSk7XHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lLm5hbWV9IHYke3RoZW1lLnZlcnNpb259IGhhcyBiZWVuIGRpc2FibGVkLmApO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAobmFtZSwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHJldHVybiB0aGlzLmRpc2FibGVUaGVtZShuYW1lLCByZWxvYWQpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnRvZ2dsZVRoZW1lID0gZnVuY3Rpb24odGhlbWUpIHtcclxuICAgIGlmICh0aGVtZUNvb2tpZVt0aGVtZV0pIHRoaXMuZGlzYWJsZVRoZW1lKHRoZW1lKTtcclxuICAgIGVsc2UgdGhpcy5lbmFibGVUaGVtZSh0aGVtZSk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKG5hbWUsIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICByZXR1cm4gdGhpcy50b2dnbGVUaGVtZShuYW1lLCByZWxvYWQpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmxvYWRUaGVtZSA9IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lKSB7XHJcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IENvbnRlbnRNYW5hZ2VyLmxvYWRDb250ZW50KGZpbGVuYW1lLCBcInRoZW1lXCIpO1xyXG4gICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7dGhlbWVzOiBbZXJyb3JdfSk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7ZmlsZW5hbWV9IGNvdWxkIG5vdCBiZSBsb2FkZWQuIEl0IG1heSBub3QgaGF2ZSBiZWVuIGxvYWRlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke2ZpbGVuYW1lfSBjb3VsZCBub3QgYmUgbG9hZGVkLmAsIGVycm9yKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHRoZW1lID0gT2JqZWN0LnZhbHVlcyhiZHRoZW1lcykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWUpO1xyXG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7dGhlbWUubmFtZX0gdiR7dGhlbWUudmVyc2lvbn0gd2FzIGxvYWRlZC5gKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lLm5hbWV9IHYke3RoZW1lLnZlcnNpb259IHdhcyBsb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XHJcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInRoZW1lLWxvYWRlZFwiLCB0aGVtZS5uYW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS51bmxvYWRUaGVtZSA9IGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XHJcbiAgICBjb25zdCBiZHRoZW1lID0gT2JqZWN0LnZhbHVlcyhiZHRoZW1lcykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkdGhlbWVzW2ZpbGVuYW1lT3JOYW1lXTtcclxuICAgIGlmICghYmR0aGVtZSkgcmV0dXJuO1xyXG4gICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lLm5hbWU7XHJcbiAgICBpZiAodGhlbWVDb29raWVbdGhlbWVdKSB0aGlzLmRpc2FibGVUaGVtZSh0aGVtZSwgdHJ1ZSk7XHJcbiAgICBjb25zdCBlcnJvciA9IENvbnRlbnRNYW5hZ2VyLnVubG9hZENvbnRlbnQoYmR0aGVtZXNbdGhlbWVdLmZpbGVuYW1lLCBcInRoZW1lXCIpO1xyXG4gICAgZGVsZXRlIGJkdGhlbWVzW3RoZW1lXTtcclxuICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3RoZW1lczogW2Vycm9yXX0pO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lfSBjb3VsZCBub3QgYmUgdW5sb2FkZWQuIEl0IG1heSBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xyXG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHt0aGVtZX0gY291bGQgbm90IGJlIHVubG9hZGVkLiBJdCBtYXkgaGF2ZSBub3QgYmVlbiBsb2FkZWQgeWV0LmAsIGVycm9yKTtcclxuICAgIH1cclxuICAgIFV0aWxzLmxvZyhcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lfSB3YXMgdW5sb2FkZWQuYCk7XHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZX0gd2FzIHVubG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xyXG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJ0aGVtZS11bmxvYWRlZFwiLCB0aGVtZSk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnN0IGJkdGhlbWUgPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmR0aGVtZXNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHRoZW1lKSByZXR1cm47XHJcbiAgICB0aGlzLnVubG9hZFRoZW1lKGJkdGhlbWUuZmlsZW5hbWUpO1xyXG4gICAgY29uc3QgZnVsbFBhdGggPSByZXF1aXJlKFwicGF0aFwiKS5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnRoZW1lc0ZvbGRlciwgYmR0aGVtZS5maWxlbmFtZSk7XHJcbiAgICByZXF1aXJlKFwiZnNcIikudW5saW5rU3luYyhmdWxsUGF0aCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUucmVsb2FkVGhlbWUgPSBhc3luYyBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xyXG4gICAgY29uc3QgYmR0aGVtZSA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHRoZW1lc1tmaWxlbmFtZU9yTmFtZV07XHJcbiAgICBpZiAoIWJkdGhlbWUpIHJldHVybiB0aGlzLmxvYWRUaGVtZShmaWxlbmFtZU9yTmFtZSk7XHJcbiAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWUubmFtZTtcclxuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgQ29udGVudE1hbmFnZXIucmVsb2FkQ29udGVudChiZHRoZW1lc1t0aGVtZV0uZmlsZW5hbWUsIFwidGhlbWVcIik7XHJcbiAgICBpZiAodGhlbWVDb29raWVbdGhlbWVdKSB0aGlzLmRpc2FibGVUaGVtZSh0aGVtZSwgdHJ1ZSksIHRoaXMuZW5hYmxlVGhlbWUodGhlbWUsIHRydWUpO1xyXG4gICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7dGhlbWVzOiBbZXJyb3JdfSk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWV9IGNvdWxkIG5vdCBiZSByZWxvYWRlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lfSBjb3VsZCBub3QgYmUgcmVsb2FkZWQuYCwgZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7dGhlbWV9IHYke2JkdGhlbWVzW3RoZW1lXS52ZXJzaW9ufSB3YXMgcmVsb2FkZWQuYCk7XHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZX0gdiR7YmR0aGVtZXNbdGhlbWVdLnZlcnNpb259IHdhcyByZWxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwidGhlbWUtcmVsb2FkZWRcIiwgdGhlbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnJlbG9hZCA9IGZ1bmN0aW9uKG5hbWUpIHtcclxuICAgIHJldHVybiB0aGlzLnJlbG9hZFRoZW1lKG5hbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmVkaXQgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xyXG4gICAgY29uc3QgYmRwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmR0aGVtZXNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xyXG4gICAgY29uc3QgZnVsbFBhdGggPSByZXF1aXJlKFwicGF0aFwiKS5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnRoZW1lc0ZvbGRlciwgYmRwbHVnaW4uZmlsZW5hbWUpO1xyXG4gICAgcmVxdWlyZShcImVsZWN0cm9uXCIpLnNoZWxsLm9wZW5JdGVtKGAke2Z1bGxQYXRofWApO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnVwZGF0ZVRoZW1lTGlzdCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3QgcmVzdWx0cyA9IENvbnRlbnRNYW5hZ2VyLmxvYWROZXdDb250ZW50KFwidGhlbWVcIik7XHJcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIHJlc3VsdHMuYWRkZWQpIHRoaXMubG9hZFRoZW1lKGZpbGVuYW1lKTtcclxuICAgIGZvciAoY29uc3QgbmFtZSBvZiByZXN1bHRzLnJlbW92ZWQpIHRoaXMudW5sb2FkVGhlbWUobmFtZSk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUubG9hZFRoZW1lRGF0YSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3Qgc2F2ZWQgPSBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwidGhlbWVzXCIpO1xyXG4gICAgaWYgKHNhdmVkKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGVtZUNvb2tpZSwgc2F2ZWQpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnNhdmVUaGVtZURhdGEgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBEYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwidGhlbWVzXCIsIHRoZW1lQ29va2llKTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBUaGVtZU1vZHVsZSgpOyIsImltcG9ydCB7YmJkVmVyc2lvbn0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVdGlscyB7XG4gICAgLyoqIERvY3VtZW50L3dpbmRvdyB3aWR0aCAqL1xuICAgIHN0YXRpYyBnZXQgc2NyZWVuV2lkdGgoKSB7IHJldHVybiBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApOyB9XG4gICAgLyoqIERvY3VtZW50L3dpbmRvdyBoZWlnaHQgKi9cbiAgICBzdGF0aWMgZ2V0IHNjcmVlbkhlaWdodCgpIHsgcmV0dXJuIE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCAwKTsgfVxuXG4gICAgc3RhdGljIGdldCBXaW5kb3dDb25maWdGaWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2luZG93Q29uZmlnRmlsZSA9IG51bGw7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEFsbFdpbmRvd1ByZWZlcmVuY2VzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICAgICAgICBmcmFtZTogZmFsc2VcbiAgICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgc3RhdGljIGdldFdpbmRvd1ByZWZlcmVuY2Uoa2V5KSB7XG4gICAgICAgIGlmIChrZXkgPT09IFwidHJhbnNwYXJlbnRcIikgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChrZXkgPT09IFwiZnJhbWVcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHNldFdpbmRvd1ByZWZlcmVuY2Uoa2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAoa2V5ID09PSBcInRyYW5zcGFyZW50XCIpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoa2V5ID09PSBcImZyYW1lXCIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3RhdGljIHN0cmlwQk9NKGNvbnRlbnQpIHtcbiAgICAgICAgaWYgKGNvbnRlbnQuY2hhckNvZGVBdCgwKSA9PT0gMHhGRUZGKSB7XG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0VGV4dEFyZWEoKSB7XG4gICAgICAgIHJldHVybiBET00ucXVlcnkoXCIuXCIrcmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuY2hhbm5lbFRleHRBcmVhICYmIGUudGl0bGVXcmFwcGVyKVswXS5jaGFubmVsVGV4dEFyZWEpK1wiIHRleHRhcmVhXCIpO1xuICAgIH1cblxuICAgIHN0YXRpYyBpbnNlcnRUZXh0KHRleHRhcmVhLCB0ZXh0KSB7XG4gICAgICAgIHRleHRhcmVhLmZvY3VzKCk7XG4gICAgICAgIHRleHRhcmVhLnNlbGVjdGlvblN0YXJ0ID0gMDtcbiAgICAgICAgdGV4dGFyZWEuc2VsZWN0aW9uRW5kID0gdGV4dGFyZWEudmFsdWUubGVuZ3RoO1xuICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZChcImluc2VydFRleHRcIiwgZmFsc2UsIHRleHQpO1xuICAgIH1cblxuICAgIHN0YXRpYyBlc2NhcGVJRChpZCkge1xuICAgICAgICByZXR1cm4gaWQucmVwbGFjZSgvXlteYS16XSt8W15cXHctXSsvZ2ksIFwiLVwiKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgbG9nKG1vZHVsZU5hbWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCVjW0JhbmRhZ2VkQkRdJWMgWyR7bW9kdWxlTmFtZX1dJWMgJHttZXNzYWdlfWAsIFwiY29sb3I6ICMzYTcxYzE7IGZvbnQtd2VpZ2h0OiA3MDA7XCIsIFwiY29sb3I6ICMzYTcxYzE7XCIsIFwiXCIpO1xuICAgIH1cblxuICAgIHN0YXRpYyB3YXJuKG1vZHVsZU5hbWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAlY1tCYW5kYWdlZEJEXSVjIFske21vZHVsZU5hbWV9XSVjICR7bWVzc2FnZX1gLCBcImNvbG9yOiAjRThBNDAwOyBmb250LXdlaWdodDogNzAwO1wiLCBcImNvbG9yOiAjRThBNDAwO1wiLCBcIlwiKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZXJyKG1vZHVsZU5hbWUsIG1lc3NhZ2UsIGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAlY1tCYW5kYWdlZEJEXSVjIFske21vZHVsZU5hbWV9XSVjICR7bWVzc2FnZX1gLCBcImNvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiA3MDA7XCIsIFwiY29sb3I6IHJlZDtcIiwgXCJcIik7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5ncm91cENvbGxhcHNlZChcIiVjRXJyb3I6IFwiICsgZXJyb3IubWVzc2FnZSwgXCJjb2xvcjogcmVkO1wiKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3Iuc3RhY2spO1xuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9ybWF0IHN0cmluZ3Mgd2l0aCBwbGFjZWhvbGRlcnMgKGB7e3BsYWNlaG9sZGVyfX1gKSBpbnRvIGZ1bGwgc3RyaW5ncy5cbiAgICAgKiBRdWljayBleGFtcGxlOiBgUGx1Z2luVXRpbGl0aWVzLmZvcm1hdFN0cmluZyhcIkhlbGxvLCB7e3VzZXJ9fVwiLCB7dXNlcjogXCJaZXJlYm9zXCJ9KWBcbiAgICAgKiB3b3VsZCByZXR1cm4gXCJIZWxsbywgWmVyZWJvc1wiLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgLSBzdHJpbmcgdG8gZm9ybWF0XG4gICAgICogQHBhcmFtIHtvYmplY3R9IHZhbHVlcyAtIG9iamVjdCBsaXRlcmFsIG9mIHBsYWNlaG9sZGVycyB0byByZXBsYWNlbWVudHNcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgcHJvcGVybHkgZm9ybWF0dGVkIHN0cmluZ1xuICAgICAqL1xuICAgIHN0YXRpYyBmb3JtYXRTdHJpbmcoc3RyaW5nLCB2YWx1ZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB2YWwgaW4gdmFsdWVzKSB7XG4gICAgICAgICAgICBsZXQgcmVwbGFjZW1lbnQgPSB2YWx1ZXNbdmFsXTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcGxhY2VtZW50KSkgcmVwbGFjZW1lbnQgPSBKU09OLnN0cmluZ2lmeShyZXBsYWNlbWVudCk7XG4gICAgICAgICAgICBpZiAodHlwZW9mKHJlcGxhY2VtZW50KSA9PT0gXCJvYmplY3RcIiAmJiByZXBsYWNlbWVudCAhPT0gbnVsbCkgcmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudC50b1N0cmluZygpO1xuICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UobmV3IFJlZ0V4cChge3ske3ZhbH19fWAsIFwiZ1wiKSwgcmVwbGFjZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgfVxuXG4gICAgc3RhdGljIGVzY2FwZShzKSB7XG4gICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1stL1xcXFxeJCorPy4oKXxbXFxde31dL2csIFwiXFxcXCQmXCIpO1xuICAgIH1cblxuICAgIHN0YXRpYyB0ZXN0SlNPTihkYXRhKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgaXNFbXB0eShvYmopIHtcbiAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IG9iaiA9PSB1bmRlZmluZWQgfHwgb2JqID09IFwiXCIpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iai5sZW5ndGggPT0gMDtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgc3VwcHJlc3NFcnJvcnMobWV0aG9kLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PiB7XG4gICAgICAgICAgICB0cnkgeyByZXR1cm4gbWV0aG9kKC4uLnBhcmFtcyk7XHR9XG4gICAgICAgICAgICBjYXRjaCAoZSkgeyB0aGlzLmVycihcIlN1cHByZXNzZWRFcnJvclwiLCBcIkVycm9yIG9jY3VycmVkIGluIFwiICsgbWVzc2FnZSwgZSk7IH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzdGF0aWMgbW9ua2V5UGF0Y2god2hhdCwgbWV0aG9kTmFtZSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCB7YmVmb3JlLCBhZnRlciwgaW5zdGVhZCwgb25jZSA9IGZhbHNlLCBzaWxlbnQgPSBmYWxzZSwgZm9yY2UgPSBmYWxzZX0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBkaXNwbGF5TmFtZSA9IG9wdGlvbnMuZGlzcGxheU5hbWUgfHwgd2hhdC5kaXNwbGF5TmFtZSB8fCB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lIHx8IHdoYXQubmFtZSB8fCB3aGF0LmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IHdoYXQuY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgaWYgKCFzaWxlbnQpIGNvbnNvbGUubG9nKFwicGF0Y2hcIiwgbWV0aG9kTmFtZSwgXCJvZlwiLCBkaXNwbGF5TmFtZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgICBpZiAoIXdoYXRbbWV0aG9kTmFtZV0pIHtcbiAgICAgICAgICAgIGlmIChmb3JjZSkgd2hhdFttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge307XG4gICAgICAgICAgICBlbHNlIHJldHVybiBjb25zb2xlLmVycm9yKG1ldGhvZE5hbWUsIFwiZG9lcyBub3QgZXhpc3QgZm9yXCIsIGRpc3BsYXlOYW1lKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3JpZ01ldGhvZCA9IHdoYXRbbWV0aG9kTmFtZV07XG4gICAgICAgIGxldCBjYW5jZWxlZCA9IGZhbHNlXG4gICAgICAgIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICghc2lsZW50KSBjb25zb2xlLmxvZyhcInVucGF0Y2hcIiwgbWV0aG9kTmFtZSwgXCJvZlwiLCBkaXNwbGF5TmFtZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgLy93aGF0W21ldGhvZE5hbWVdID0gb3JpZ01ldGhvZDtcbiAgICAgICAgICAgIGNhbmNlbGVkID0gdHJ1ZSAvLyB0aGlzIGFsbG93IHRvIG1vbmtleXBhdGNoIG1vcmUgdGhhbiBvbmUgdGltZS5cbiAgICAgICAgfTtcbiAgICAgICAgd2hhdFttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYoY2FuY2VsZWQpe1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnTWV0aG9kLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICB0aGlzT2JqZWN0OiB0aGlzLFxuICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3VtZW50czogYXJndW1lbnRzLFxuICAgICAgICAgICAgICAgIGNhbmNlbFBhdGNoOiBjYW5jZWwsXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxNZXRob2Q6IG9yaWdNZXRob2QsXG4gICAgICAgICAgICAgICAgY2FsbE9yaWdpbmFsTWV0aG9kOiAoKSA9PiBkYXRhLnJldHVyblZhbHVlID0gZGF0YS5vcmlnaW5hbE1ldGhvZC5hcHBseShkYXRhLnRoaXNPYmplY3QsIGRhdGEubWV0aG9kQXJndW1lbnRzKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChpbnN0ZWFkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcFJldCA9IFV0aWxzLnN1cHByZXNzRXJyb3JzKGluc3RlYWQsIFwiYGluc3RlYWRgIGNhbGxiYWNrIG9mIFwiICsgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSkoZGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKHRlbXBSZXQgIT09IHVuZGVmaW5lZCkgZGF0YS5yZXR1cm5WYWx1ZSA9IHRlbXBSZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoYmVmb3JlKSBVdGlscy5zdXBwcmVzc0Vycm9ycyhiZWZvcmUsIFwiYGJlZm9yZWAgY2FsbGJhY2sgb2YgXCIgKyB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lKShkYXRhKTtcbiAgICAgICAgICAgICAgICBkYXRhLmNhbGxPcmlnaW5hbE1ldGhvZCgpO1xuICAgICAgICAgICAgICAgIGlmIChhZnRlcikgVXRpbHMuc3VwcHJlc3NFcnJvcnMoYWZ0ZXIsIFwiYGFmdGVyYCBjYWxsYmFjayBvZiBcIiArIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUpKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9uY2UpIGNhbmNlbCgpO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWU7XG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5hc3NpZ24od2hhdFttZXRob2ROYW1lXSwgb3JpZ01ldGhvZCk7XG4gICAgICAgIHdoYXRbbWV0aG9kTmFtZV0uX19tb25rZXlQYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuICAgICAgICBpZiAoIXdoYXRbbWV0aG9kTmFtZV0uX19vcmlnaW5hbE1ldGhvZCkge1xuICAgICAgICAgICAgd2hhdFttZXRob2ROYW1lXS5fX29yaWdpbmFsTWV0aG9kID0gb3JpZ01ldGhvZDtcbiAgICAgICAgICAgIHdoYXRbbWV0aG9kTmFtZV0udG9TdHJpbmcgPSBmdW5jdGlvbigpIHtyZXR1cm4gb3JpZ01ldGhvZC50b1N0cmluZygpO307XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbmNlbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgb25SZW1vdmVkKG5vZGUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgbSA9IDA7IG0gPCBtdXRhdGlvbnMubGVuZ3RoOyBtKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtdXRhdGlvbiA9IG11dGF0aW9uc1ttXTtcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlcyA9IEFycmF5LmZyb20obXV0YXRpb24ucmVtb3ZlZE5vZGVzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3RNYXRjaCA9IG5vZGVzLmluZGV4T2Yobm9kZSkgPiAtMTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRNYXRjaCA9IG5vZGVzLnNvbWUocGFyZW50ID0+IHBhcmVudC5jb250YWlucyhub2RlKSk7XG4gICAgICAgICAgICAgICAgaWYgKGRpcmVjdE1hdGNoIHx8IHBhcmVudE1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwge3N1YnRyZWU6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZX0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXROZXN0ZWRQcm9wKG9iaiwgcGF0aCkge1xuICAgICAgICByZXR1cm4gcGF0aC5zcGxpdCgvXFxzP1xcLlxccz8vKS5yZWR1Y2UoZnVuY3Rpb24ob2JqLCBwcm9wKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqICYmIG9ialtwcm9wXTtcbiAgICAgICAgfSwgb2JqKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIHNob3dzIGEgdG9hc3Qgc2ltaWxhciB0byBhbmRyb2lkIHRvd2FyZHMgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgVGhlIHN0cmluZyB0byBzaG93IGluIHRoZSB0b2FzdC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdC4gT3B0aW9uYWwgcGFyYW1ldGVyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnR5cGUgQ2hhbmdlcyB0aGUgdHlwZSBvZiB0aGUgdG9hc3Qgc3R5bGlzdGljYWxseSBhbmQgc2VtYW50aWNhbGx5LiBDaG9pY2VzOiBcIlwiLCBcImluZm9cIiwgXCJzdWNjZXNzXCIsIFwiZGFuZ2VyXCIvXCJlcnJvclwiLCBcIndhcm5pbmdcIi9cIndhcm5cIi4gRGVmYXVsdDogXCJcIlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5pY29uIERldGVybWluZXMgd2hldGhlciB0aGUgaWNvbiBzaG91bGQgc2hvdyBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlLiBBIHRvYXN0IHdpdGhvdXQgdHlwZSB3aWxsIGFsd2F5cyBoYXZlIG5vIGljb24uIERlZmF1bHQ6IHRydWVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy50aW1lb3V0IEFkanVzdHMgdGhlIHRpbWUgKGluIG1zKSB0aGUgdG9hc3Qgc2hvdWxkIGJlIHNob3duIGZvciBiZWZvcmUgZGlzYXBwZWFyaW5nIGF1dG9tYXRpY2FsbHkuIERlZmF1bHQ6IDMwMDBcbiAgICAgKi9cbiAgICBzdGF0aWMgc2hvd1RvYXN0KGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYmQtdG9hc3RzXCIpKSB7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLlwiK3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpZGViYXIgJiYgZS5oYXNOb3RpY2UpWzBdLnNpZGViYXIpK1wiICsgZGl2XCIpIHx8IG51bGw7XG4gICAgICAgICAgICBjb25zdCBmb3JtID0gY29udGFpbmVyID8gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoXCJmb3JtXCIpIDogbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGJvdHRvbSA9IGZvcm0gPyBmb3JtLm9mZnNldEhlaWdodCA6IDgwO1xuICAgICAgICAgICAgY29uc3QgdG9hc3RXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHRvYXN0V3JhcHBlci5jbGFzc0xpc3QuYWRkKFwiYmQtdG9hc3RzXCIpO1xuICAgICAgICAgICAgdG9hc3RXcmFwcGVyLnN0eWxlLnNldFByb3BlcnR5KFwiYm90dG9tXCIsIGJvdHRvbStcInB4XCIpO1xuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhcHAtbW91bnRcIikuYXBwZW5kQ2hpbGQodG9hc3RXcmFwcGVyKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b2FzdFdyYXBwZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmJkLXRvYXN0c1wiKVxuICAgICAgICBjb25zdCB7dHlwZSA9IFwiXCIsIGljb24gPSB0cnVlLCB0aW1lb3V0ID0gMzAwMH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCB0b2FzdEVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0b2FzdEVsZW0uY2xhc3NMaXN0LmFkZChcImJkLXRvYXN0XCIpO1xuICAgICAgICBpZiAodHlwZSkgdG9hc3RFbGVtLmNsYXNzTGlzdC5hZGQoXCJ0b2FzdC1cIiArIHR5cGUpO1xuICAgICAgICBpZiAodHlwZSAmJiBpY29uKSB0b2FzdEVsZW0uY2xhc3NMaXN0LmFkZChcImljb25cIik7XG4gICAgICAgIHRvYXN0RWxlbS5pbm5lclRleHQgPSBjb250ZW50O1xuICAgICAgICB0b2FzdFdyYXBwZXIuYXBwZW5kQ2hpbGQodG9hc3RFbGVtKTtcbiAgICAgICAgdG9hc3RXcmFwcGVyLnN0eWxlLnNldFByb3BlcnR5KFwibGVmdFwiLCBgY2FsYyg1MCUgLSAke3RvYXN0V3JhcHBlci5vZmZzZXRXaWR0aCAvIDJ9cHgpYCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdG9hc3RFbGVtLmNsYXNzTGlzdC5hZGQoXCJjbG9zaW5nXCIpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdG9hc3RFbGVtLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5iZC10b2FzdHMgLmJkLXRvYXN0XCIpLmxlbmd0aCkgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5iZC10b2FzdHNcIikucmVtb3ZlKCk7XG4gICAgICAgICAgICB9LCAzMDApO1xuICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYWxlcnQodGl0bGUsIGNvbnRlbnQpIHtcbiAgICAgICAgbGV0IG1vZGFsTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubW9kYWwgJiYgZS5pbm5lciAmJiAhZS5oaWRlT25GdWxsc2NyZWVuKVswXVxuICAgICAgICBsZXQgaGVhZGVyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGVhZGVyICYmIGUucmVzcG9uc2l2ZVdpZHRoTW9iaWxlICYmIGUuaGlkZU9uRnVsbHNjcmVlbilbMF1cbiAgICAgICAgbGV0IGZvb3RlcjJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oZWFkZXIgJiYgZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUgJiYgZS5mb2N1c0xvY2spWzBdXG4gICAgICAgIGNvbnN0IG1vZGFsID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCJiZC1tb2RhbC13cmFwcGVyIHRoZW1lLWRhcmtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1iYWNrZHJvcCAke0JETW9kdWxlcy5nZXQoZSA9PiBlLmJhY2tkcm9wICYmIGUuYmFja2Ryb3BXaXRoTGF5ZXIpWzBdLmJhY2tkcm9wfVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsICR7bW9kYWxNb2R1bGUubW9kYWx9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsLWlubmVyICR7bW9kYWxNb2R1bGUuaW5uZXJ9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXIgJHtoZWFkZXJNb2R1bGUuaGVhZGVyfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+JHt0aXRsZX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbC1ib2R5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsZXItd3JhcCBmYWRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Y29udGVudH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3RlciAke2hlYWRlck1vZHVsZS5mb290ZXJ9ICR7Zm9vdGVyMk1vZHVsZS5mb290ZXJ9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIj5Pa2F5PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PmApO1xuICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLmZvb3RlciBidXR0b25cIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIERPTS5hZGRDbGFzcyhtb2RhbCwgXCJjbG9zaW5nXCIpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IFxuICAgICAgICAgICAgICAgIG1vZGFsLnJlbW92ZSgpOyBcbiAgICAgICAgICAgICAgICBjbG9zaW5nTGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKClcbiAgICAgICAgICAgICAgICAgICAgfWNhdGNoKGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgIH0pO1xuICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLmJkLWJhY2tkcm9wXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBcbiAgICAgICAgICAgICAgICBtb2RhbC5yZW1vdmUoKTsgXG4gICAgICAgICAgICAgICAgY2xvc2luZ0xpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcigpXG4gICAgICAgICAgICAgICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LCAzMDApO1xuICAgICAgICB9KTtcbiAgICAgICAgRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKS5hcHBlbmQobW9kYWwpO1xuICAgICAgICBjb25zdCBjbG9zaW5nTGlzdGVuZXJzID0gW11cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNsb3NlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IFxuICAgICAgICAgICAgICAgICAgICBtb2RhbC5yZW1vdmUoKTsgXG4gICAgICAgICAgICAgICAgICAgIGNsb3NpbmdMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcigpXG4gICAgICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25DbG9zZTogKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xvc2luZ0xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBwbHVnaW5FcnJvcnMgPSBbXSwgdGhlbWVzOiB0aGVtZUVycm9ycyA9IFtdfSkge1xuICAgICAgICBpZiAoIXBsdWdpbkVycm9ycyB8fCAhdGhlbWVFcnJvcnMpIHJldHVybjtcbiAgICAgICAgaWYgKCFwbHVnaW5FcnJvcnMubGVuZ3RoICYmICF0aGVtZUVycm9ycy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgbGV0IG1vZGFsTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubW9kYWwgJiYgZS5pbm5lciAmJiAhZS5oaWRlT25GdWxsc2NyZWVuKVswXVxuICAgICAgICBsZXQgaGVhZGVyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGVhZGVyICYmIGUucmVzcG9uc2l2ZVdpZHRoTW9iaWxlICYmIGUuaGlkZU9uRnVsbHNjcmVlbilbMF1cbiAgICAgICAgbGV0IGZvb3RlcjJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oZWFkZXIgJiYgZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUgJiYgZS5mb2N1c0xvY2spWzBdXG4gICAgICAgIGNvbnN0IG1vZGFsID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCJiZC1tb2RhbC13cmFwcGVyIHRoZW1lLWRhcmtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1iYWNrZHJvcCAke0JETW9kdWxlcy5nZXQoZSA9PiBlLmJhY2tkcm9wICYmIGUuYmFja2Ryb3BXaXRoTGF5ZXIpWzBdLmJhY2tkcm9wfVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsIGJkLWNvbnRlbnQtbW9kYWwgJHttb2RhbE1vZHVsZS5tb2RhbH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtaW5uZXIgJHttb2RhbE1vZHVsZS5pbm5lcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlciAke2hlYWRlck1vZHVsZS5oZWFkZXJ9XCI+PGRpdiBjbGFzcz1cInRpdGxlXCI+Q29udGVudCBFcnJvcnM8L2Rpdj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsLWJvZHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYmFyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYmFyIFRPUFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhci1pdGVtXCI+UGx1Z2luczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhci1pdGVtXCI+VGhlbWVzPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1uYW1lXCI+TmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLW1lc3NhZ2VcIj5NZXNzYWdlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tZXJyb3JcIj5FcnJvcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsZXItd3JhcCBmYWRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbGVyXCI+XG4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXIgJHtoZWFkZXJNb2R1bGUuZm9vdGVyfSAke2Zvb3RlcjJNb2R1bGUuZm9vdGVyfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCI+T2theTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gKTtcbiAgICBcbiAgICAgICAgZnVuY3Rpb24gZ2VuZXJhdGVUYWIoZXJyb3JzKSB7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cImVycm9yc1wiPmApO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlcnIgb2YgZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cImVycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1uYW1lXCI+JHtlcnIubmFtZSA/IGVyci5uYW1lIDogZXJyLmZpbGV9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1tZXNzYWdlXCI+JHtlcnIubWVzc2FnZX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLWVycm9yXCI+PGEgY2xhc3M9XCJlcnJvci1saW5rXCIgaHJlZj1cIlwiPiR7ZXJyLmVycm9yID8gZXJyLmVycm9yLm1lc3NhZ2UgOiBcIlwifTwvYT48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+YCk7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZChlcnJvcik7XG4gICAgICAgICAgICAgICAgaWYgKGVyci5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBlcnJvci5xdWVyeVNlbGVjdG9yQWxsKFwiYVwiKS5mb3JFYWNoKGVsID0+IGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYEVycm9yIGRldGFpbHMgZm9yICR7ZXJyLm5hbWUgPyBlcnIubmFtZSA6IGVyci5maWxlfS5gLCBlcnIuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICBjb25zdCB0YWJzID0gW2dlbmVyYXRlVGFiKHBsdWdpbkVycm9ycyksIGdlbmVyYXRlVGFiKHRoZW1lRXJyb3JzKV07XG4gICAgXG4gICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoXCIudGFiLWJhci1pdGVtXCIpLmZvckVhY2goZWwgPT4gZWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChlKSA9PiB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIudGFiLWJhci1pdGVtLnNlbGVjdGVkXCIpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkKSBET00ucmVtb3ZlQ2xhc3Moc2VsZWN0ZWQsIFwic2VsZWN0ZWRcIik7XG4gICAgICAgICAgICBET00uYWRkQ2xhc3MoZS50YXJnZXQsIFwic2VsZWN0ZWRcIik7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxlciA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIuc2Nyb2xsZXJcIik7XG4gICAgICAgICAgICBzY3JvbGxlci5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICAgICAgc2Nyb2xsZXIuYXBwZW5kKHRhYnNbRE9NLmluZGV4KGUudGFyZ2V0KV0pO1xuICAgICAgICB9KSk7XG4gICAgXG4gICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIuZm9vdGVyIGJ1dHRvblwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgbW9kYWwucmVtb3ZlKCk7IH0sIDMwMCk7XG4gICAgICAgIH0pO1xuICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLmJkLWJhY2tkcm9wXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBtb2RhbC5yZW1vdmUoKTsgfSwgMzAwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIERPTS5xdWVyeShcIiNhcHAtbW91bnRcIikuYXBwZW5kKG1vZGFsKTtcbiAgICAgICAgaWYgKHBsdWdpbkVycm9ycy5sZW5ndGgpIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIudGFiLWJhci1pdGVtXCIpLmNsaWNrKCk7XG4gICAgICAgIGVsc2UgbW9kYWwucXVlcnlTZWxlY3RvckFsbChcIi50YWItYmFyLWl0ZW1cIilbMV0uY2xpY2soKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgc2hvd0NoYW5nZWxvZ01vZGFsKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBNb2RhbFN0YWNrID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJwdXNoXCIsIFwidXBkYXRlXCIsIFwicG9wXCIsIFwicG9wV2l0aEtleVwiKTtcbiAgICAgICAgY29uc3QgQ2hhbmdlbG9nQ2xhc3NlcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiZml4ZWRcIiwgXCJpbXByb3ZlZFwiKTtcbiAgICAgICAgY29uc3QgVGV4dEVsZW1lbnQgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIlRleHRcIik7XG4gICAgICAgIGNvbnN0IEZsZXhDaGlsZCA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiQ2hpbGRcIik7XG4gICAgICAgIGNvbnN0IFRpdGxlcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiVGFnc1wiLCBcImRlZmF1bHRcIik7XG4gICAgICAgIGNvbnN0IENoYW5nZWxvZyA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHRQcm9wcyAmJiBtLmRlZmF1bHRQcm9wcy5zZWxlY3RhYmxlID09IGZhbHNlKTtcbiAgICAgICAgY29uc3QgTWFya2Rvd25QYXJzZXIgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImRlZmF1bHRSdWxlc1wiLCBcInBhcnNlXCIpO1xuICAgICAgICBpZiAoIUNoYW5nZWxvZyB8fCAhTW9kYWxTdGFjayB8fCAhQ2hhbmdlbG9nQ2xhc3NlcyB8fCAhVGV4dEVsZW1lbnQgfHwgIUZsZXhDaGlsZCB8fCAhVGl0bGVzIHx8ICFNYXJrZG93blBhcnNlcikgcmV0dXJuO1xuICAgIFxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBpbWFnZSA9IFwiaHR0cHM6Ly9yZXBvc2l0b3J5LWltYWdlcy5naXRodWJ1c2VyY29udGVudC5jb20vMTA1NDczNTM3Lzk1N2I1NDgwLTdjMjYtMTFlOS04NDAxLTUwZmE4MjBjYmFlNVwiLCBcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gXCJcIiwgXG4gICAgICAgICAgICBjaGFuZ2VzID0gW10sIFxuICAgICAgICAgICAgdGl0bGUgPSBcIkJhbmRhZ2VkQkRcIiwgXG4gICAgICAgICAgICBzdWJ0aXRsZSA9IGB2JHtiYmRWZXJzaW9ufWAsIFxuICAgICAgICAgICAgZm9vdGVyXG4gICAgICAgIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBjZSA9IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudDtcbiAgICAgICAgY29uc3QgY2hhbmdlbG9nSXRlbXMgPSBbY2UoXCJpbWdcIiwge3NyYzogaW1hZ2V9KV07XG4gICAgICAgIGlmIChkZXNjcmlwdGlvbikgY2hhbmdlbG9nSXRlbXMucHVzaChjZShcInBcIiwgbnVsbCwgTWFya2Rvd25QYXJzZXIucGFyc2UoZGVzY3JpcHRpb24pKSk7XG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hhbmdlcy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBjaGFuZ2VzW2NdO1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IENoYW5nZWxvZ0NsYXNzZXNbZW50cnkudHlwZV0gPyBDaGFuZ2Vsb2dDbGFzc2VzW2VudHJ5LnR5cGVdIDogQ2hhbmdlbG9nQ2xhc3Nlcy5hZGRlZDtcbiAgICAgICAgICAgIGNvbnN0IG1hcmdpbiA9IGMgPT0gMCA/IENoYW5nZWxvZ0NsYXNzZXMubWFyZ2luVG9wIDogXCJcIjtcbiAgICAgICAgICAgIGNoYW5nZWxvZ0l0ZW1zLnB1c2goY2UoXCJoMVwiLCB7Y2xhc3NOYW1lOiBgJHt0eXBlfSAke21hcmdpbn1gLH0sIGVudHJ5LnRpdGxlKSk7XG4gICAgICAgICAgICBjb25zdCBsaXN0ID0gY2UoXCJ1bFwiLCBudWxsLCBlbnRyeS5pdGVtcy5tYXAoaSA9PiBjZShcImxpXCIsIG51bGwsIE1hcmtkb3duUGFyc2VyLnBhcnNlKGkpKSkpO1xuICAgICAgICAgICAgY2hhbmdlbG9nSXRlbXMucHVzaChsaXN0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZW5kZXJIZWFkZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBjZShGbGV4Q2hpbGQuQ2hpbGQsIHtncm93OiAxLCBzaHJpbms6IDF9LFxuICAgICAgICAgICAgICAgIGNlKFRpdGxlcy5kZWZhdWx0LCB7dGFnOiBUaXRsZXMuVGFncy5INH0sIHRpdGxlKSxcbiAgICAgICAgICAgICAgICBjZShUZXh0RWxlbWVudCx7c2l6ZTogVGV4dEVsZW1lbnQuU2l6ZXMuU01BTEwsIGNvbG9yOiBUZXh0RWxlbWVudC5Db2xvcnMuU1RBTkRBUkQsIGNsYXNzTmFtZTogQ2hhbmdlbG9nQ2xhc3Nlcy5kYXRlfSwgc3VidGl0bGUpXG4gICAgICAgICAgICApO1xuICAgICAgICB9O1xuICAgIFxuICAgICAgICBjb25zdCByZW5kZXJGb290ZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcbiAgICAgICAgICAgIGNvbnN0IEFuY2hvckNsYXNzZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImFuY2hvclVuZGVybGluZU9uSG92ZXJcIikgfHwge2FuY2hvcjogXCJhbmNob3ItM1otOEJiXCIsIGFuY2hvclVuZGVybGluZU9uSG92ZXI6IFwiYW5jaG9yVW5kZXJsaW5lT25Ib3Zlci0yRVNIUUJcIn07XG4gICAgICAgICAgICBjb25zdCBqb2luU3VwcG9ydFNlcnZlciA9IChjbGljaykgPT4ge1xuICAgICAgICAgICAgICAgIGNsaWNrLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgY2xpY2suc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgTW9kYWxTdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICBCRFYyLmpvaW5CRDIoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBzdXBwb3J0TGluayA9IEFuY2hvciA/IGNlKEFuY2hvciwge29uQ2xpY2s6IGpvaW5TdXBwb3J0U2VydmVyfSwgXCJKb2luIG91ciBEaXNjb3JkIFNlcnZlci5cIikgOiBjZShcImFcIiwge2NsYXNzTmFtZTogYCR7QW5jaG9yQ2xhc3Nlcy5hbmNob3J9ICR7QW5jaG9yQ2xhc3Nlcy5hbmNob3JVbmRlcmxpbmVPbkhvdmVyfWAsIG9uQ2xpY2s6IGpvaW5TdXBwb3J0U2VydmVyfSwgXCJKb2luIG91ciBEaXNjb3JkIFNlcnZlci5cIik7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0Rm9vdGVyID0gY2UoVGV4dEVsZW1lbnQse3NpemU6IFRleHRFbGVtZW50LlNpemVzLlNNQUxMLCBjb2xvcjogVGV4dEVsZW1lbnQuQ29sb3JzLlNUQU5EQVJEfSwgXCJOZWVkIHN1cHBvcnQ/IFwiLCBzdXBwb3J0TGluayk7XG4gICAgICAgICAgICByZXR1cm4gY2UoRmxleENoaWxkLkNoaWxkLCB7Z3JvdzogMSwgc2hyaW5rOiAxfSwgZm9vdGVyID8gZm9vdGVyIDogZGVmYXVsdEZvb3Rlcik7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIE1vZGFsU3RhY2sucHVzaChmdW5jdGlvbihwcm9wcykge1xuICAgICAgICAgICAgcmV0dXJuIGNlKENoYW5nZWxvZywgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBDaGFuZ2Vsb2dDbGFzc2VzLmNvbnRhaW5lcixcbiAgICAgICAgICAgICAgICBzZWxlY3RhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIG9uU2Nyb2xsOiBfID0+IF8sXG4gICAgICAgICAgICAgICAgb25DbG9zZTogXyA9PiBfLFxuICAgICAgICAgICAgICAgIHJlbmRlckhlYWRlcjogcmVuZGVySGVhZGVyLFxuICAgICAgICAgICAgICAgIHJlbmRlckZvb3RlcjogcmVuZGVyRm9vdGVyLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBjaGFuZ2Vsb2dJdGVtc1xuICAgICAgICAgICAgfSwgcHJvcHMpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvd3MgYSBnZW5lcmljIGJ1dCB2ZXJ5IGN1c3RvbWl6YWJsZSBjb25maXJtYXRpb24gbW9kYWwgd2l0aCBvcHRpb25hbCBjb25maXJtIGFuZCBjYW5jZWwgY2FsbGJhY2tzLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIHRpdGxlIG9mIHRoZSBtb2RhbFxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xSZWFjdEVsZW1lbnR8QXJyYXk8c3RyaW5nfFJlYWN0RWxlbWVudD4pfSBjaGlsZHJlbiAtIGEgc2luZ2xlIG9yIG1peGVkIGFycmF5IG9mIHJlYWN0IGVsZW1lbnRzIGFuZCBzdHJpbmdzLiBFdmVyeSBzdHJpbmcgaXMgd3JhcHBlZCBpbiBEaXNjb3JkJ3MgYE1hcmtkb3duYCBjb21wb25lbnQgc28gc3RyaW5ncyB3aWxsIHNob3cgYW5kIHJlbmRlciBwcm9wZXJseS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gb3B0aW9ucyB0byBtb2RpZnkgdGhlIG1vZGFsXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kYW5nZXI9ZmFsc2VdIC0gd2hldGhlciB0aGUgbWFpbiBidXR0b24gc2hvdWxkIGJlIHJlZCBvciBub3RcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY29uZmlybVRleHQ9T2theV0gLSB0ZXh0IGZvciB0aGUgY29uZmlybWF0aW9uL3N1Ym1pdCBidXR0b25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY2FuY2VsVGV4dD1DYW5jZWxdIC0gdGV4dCBmb3IgdGhlIGNhbmNlbCBidXR0b25cbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBbb3B0aW9ucy5vbkNvbmZpcm09Tk9PUF0gLSBjYWxsYmFjayB0byBvY2N1ciB3aGVuIGNsaWNraW5nIHRoZSBzdWJtaXQgYnV0dG9uXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gW29wdGlvbnMub25DYW5jZWw9Tk9PUF0gLSBjYWxsYmFjayB0byBvY2N1ciB3aGVuIGNsaWNraW5nIHRoZSBjYW5jZWwgYnV0dG9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmtleV0gLSBrZXkgdXNlZCB0byBpZGVudGlmeSB0aGUgbW9kYWwuIElmIG5vdCBwcm92aWRlZCwgb25lIGlzIGdlbmVyYXRlZCBhbmQgcmV0dXJuZWRcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBrZXkgdXNlZCBmb3IgdGhpcyBtb2RhbFxuICAgICAqL1xuICAgIHN0YXRpYyBzaG93Q29uZmlybWF0aW9uTW9kYWwodGl0bGUsIGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBNb2RhbEFjdGlvbnMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcIm9wZW5Nb2RhbFwiLCBcInVwZGF0ZU1vZGFsXCIpO1xuICAgICAgICBjb25zdCBNYXJrZG93biA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiTWFya2Rvd25cIik7XG4gICAgICAgIGNvbnN0IENvbmZpcm1hdGlvbk1vZGFsID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJDb25maXJtTW9kYWxcIik7XG4gICAgICAgIGlmICghTW9kYWxBY3Rpb25zIHx8ICFDb25maXJtYXRpb25Nb2RhbCB8fCAhTWFya2Rvd24pIHJldHVybiBVdGlscy5hbGVydCh0aXRsZSwgY29udGVudCk7XG5cbiAgICAgICAgY29uc3QgZW1wdHlGdW5jdGlvbiA9ICgpID0+IHt9O1xuICAgICAgICBjb25zdCB7b25Db25maXJtID0gZW1wdHlGdW5jdGlvbiwgb25DYW5jZWwgPSBlbXB0eUZ1bmN0aW9uLCBjb25maXJtVGV4dCA9IFwiT2theVwiLCBjYW5jZWxUZXh0ID0gXCJDYW5jZWxcIiwgZGFuZ2VyID0gZmFsc2UsIGtleSA9IHVuZGVmaW5lZH0gPSBvcHRpb25zO1xuXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb250ZW50KSkgY29udGVudCA9IFtjb250ZW50XTtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQubWFwKGMgPT4gdHlwZW9mKGMpID09PSBcInN0cmluZ1wiID8gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KE1hcmtkb3duLCBudWxsLCBjKSA6IGMpO1xuICAgICAgICByZXR1cm4gTW9kYWxBY3Rpb25zLm9wZW5Nb2RhbChwcm9wcyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KENvbmZpcm1hdGlvbk1vZGFsLCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICBoZWFkZXI6IHRpdGxlLFxuICAgICAgICAgICAgICAgIHJlZDogZGFuZ2VyLFxuICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0OiBjb25maXJtVGV4dCxcbiAgICAgICAgICAgICAgICBjYW5jZWxUZXh0OiBjYW5jZWxUZXh0LFxuICAgICAgICAgICAgICAgIG9uQ29uZmlybTogb25Db25maXJtLFxuICAgICAgICAgICAgICAgIG9uQ2FuY2VsOiBvbkNhbmNlbFxuICAgICAgICAgICAgfSwgcHJvcHMpLCBjb250ZW50KTtcbiAgICAgICAgfSwge21vZGFsS2V5OiBrZXl9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IHJlbW92ZURhKCl7XG4gICAgICAgIHJldHVybiByZW1vdmVEYVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlRGEoY2xhc3NOYW1lKXtcbiAgICBpZighY2xhc3NOYW1lKXJldHVybiBjbGFzc05hbWVcbiAgICByZXR1cm4gY2xhc3NOYW1lLnNwbGl0KFwiIFwiKS5maWx0ZXIoZSA9PiAhZS5zdGFydHNXaXRoKFwiZGEtXCIpKS5qb2luKFwiIFwiKVxufVxuXG5VdGlscy5zaG93VG9hc3QgPSBVdGlscy5zdXBwcmVzc0Vycm9ycyhVdGlscy5zaG93VG9hc3QsIFwiQ291bGQgbm90IHNob3cgdG9hc3QuXCIpO1xuXG53aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuVXRpbHMgPSBVdGlscyIsImltcG9ydCB7c2V0dGluZ3N9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgdGhlbWVNb2R1bGUgZnJvbSBcIi4vdGhlbWVNb2R1bGVcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBWMiB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5lZGl0b3JEZXRhY2hlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuV2VicGFja01vZHVsZXMgPSAoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByZXEgPSB3ZWJwYWNrSnNvbnAucHVzaChbW10sIHtfX2V4dHJhX2lkX186IChtb2R1bGUsIGV4cG9ydHMsIHJlcSkgPT4gbW9kdWxlLmV4cG9ydHMgPSByZXF9LCBbW1wiX19leHRyYV9pZF9fXCJdXV0pO1xyXG4gICAgICAgICAgICBkZWxldGUgcmVxLm0uX19leHRyYV9pZF9fO1xyXG4gICAgICAgICAgICBkZWxldGUgcmVxLmMuX19leHRyYV9pZF9fO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc2hvdWxkUHJvdGVjdCA9IHRoZU1vZHVsZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhlTW9kdWxlLnJlbW92ZSAmJiB0aGVNb2R1bGUuc2V0ICYmIHRoZU1vZHVsZS5jbGVhciAmJiB0aGVNb2R1bGUuZ2V0ICYmICF0aGVNb2R1bGUuc29ydCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhlTW9kdWxlLmdldFRva2VuIHx8IHRoZU1vZHVsZS5nZXRFbWFpbCB8fCB0aGVNb2R1bGUuc2hvd1Rva2VuKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHByb3RlY3QgPSAodGhlTW9kdWxlLCBpc0RlZmF1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBtb2QgPSAhaXNEZWZhdWx0ID8gdGhlTW9kdWxlLmRlZmF1bHQgOiB0aGVNb2R1bGVcclxuICAgICAgICAgICAgICAgIGlmKCFtb2QpcmV0dXJuIHRoZU1vZHVsZVxyXG4gICAgICAgICAgICAgICAgaWYgKG1vZC5yZW1vdmUgJiYgbW9kLnNldCAmJiBtb2QuY2xlYXIgJiYgbW9kLmdldCAmJiAhbW9kLnNvcnQpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFtb2QuZ2V0VG9rZW4gJiYgIW1vZC5nZXRFbWFpbCAmJiAhbW9kLnNob3dUb2tlbilyZXR1cm4gdGhlTW9kdWxlXHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkobW9kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbihvYmosIHByb3ApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT09IFwiZ2V0VG9rZW5cIiB8fCBwcm9wID09PSBcImdldEVtYWlsXCIgfHwgcHJvcCA9PT0gXCJzaG93VG9rZW5cIikgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24ob2JqLCBmdW5jKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jID09IFwiZ2V0VG9rZW5cIiAmJiBvYmouZ2V0VG9rZW4pIHJldHVybiAoKSA9PiBcIm1mYS5YQ25iS3pvMENMSXFkSnpCbkwwRDhQZkRydXFrSk5IandIWHRyMzlVVTNGOGhIeDQzam9qSVN5aTVqZGpPNTJlOV9lOU1qbWFmWkZGcGMtc2VPTWFcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmMgPT0gXCJnZXRFbWFpbFwiICYmIG9iai5nZXRFbWFpbCkgcmV0dXJuICgpID0+IFwicHVwcGV0MTExMTJAZ21haWwuY29tXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jID09IFwic2hvd1Rva2VuXCIgJiYgb2JqLnNob3dUb2tlbikgcmV0dXJuICgpID0+IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jID09IFwiX19wcm90b19fXCIgJiYgb2JqLl9fcHJvdG9fXykgcmV0dXJuIHByb3h5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9ialtmdW5jXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZighaXNEZWZhdWx0KXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhlTW9kdWxlLCB7ZGVmYXVsdDogcHJveHl9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBwcm94eTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmQgPSAoZmlsdGVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgaW4gcmVxLmMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtICYmIG0uX19lc01vZHVsZSAmJiBtLmRlZmF1bHQgJiYgZmlsdGVyKG0uZGVmYXVsdCkpIHJldHVybiBwcm90ZWN0KG0uZGVmYXVsdCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtICYmIGZpbHRlcihtKSlcdHJldHVybiBwcm90ZWN0KG0sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oXCJDYW5ub3QgZmluZCBsb2FkZWQgbW9kdWxlIGluIGNhY2hlXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBmaW5kQWxsID0gKGZpbHRlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIHJlcS5jKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS5jLmhhc093blByb3BlcnR5KGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG0gPSByZXEuY1tpXS5leHBvcnRzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobSAmJiBtLl9fZXNNb2R1bGUgJiYgbS5kZWZhdWx0ICYmIGZpbHRlcihtLmRlZmF1bHQpKSBtb2R1bGVzLnB1c2gocHJvdGVjdChtLmRlZmF1bHQsIHRydWUpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobSAmJiBmaWx0ZXIobSkpIG1vZHVsZXMucHVzaChwcm90ZWN0KG0sIGZhbHNlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZXM7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBmaW5kQnlVbmlxdWVQcm9wZXJ0aWVzID0gKHByb3BOYW1lcykgPT4gZmluZChtb2R1bGUgPT4gcHJvcE5hbWVzLmV2ZXJ5KHByb3AgPT4gbW9kdWxlW3Byb3BdICE9PSB1bmRlZmluZWQpKTtcclxuICAgICAgICAgICAgY29uc3QgZmluZEJ5UHJvdG90eXBlcyA9IChwcm90b05hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBtb2R1bGUucHJvdG90eXBlICYmIHByb3RvTmFtZXMuZXZlcnkocHJvdG9Qcm9wID0+IG1vZHVsZS5wcm90b3R5cGVbcHJvdG9Qcm9wXSAhPT0gdW5kZWZpbmVkKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmRCeURpc3BsYXlOYW1lID0gKGRpc3BsYXlOYW1lKSA9PiBmaW5kKG1vZHVsZSA9PiBtb2R1bGUuZGlzcGxheU5hbWUgPT09IGRpc3BsYXlOYW1lKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB7ZmluZCwgZmluZEFsbCwgZmluZEJ5VW5pcXVlUHJvcGVydGllcywgZmluZEJ5UHJvdG90eXBlcywgZmluZEJ5RGlzcGxheU5hbWV9O1xyXG4gICAgICAgIH0pKCk7XHJcblxyXG4gICAgICAgIHRoaXMuaW50ZXJuYWwgPSB7XHJcbiAgICAgICAgICAgIHJlYWN0OiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiQ29tcG9uZW50XCIsIFwiUHVyZUNvbXBvbmVudFwiLCBcIkNoaWxkcmVuXCIsIFwiY3JlYXRlRWxlbWVudFwiLCBcImNsb25lRWxlbWVudFwiXSksXHJcbiAgICAgICAgICAgIHJlYWN0RG9tOiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZmluZERPTU5vZGVcIl0pXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmdldEludGVybmFsSW5zdGFuY2UgPSBlID0+IGVbT2JqZWN0LmtleXMoZSkuZmluZChrID0+IGsuc3RhcnRzV2l0aChcIl9fcmVhY3RJbnRlcm5hbEluc3RhbmNlXCIpKV07XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLlYyID0gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRpYWxpemUoKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGpvaW5CRDEoKSB7dGhpcy5JbnZpdGVBY3Rpb25zLmFjY2VwdEludml0ZUFuZFRyYW5zaXRpb25Ub0ludml0ZUNoYW5uZWwoXCIwVG1mbzVaYk9SQ1JxYkFkXCIpO31cclxuICAgIGxlYXZlQkQxKCkge3RoaXMuR3VpbGRBY3Rpb25zLmxlYXZlR3VpbGQoXCI4NjAwNDc0NDk2NjkxNDA0OFwiKTt9XHJcblxyXG4gICAgam9pbkJEMigpIHt0aGlzLkludml0ZUFjdGlvbnMuYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbChcIjJIU2NtOGpcIik7fVxyXG4gICAgbGVhdmVCRDIoKSB7dGhpcy5HdWlsZEFjdGlvbnMubGVhdmVHdWlsZChcIjI4MDgwNjQ3MjkyODE5ODY1NlwiKTt9XHJcblxyXG4gICAgam9pbkxDKCkge3RoaXMuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGVBbmRUcmFuc2l0aW9uVG9JbnZpdGVDaGFubmVsKFwiN2VGZmYyQVwiKTt9XHJcbiAgICBsZWF2ZUxDKCkge3RoaXMuR3VpbGRBY3Rpb25zLmxlYXZlR3VpbGQoXCI3MDU5MDgzNTAyMTg2NjYxMTdcIik7fVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge3R5cGVvZiBSZWFjdH1cclxuICAgICAqL1xyXG4gICAgZ2V0IHJlYWN0KCkge3JldHVybiB0aGlzLmludGVybmFsLnJlYWN0O31cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge3R5cGVvZiBSZWFjdH1cclxuICAgICAqL1xyXG4gICAgZ2V0IFJlYWN0KCkge3JldHVybiB0aGlzLmludGVybmFsLnJlYWN0O31cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCJyZWFjdC1kb21cIil9XHJcbiAgICAgKi9cclxuICAgIGdldCByZWFjdERvbSgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdERvbTt9XHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwicmVhY3QtZG9tXCIpfVxyXG4gICAgICovXHJcbiAgICBnZXQgUmVhY3REb20oKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3REb207fVxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIFJlYWN0LkNvbXBvbmVudH1cclxuICAgICAqL1xyXG4gICAgZ2V0IHJlYWN0Q29tcG9uZW50KCkge3JldHVybiB0aGlzLmludGVybmFsLnJlYWN0LkNvbXBvbmVudDt9XHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHt0eXBlb2YgUmVhY3QuQ29tcG9uZW50fVxyXG4gICAgICovXHJcbiAgICBnZXQgUmVhY3RDb21wb25lbnQoKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3QuQ29tcG9uZW50O31cclxuXHJcbiAgICBnZXQgYW5jaG9yQ2xhc3NlcygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImFuY2hvclVuZGVybGluZU9uSG92ZXJcIl0pIHx8IHthbmNob3I6IFwiYW5jaG9yLTNaLThCYlwiLCBhbmNob3JVbmRlcmxpbmVPbkhvdmVyOiBcImFuY2hvclVuZGVybGluZU9uSG92ZXItMkVTSFFCXCJ9O31cclxuICAgIGdldCBzbGF0ZUVkaXRvckNsYXNzZXMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJzbGF0ZVRleHRBcmVhXCJdKTt9XHJcbiAgICBnZXQgbWVzc2FnZUNsYXNzZXMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJtZXNzYWdlXCIsIFwiY29udGFpbmVyQ296eVwiXSk7fVxyXG4gICAgZ2V0IGd1aWxkQ2xhc3NlcygpIHtcclxuXHRcdGNvbnN0IGd1aWxkc1dyYXBwZXIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS53cmFwcGVyICYmIGUudW5yZWFkTWVudGlvbnNCYXIpWzBdO1xyXG4gICAgICAgIGNvbnN0IGd1aWxkcyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmd1aWxkc0Vycm9yICYmIGUuc2VsZWN0ZWQpWzBdXHJcbiAgICAgICAgY29uc3QgcGlsbCA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmJsb2JDb250YWluZXIpWzBdXHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGd1aWxkc1dyYXBwZXIsIGd1aWxkcywgcGlsbCk7XHJcblx0fVxyXG5cclxuICAgIGdldCBNZXNzYWdlQ29udGVudENvbXBvbmVudCgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0UHJvcHMgJiYgbS5kZWZhdWx0UHJvcHMuaGFzT3duUHJvcGVydHkoXCJkaXNhYmxlQnV0dG9uc1wiKSk7fVxyXG4gICAgZ2V0IE1lc3NhZ2VDb21wb25lbnQoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdCAmJiBtLmRlZmF1bHQuZGlzcGxheU5hbWUgJiYgbS5kZWZhdWx0LmRpc3BsYXlOYW1lID09IFwiTWVzc2FnZVwiKTt9XHJcbiAgICBnZXQgVGltZUZvcm1hdHRlcigpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImRhdGVGb3JtYXRcIl0pO31cclxuICAgIGdldCBUb29sdGlwV3JhcHBlcigpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIlRvb2x0aXBcIik7fVxyXG4gICAgZ2V0IE5hdGl2ZU1vZHVsZSgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInNldEJhZGdlXCJdKTt9XHJcbiAgICBnZXQgSW52aXRlQWN0aW9ucygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImFjY2VwdEludml0ZVwiXSk7fVxyXG4gICAgZ2V0IEd1aWxkQWN0aW9ucygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImxlYXZlR3VpbGRcIl0pO31cclxuICAgIGdldCBUb29sdGlwcygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5oaWRlICYmIG0uc2hvdyAmJiAhbS5zZWFyY2ggJiYgIW0uc3VibWl0ICYmICFtLnNlYXJjaCAmJiAhbS5hY3RpdmF0ZVJhZ2luZ0RlbW9uICYmICFtLmRpc21pc3MpO31cclxuICAgIGdldCBLZXlHZW5lcmF0b3IoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZChtID0+IG0udG9TdHJpbmcgJiYgL1wiYmluYXJ5XCIvLnRlc3QobS50b1N0cmluZygpKSk7fVxyXG4gICAgZ2V0IExheWVyU3RhY2soKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJwb3BMYXllclwiXSk7fVxyXG4gICAgZ2V0IFVzZXJTdG9yZSgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldEN1cnJlbnRVc2VyXCJdKTt9XHJcbiAgICBnZXQgQ2hhbm5lbFN0b3JlKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZ2V0Q2hhbm5lbFwiXSk7fVxyXG4gICAgZ2V0IENoYW5uZWxBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wib3BlblByaXZhdGVDaGFubmVsXCJdKTt9XHJcbiAgICBnZXQgUHJpdmF0ZUNoYW5uZWxBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wic2VsZWN0UHJpdmF0ZUNoYW5uZWxcIl0pO31cclxuXHJcbiAgICBvcGVuRE0odXNlcklkKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZklkID0gdGhpcy5Vc2VyU3RvcmUuZ2V0Q3VycmVudFVzZXIoKS5pZDtcclxuICAgICAgICBpZiAoc2VsZklkID09IHVzZXJJZCkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHByaXZhdGVDaGFubmVsSWQgPSB0aGlzLkNoYW5uZWxTdG9yZS5nZXRETUZyb21Vc2VySWQodXNlcklkKTtcclxuICAgICAgICBpZiAocHJpdmF0ZUNoYW5uZWxJZCkgcmV0dXJuIHRoaXMuUHJpdmF0ZUNoYW5uZWxBY3Rpb25zLnNlbGVjdFByaXZhdGVDaGFubmVsKHByaXZhdGVDaGFubmVsSWQpO1xyXG4gICAgICAgIHRoaXMuQ2hhbm5lbEFjdGlvbnMub3BlblByaXZhdGVDaGFubmVsKHNlbGZJZCwgdXNlcklkKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXJzZVNldHRpbmdzKGNhdCkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhzZXR0aW5ncykucmVkdWNlKChhcnIsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nID0gc2V0dGluZ3Nba2V5XTtcclxuICAgICAgICAgICAgaWYgKHNldHRpbmcuY2F0ID09PSBjYXQgJiYgc2V0dGluZy5pbXBsZW1lbnRlZCAmJiAhc2V0dGluZy5oaWRkZW4pIHtcclxuICAgICAgICAgICAgICAgIHNldHRpbmcudGV4dCA9IGtleTtcclxuICAgICAgICAgICAgICAgIGFyci5wdXNoKHNldHRpbmcpO1xyXG4gICAgICAgICAgICB9IHJldHVybiBhcnI7XHJcbiAgICAgICAgfSwgW10pO1xyXG4gICAgfVxyXG5cclxufTsiLCJpbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5jb25zdCBzdHlsZSA9IGBcclxuICAgIC5jb250YWluZXItMlJsMDF1IHtcclxuICAgICAgICBkaXNwbGF5OiBub25lIWltcG9ydGFudDtcclxuICAgIH1cclxuXHJcbiAgICAuY2hhdC0zYlJ4eHUge1xyXG4gICAgICAgIGRpc3BsYXk6IG5vbmUhaW1wb3J0YW50O1xyXG4gICAgfVxyXG5cclxuICAgIC5zaWRlYmFyLTJLOHBGaCB7XHJcbiAgICAgICAgZmxleC1ncm93OiAxIWltcG9ydGFudDtcclxuICAgIH1cclxuYDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBWb2ljZU1vZGUge1xyXG4gICAgc3RhcnQoKSB7XHJcbiAgICAgICAgRE9NLmFkZFN0eWxlKFwiVm9pY2VNb2RlXCIsIHN0eWxlKTtcclxuICAgIH1cclxuXHJcbiAgICBzdG9wKCkge1xyXG4gICAgICAgIERPTS5yZW1vdmVTdHlsZShcIlZvaWNlTW9kZVwiKTtcclxuICAgIH1cclxufTsiLCJjb25zdCByZXEgPSB3ZWJwYWNrSnNvbnAucHVzaChbW10sIHtfX2V4dHJhX2lkX186IChtb2R1bGUsIGV4cG9ydHMsIHJlcSkgPT4gbW9kdWxlLmV4cG9ydHMgPSByZXF9LCBbW1wiX19leHRyYV9pZF9fXCJdXV0pO1xyXG5kZWxldGUgcmVxLm0uX19leHRyYV9pZF9fO1xyXG5kZWxldGUgcmVxLmMuX19leHRyYV9pZF9fO1xyXG5jb25zdCBmaW5kID0gKGZpbHRlcikgPT4ge1xyXG4gICAgZm9yIChjb25zdCBpIGluIHJlcS5jKSB7XHJcbiAgICAgICAgaWYgKHJlcS5jLmhhc093blByb3BlcnR5KGkpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG0gPSByZXEuY1tpXS5leHBvcnRzO1xyXG4gICAgICAgICAgICBpZiAobSAmJiBtLl9fZXNNb2R1bGUgJiYgbS5kZWZhdWx0ICYmIGZpbHRlcihtLmRlZmF1bHQpKSByZXR1cm4gbS5kZWZhdWx0O1xyXG4gICAgICAgICAgICBpZiAobSAmJiBmaWx0ZXIobSkpXHRyZXR1cm4gbTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBjb25zb2xlLndhcm4oXCJDYW5ub3QgZmluZCBsb2FkZWQgbW9kdWxlIGluIGNhY2hlXCIpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5jb25zdCBmaW5kQWxsID0gKGZpbHRlcikgPT4ge1xyXG4gICAgY29uc3QgbW9kdWxlcyA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBpIGluIHJlcS5jKSB7XHJcbiAgICAgICAgaWYgKHJlcS5jLmhhc093blByb3BlcnR5KGkpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG0gPSByZXEuY1tpXS5leHBvcnRzO1xyXG4gICAgICAgICAgICBpZiAobSAmJiBtLl9fZXNNb2R1bGUgJiYgbS5kZWZhdWx0ICYmIGZpbHRlcihtLmRlZmF1bHQpKSBtb2R1bGVzLnB1c2gobS5kZWZhdWx0KTtcclxuICAgICAgICAgICAgZWxzZSBpZiAobSAmJiBmaWx0ZXIobSkpIG1vZHVsZXMucHVzaChtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbW9kdWxlcztcclxufTtcclxuXHJcbmNvbnN0IGZpbmRCeVByb3BzID0gKC4uLnByb3BOYW1lcykgPT4gZmluZChtb2R1bGUgPT4gcHJvcE5hbWVzLmV2ZXJ5KHByb3AgPT4gbW9kdWxlW3Byb3BdICE9PSB1bmRlZmluZWQpKTtcclxuY29uc3QgZmluZEJ5UHJvdG90eXBlcyA9ICguLi5wcm90b05hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBtb2R1bGUucHJvdG90eXBlICYmIHByb3RvTmFtZXMuZXZlcnkocHJvdG9Qcm9wID0+IG1vZHVsZS5wcm90b3R5cGVbcHJvdG9Qcm9wXSAhPT0gdW5kZWZpbmVkKSk7XHJcbmNvbnN0IGZpbmRCeURpc3BsYXlOYW1lID0gKGRpc3BsYXlOYW1lKSA9PiBmaW5kKG1vZHVsZSA9PiBtb2R1bGUuZGlzcGxheU5hbWUgPT09IGRpc3BsYXlOYW1lKTtcclxuXHJcbmxldCBtb2QgPSAge2ZpbmQsIGZpbmRBbGwsIGZpbmRCeVByb3BzLCBmaW5kQnlQcm90b3R5cGVzLCBmaW5kQnlEaXNwbGF5TmFtZX07XHJcbmV4cG9ydCBkZWZhdWx0IG1vZFxyXG5cclxud2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLldlYnBhY2tNb2R1bGVzID0gbW9kIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnVnSHVudGVyQmFkZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLnByb3BzXHJcblxyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAzMS4zIDI5LjVcIiB7Li4ucHJvcHMuc3ZnfSBoZWlnaHQ9XCIxMDAlXCI+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIyLjggMXMxMiA4LjIgNy40IDE5LjdTMTYuNiAyOSAyMCAyNS42cy00LTUuNi04LjctMTBMMjIuOCAxXCIgZmlsbD1cInJnYmEoMjI3LDYsMTksLjYpXCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjIuMSAxMi4zYy0yLjUgMy4yLTYuMSA0LjgtOC45IDQuM0wzLjYgMjguOGMtLjcuOS0xLjkgMS0yLjguMy0uOS0uNy0xLTEuOS0uNC0yLjhMMTAgMTQuMWMtMS4zLTIuNS0uNi02LjQgMi05LjcgMy4yLTQgOC01LjUgMTAuOC0zLjRzMi40IDcuMi0uNyAxMS4zelwiIGZpbGw9XCIjZTMwNjEzXCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgKVxyXG4gICAgfSBcclxufSIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIENpcmN1cyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICByZXR1cm4gKDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMzYgMzZcIiAgey4uLnRoaXMucHJvcHMuc3ZnfSBoZWlnaHQ9XCIxMDAlXCI+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjREQyRTQ0XCJcclxuICAgICAgICAgICAgICAgICAgICBkPVwiTTMzIDMzYTIgMiAwIDAxLTIgMkg1YTIgMiAwIDAxLTItMmwxLTEyaDI4bDEgMTJ6XCJcclxuICAgICAgICAgICAgICAgID48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRUE1OTZFXCJcclxuICAgICAgICAgICAgICAgICAgICBkPVwiTTEzIDM1Yy0uNzkyLTEuODc1LTEuNzUtMy4yOTEtMy40MTctNC42NjYgMS43NS0xLjQ1OSA0LjU0Mi01LjUgNS4yNS04LjI5MnMyLjc1IDguMTI1IDIuMDQyIDEwLjYyNVMxMyAzNSAxMyAzNXptMTAuMzAzIDBjLjc5MS0xLjg3NSAxLjc1LTMuMjkxIDMuNDE2LTQuNjY2LTEuNzUtMS40NTktNC41NDEtNS41LTUuMjUtOC4yOTItLjcwNy0yLjc5Mi0yLjc1IDguMTI1LTIuMDQgMTAuNjI1LjcwOCAyLjUgMy44NzQgMi4zMzMgMy44NzQgMi4zMzN6XCJcclxuICAgICAgICAgICAgICAgID48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjQkUxOTMxXCJcclxuICAgICAgICAgICAgICAgICAgICBkPVwiTTMuNzI4IDI0LjI2M0EyLjUgMi41IDAgMDA4IDIyLjVjMC0uNTY1LS4xOTUtMS4wODEtLjUxMS0xLjVINGwtLjI3MiAzLjI2M3ptMjguNTQ0IDBMMzIgMjFoLTMuNDg5QTIuNDgyIDIuNDgyIDAgMDAyOCAyMi41YTIuNSAyLjUgMCAwMDQuMjcyIDEuNzYzelwiXHJcbiAgICAgICAgICAgICAgICA+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjE0XCIgY3k9XCIyM1wiIHI9XCIyXCIgZmlsbD1cIiNCRTE5MzFcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIyMlwiIGN5PVwiMjNcIiByPVwiMlwiIGZpbGw9XCIjQkUxOTMxXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTBcIiBjeT1cIjIzXCIgcj1cIjJcIiBmaWxsPVwiI0JFMTkzMVwiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjI2XCIgY3k9XCIyM1wiIHI9XCIyXCIgZmlsbD1cIiNCRTE5MzFcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjMgMzVIMTNzMi02IDItMTNoNmMwIDcgMiAxMyAyIDEzek0xNyAyaDJ2N2gtMnpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNTVBQ0VFXCJcclxuICAgICAgICAgICAgICAgICAgICBkPVwiTTE4LjgzOC4yMDZDMTcuNjY3LjA0MiAxNyAuMzE4IDE3IDEuNDE4djFjMCAxLjEuODY1IDEuNzUzIDEuOTIzIDEuNDUxbDUuMTU0LS45MDFjMS43MTUtLjM0MyAxLjU0OC0xLjU5My4wODUtMS44ODRMMTguODM4LjIwNnpcIlxyXG4gICAgICAgICAgICAgICAgPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNDQ0Q2RERcIlxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMTggNmwtLjA4MS4xMjNDMTAuOTM4IDE2Ljk4MSAzIDE1LjAxNSAzIDE5djIuNWEyLjUgMi41IDAgMDA0Ljk1LjVIMTJhMiAyIDAgMDA0IDBoNGEyIDIgMCAwMDQgMGg0LjA1YTIuNSAyLjUgMCAwMDQuOTUtLjVWMTljMC00LTgtMi0xNS0xM3pcIlxyXG4gICAgICAgICAgICAgICAgPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDxnIGZpbGw9XCIjRjVGOEZBXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNy45NDggNi4wNzhsLS4wMy4wNDVDMTcuMTMyIDExLjYxOSAxMC44MTEgMTYuMTI2IDggMTh2NGEyIDIgMCAwMDQgMHYtNGMuOTgyLS45ODIgNS44MTMtNi43ODcgNS45ODQtMTEuNzMyLS4wMS0uMDY0LS4wMjctLjEyNi0uMDM2LS4xOXptLjA4LjM5OEMxOC4zMjQgMTEuMzc0IDIzLjAzMSAxNy4wMzEgMjQgMTh2NGEyIDIgMCAwMDQgMHYtNGMtMi43NS0xLjgzMy04Ljk1My02LjE5LTkuOTcyLTExLjUyNHpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNy45ODQgNi4yN0MxNy45MjIgOC4zNDYgMTcuNjA2IDE2LjM5NCAxNiAxOHY0YTIgMiAwIDAwNCAwdi00Yy0xLjU2NC0xLjU2NC0xLjkwNS05LjI0MS0xLjk3OS0xMS41NTktLjAxMS0uMDU3LS4wMjctLjExMy0uMDM3LS4xNzF6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICApXHJcbiAgICB9IFxyXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlnaHRjb3JkTG9nbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMucHJvcHNcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTY4IDE2OC42OVwiIHsuLi5wcm9wc30gaGVpZ2h0PVwiMTAwJVwiIHdpZHRoPXtwcm9wcy5zaXplfT5cclxuICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaW5lYXJHcmFkaWVudCBpZD1cInByZWZpeF9fYVwiIHgxPXs2Ni43fSB5MT17LTQ4Ny43fSB4Mj17NjYuN30geTI9ey01MDguNzN9IGdyYWRpZW50VHJhbnNmb3JtPVwibWF0cml4KDEgMCAwIC0xIDAgLTQwOClcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PXswfSBzdG9wQ29sb3I9XCIjZTMwNjEzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PXsxfSBzdG9wQ29sb3I9XCIjNzMxYTE0XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpbmVhckdyYWRpZW50PlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaW5lYXJHcmFkaWVudCBpZD1cInByZWZpeF9fYlwiIHgxPXsxMDEuN30geTE9ey00ODcuN30geDI9ezEwMS43fSB5Mj17LTUwOC43M30gZ3JhZGllbnRUcmFuc2Zvcm09XCJtYXRyaXgoMSAwIDAgLTEgMCAtNDA4KVwiIGdyYWRpZW50VW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezB9IHN0b3BDb2xvcj1cIiNlMjA2MTNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezF9IHN0b3BDb2xvcj1cIiM3MzFhMTNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGluZWFyR3JhZGllbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPVwicHJlZml4X19jXCIgeDE9ezg0fSB5MT17LTQwOH0geDI9ezg0fSB5Mj17LTU3Ni42OX0gZ3JhZGllbnRUcmFuc2Zvcm09XCJtYXRyaXgoMSAwIDAgLTEgMCAtNDA4KVwiIGdyYWRpZW50VW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezB9IHN0b3BDb2xvcj1cIiNlMzA2MTNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezF9IHN0b3BDb2xvcj1cIiM3MzFhMTNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGluZWFyR3JhZGllbnQ+XHJcbiAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwiI2ZmZlwiIGQ9XCJNMTQuOSAzNS4zaDEzOS4yVjEzM0gxNC45elwiIC8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTY2LjcgNzkuN2MtNS40IDAtOS44IDQuNy05LjggMTAuNXM0LjQgMTAuNSA5LjggMTAuNSA5LjgtNC43IDkuOC0xMC41LTQuNC0xMC41LTkuOC0xMC41elwiIGZpbGw9XCJ1cmwoI3ByZWZpeF9fYSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMDEuNyA3OS43Yy01LjQgMC05LjggNC43LTkuOCAxMC41czQuNCAxMC41IDkuOCAxMC41IDkuOC00LjcgOS44LTEwLjUtNC40LTEwLjUtOS44LTEwLjV6XCIgZmlsbD1cInVybCgjcHJlZml4X19iKVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAgMHYxNjhsMTY4IC42OVYwem0xMTEuMyAxMjQuMXMtMy40LTQuMS02LjMtNy43YzEyLjYtMy41IDE3LjQtMTEuMyAxNy40LTExLjNhNTIuNTIgNTIuNTIgMCAwMS0xMS4xIDUuNiA2OC42MyA2OC42MyAwIDAxLTM4LjkgNCA3MC4xMiA3MC4xMiAwIDAxLTE0LjEtNC4xIDQ4Ljg4IDQ4Ljg4IDAgMDEtNy4xLTMuM2MtLjMtLjItLjYtLjMtLjktLjVhLjc2Ljc2IDAgMDAtLjQtLjJjLTEuNy0xLTIuNi0xLjYtMi42LTEuNnM0LjYgNy42IDE2LjggMTEuMmMtMi45IDMuNi02LjQgNy45LTYuNCA3LjktMjEuMi0uNi0yOS4zLTE0LjUtMjkuMy0xNC41IDAtMzAuNiAxMy44LTU1LjQgMTMuOC01NS40IDEzLjgtMTAuMyAyNi45LTEwIDI2LjktMTBsMSAxLjFDNTIuOCA1MC4zIDQ1IDU3LjkgNDUgNTcuOWE1Ni4yIDU2LjIgMCAwMTUuNy0yLjcgNzIuMTkgNzIuMTkgMCAwMTIxLjgtNiA4Ljc1IDguNzUgMCAwMTEuNi0uMiA4OS4xIDg5LjEgMCAwMTE5LjQtLjIgNzguNDUgNzguNDUgMCAwMTI4LjkgOS4xcy03LjUtNy4yLTIzLjktMTIuMWwxLjMtMS41czEzLjEtLjMgMjYuOSAxMGMwIDAgMTMuOCAyNC44IDEzLjggNTUuNC4xLS4xLTggMTMuOC0yOS4yIDE0LjR6XCIgZmlsbD1cInVybCgjcHJlZml4X19jKVwiIC8+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIClcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBWMkNfU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi9zZXR0aW5nc1RpdGxlXCI7XHJcblxyXG4vKipcclxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCJyZWFjdFwiKX1cclxuICovXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmxldCBtYXJnaW5Nb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXVxyXG5sZXQgY29sb3JNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXVxyXG5sZXQgc2l6ZU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF1cclxubGV0IHNjcm9sbGJhck1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lKVswXVxyXG5jb25zdCBHdWlsZE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEd1aWxkcylbMF0uZGVmYXVsdFxyXG5jb25zdCByZWxhdGlvblNoaXBNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRSZWxhdGlvbnNoaXBzKVswXS5kZWZhdWx0XHJcbmNvbnN0IHNlc3Npb25Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRTZXNzaW9ucylbMF0uZGVmYXVsdFxyXG5jb25zdCB1c2VyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdLmRlZmF1bHRcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19BY2NvdW50SW5mb3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGlmKCFtYXJnaW5Nb2R1bGUyKW1hcmdpbk1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdXHJcbiAgICAgICAgaWYoIWNvbG9yTW9kdWxlKWNvbG9yTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF1cclxuICAgICAgICBpZighc2l6ZU1vZHVsZSlzaXplTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXVxyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIDxWMkNfU2V0dGluZ3NUaXRsZSB0ZXh0PVwiQWNjb3VudCBJbmZvc1wiLz4sXHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgIFByb2ZpbGVcclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICA8Q29kZUNvbnRlbnQgY29udGVudD17dGhpcy5nZXRQcm9maWxlVmFsdWUoKX0gbGFuZ3VhZ2U9XCJkaWZmXCIgLz5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XHJcbiAgICAgICAgICAgICAgICAgICAgU3RhdGlzdGljc1xyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIDxDb2RlQ29udGVudCBjb250ZW50PXt0aGlzLmdldFN0YXRpc3RpY3MoKX0gbGFuZ3VhZ2U9XCJkaWZmXCIgLz5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XHJcbiAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGVkIFNlc3Npb25zXHJcbiAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgPENvZGVDb250ZW50IGNvbnRlbnQ9e3RoaXMuZ2V0U2Vzc2lvblZhbHVlKCl9IGxhbmd1YWdlPVwiZGlmZlwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PixcclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e0JETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXS5tYXJnaW5Cb3R0b20yMH0+PC9kaXY+XHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIGdldFNlc3Npb25WYWx1ZSgpe1xyXG4gICAgICAgIGNvbnN0IHNlc3Npb25zUmF3ID0gc2Vzc2lvbk1vZHVsZS5nZXRTZXNzaW9ucygpXHJcbiAgICAgICAgY29uc3Qgc2Vzc2lvbnMgPSBPYmplY3Qua2V5cyhzZXNzaW9uc1JhdykuZmlsdGVyKGUgPT4gZSAhPT0gXCJhbGxcIikubWFwKGUgPT4gc2Vzc2lvbnNSYXdbZV0pXHJcblxyXG4gICAgICAgIGlmKHNlc3Npb25zLmxlbmd0aCA9PT0gMClyZXR1cm4gXCItIE5vIHNlc3Npb24gZGV0ZWN0ZWQuIFBsZWFzZSB0cnkgaW4gYSBmZXcgc2Vjb25kc1wiXHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHNlc3Npb25zLm1hcChlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGArIGlkOiAke2Uuc2Vzc2lvbklkfVxyXG4rIG9zOiAke2UuY2xpZW50SW5mby5vc1swXS50b1VwcGVyQ2FzZSgpK2UuY2xpZW50SW5mby5vcy5zbGljZSgxKX1cclxuKyBjbGllbnQ6ICR7ZS5jbGllbnRJbmZvLmNsaWVudH1cclxuKyBzdGF0dXM6ICR7ZS5zdGF0dXN9XHJcbisgQWN0aXZpdGllczogJHtlLmFjdGl2aXRpZXMubGVuZ3RofWBcclxuICAgICAgICB9KS5qb2luKFwiXFxuXCIrXCItXCIucmVwZWF0KDM4KStcIlxcblwiKVxyXG4gICAgfVxyXG5cclxuICAgIGdldFByb2ZpbGVWYWx1ZSgpe1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSB1c2VyTW9kdWxlLmdldEN1cnJlbnRVc2VyKClcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAdHlwZSB7RGF0ZX1cclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBjcmVhdGVkQXQgPSB1c2VyLmNyZWF0ZWRBdFxyXG5cclxuICAgICAgICBsZXQgYXZhdGFyVVJMID0gdXNlci5hdmF0YXJVUkxcclxuICAgICAgICBpZih1c2VyLmF2YXRhciAmJiB1c2VyLmF2YXRhci5zdGFydHNXaXRoKFwiYV9cIikpe1xyXG4gICAgICAgICAgICBhdmF0YXJVUkwgPSB1c2VyLmdldEF2YXRhclVSTChcImdpZlwiKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoYXZhdGFyVVJMLnN0YXJ0c1dpdGgoXCIvXCIpKXtcclxuICAgICAgICAgICAgYXZhdGFyVVJMID0gXCJodHRwczovL2Rpc2NvcmQuY29tXCIrYXZhdGFyVVJMXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGF2YXRhclVSTC5lbmRzV2l0aChcIj9zaXplPTEyOFwiKSl7XHJcbiAgICAgICAgICAgIGF2YXRhclVSTCA9IGF2YXRhclVSTC5yZXBsYWNlKFwiP3NpemU9MTI4XCIsIFwiP3NpemU9NDA5NlwiKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGArIFVzZXJuYW1lOiAke3VzZXIudXNlcm5hbWV9XHJcbisgRGlzY3JpbWluYXRvcjogJHt1c2VyLmRpc2NyaW1pbmF0b3J9XHJcbisgVGFnOiAke3VzZXIudGFnfVxyXG4rIElEOiAke3VzZXIuaWR9XHJcbisgQXZhdGFyOiAke3VzZXIuYXZhdGFyfVxyXG4rIEF2YXRhciBVUkw6ICR7YXZhdGFyVVJMfVxyXG4rIENyZWF0aW9uIERhdGU6ICR7KGNyZWF0ZWRBdC5nZXREYXRlKCkpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfS8keyhjcmVhdGVkQXQuZ2V0TW9udGgoKSsxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKX0vJHsoY3JlYXRlZEF0LmdldEZ1bGxZZWFyKCkpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfSAke2NyZWF0ZWRBdC5nZXRIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfWggJHtjcmVhdGVkQXQuZ2V0TWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfW1pbiAke2NyZWF0ZWRBdC5nZXRTZWNvbmRzKCl9c1xyXG4rIEZsYWdzOiAke3VzZXIuZmxhZ3N9XHJcbisgSGFzIE5pdHJvOiAke3VzZXIuaGFzUHJlbWl1bVN1YnNjcmlwdGlvbiA/IFwiWWVzXCIgOiBcIk5vXCJ9XHJcbi0gRW1haWw6ICR7dXNlci5lbWFpbH1cclxuLSAyRkE6ICR7dXNlci5tZmFFbmFibGVkID8gXCJZZXNcIiA6IFwiTm9cIn1cclxuLSBIYXMgQmVlbiBPbiBNb2JpbGU6ICR7dXNlci5tb2JpbGUgPyBcIlllc1wiIDogXCJOb1wifVxyXG4tIFBob25lOiAke3VzZXIucGhvbmUgfHwgXCJOb25lXCJ9XHJcbi0gVmVyaWZpZWQ6ICR7dXNlci52ZXJpZmllZH1gXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3RhdGlzdGljcygpe1xyXG5cclxuICAgICAgICBjb25zdCBndWlsZHMgPSBPYmplY3QudmFsdWVzKEd1aWxkTW9kdWxlLmdldEd1aWxkcygpKVxyXG4gICAgICAgIGNvbnN0IHJlbGF0aW9ucyA9IE9iamVjdC5rZXlzKHJlbGF0aW9uU2hpcE1vZHVsZS5nZXRSZWxhdGlvbnNoaXBzKCkpXHJcbiAgICAgICAgY29uc3QgZnJpZW5kcyA9IHJlbGF0aW9ucy5maWx0ZXIoZSA9PiByZWxhdGlvblNoaXBNb2R1bGUuaXNGcmllbmQoZSkpXHJcbiAgICAgICAgY29uc3QgYmxvY2tlZCA9IHJlbGF0aW9ucy5maWx0ZXIoZSA9PiByZWxhdGlvblNoaXBNb2R1bGUuaXNCbG9ja2VkKGUpKVxyXG5cclxuICAgICAgICByZXR1cm4gYCsgU2VydmVyIENvdW50OiAke2d1aWxkcy5sZW5ndGh9IHNlcnZlcnNcclxuKyBSZWxhdGlvbnM6ICR7cmVsYXRpb25zLmxlbmd0aH0gcmVsYXRpb25zXHJcbisgRnJpZW5kcyBDb3VudDogJHtmcmllbmRzLmxlbmd0aH0gZnJpZW5kc1xyXG4tIEJsb2NrZWQgVXNlcnMgQ291bnQ6ICR7YmxvY2tlZC5sZW5ndGh9IGJsb2NrZWQgdXNlcnNgXHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5sZXQgaGlnaHRsaWdodEpTID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGlnaGxpZ2h0KVswXVxyXG5sZXQgbWVzc2FnZU1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJrdXApWzBdXHJcbmxldCBtZXNzYWdlTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1lc3NhZ2VDb250ZW50KVswXVxyXG5cclxuY2xhc3MgQ29kZUNvbnRlbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgaWYoIW1lc3NhZ2VNb2R1bGUxKW1lc3NhZ2VNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFya3VwKVswXVxyXG4gICAgICAgIGlmKCFtZXNzYWdlTW9kdWxlMiltZXNzYWdlTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1lc3NhZ2VDb250ZW50KVswXVxyXG4gICAgICAgIGlmKCFzY3JvbGxiYXJNb2R1bGUxKXNjcm9sbGJhck1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lKVswXVxyXG4gICAgICAgIGlmKCFoaWdodGxpZ2h0SlMpaGlnaHRsaWdodEpTID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGlnaGxpZ2h0KVswXVxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzcz17YCR7bWVzc2FnZU1vZHVsZTEubWFya3VwfSAke21lc3NhZ2VNb2R1bGUyLm1lc3NhZ2VDb250ZW50fWB9PlxyXG4gICAgICAgICAgICA8cHJlPlxyXG4gICAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9e2Ake3Njcm9sbGJhck1vZHVsZTEuc2Nyb2xsYmFyR2hvc3RIYWlybGluZX0gaGxqc2B9IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiBoaWdodGxpZ2h0SlMuaGlnaGxpZ2h0KHRoaXMucHJvcHMubGFuZ3VhZ2UsIHRoaXMucHJvcHMuY29udGVudCkudmFsdWV9fT5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2NvZGU+XHJcbiAgICAgICAgICAgIDwvcHJlPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17QkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tOClbMF0ubWFyZ2luQm90dG9tOH0+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59IiwiLy8gR29vZCBsdWNrIHRvIHJlYWQgbXkgY29kZSwgRXZlbiBtZSBjYW4ndCByZWFkIGl0IHByb3Blcmx5LlxyXG5cclxuaW1wb3J0IHsgc3RhdCB9IGZyb20gXCJmc1wiXHJcbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gXCIuLi9tb2R1bGVzL2Rpc3RhbnRcIlxyXG5pbXBvcnQgd2VicGFja01vZHVsZXMgZnJvbSBcIi4uL21vZHVsZXMvd2VicGFja01vZHVsZXNcIlxyXG5pbXBvcnQgeyByZW1vdGUgfSBmcm9tIFwiZWxlY3Ryb25cIlxyXG5pbXBvcnQgTWFyZ2luVG9wIGZyb20gXCIuL21hcmdpbnRvcFwiXHJcblxyXG5sZXQgZm9ybU1vZHVsZVxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcGlQcmV2aWV3IGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cylcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBzdGF0ZXM6IFtdXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGlmKCFmb3JtTW9kdWxlKWZvcm1Nb2R1bGUgPSB3ZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5Gb3JtU2VjdGlvbilcclxuICAgICAgICAvKiogXHJcbiAgICAgICAgICogQHR5cGUge0Z1bmN0aW9uW119XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgYWxsQ29tcG9uZW50cyA9IFsuLi5uZXcgU2V0KE9iamVjdC5rZXlzKHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMpLm1hcChlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHNbZV0pLm1hcChrID0+IHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHNbZV1ba10pXHJcbiAgICAgICAgfSkuZmxhdCgpKV1cclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICA8Zm9ybU1vZHVsZS5Gb3JtU2VjdGlvbiB0YWc9XCJoMlwiIHRpdGxlPVwiTGlnaHRjb3JkJ3MgQXBpIEF2YWlsbGFibGUgY29tcG9uZW50c1wiPlxyXG4gICAgICAgICAgICAgICAgPGZvcm1Nb2R1bGUuRm9ybVRleHQgdHlwZT1cImRlc2NyaXB0aW9uXCIgY2xhc3NOYW1lPVwiXCIgc2VsZWN0YWJsZT17ZmFsc2V9PlxyXG4gICAgICAgICAgICAgICAgICAgIFRoZXNlIGNvbXBvbmVudHMgYXJlIGhlcmUgZm9yIHRoZSBwbHVnaW4gZGV2cy4gVGhleSBjYW4gcXVpY2tseSBlbWJlZCBhbnkgY29tcG9uZW50IGJlbG93IHdpdGggdGhpcyBwYW5lbC5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7bWFyZ2luVG9wOiBcIjIwcHhcIn19PjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwiaW5mb1wiPkFsbCB0aGVzZSBjb21wb25lbnRzIGhhdmUgZXJyb3IgaGFuZGxpbmcuIElmIHlvdSB3YW50IG5vbmUsIGFkZCBgLm9yaWdpbmFsYCBhZnRlciB0aGUgY29tcG9uZW50IHBhdGguPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveD5cclxuICAgICAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3ggdHlwZT1cIndhcm5cIj5XZSBkbyBub3QgcmVjb21tZW5kIG1vZGlmeWluZyB0aGVzZSBjb21wb25lbnQgd2l0aCBwbHVnaW5zLiBPbmx5IGRvIHRoaXMgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLjwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3g+XHJcbiAgICAgICAgICAgICAgICA8L2Zvcm1Nb2R1bGUuRm9ybVRleHQ+XHJcbiAgICAgICAgICAgICAgICA8TWFyZ2luVG9wPjwvTWFyZ2luVG9wPlxyXG4gICAgICAgICAgICAgICAgPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uIGNvbG9yPVwiYnJhbmRcIiBsb29rPVwib3V0bGluZWRcIiBzaXplPVwibWVkaXVtXCIgaG92ZXJDb2xvcj1cImdyZWVuXCIgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZS5zaGVsbC5vcGVuRXh0ZXJuYWwoXCJodHRwczovL2xpZ2h0Y29yZC5kZXJva3UueHl6L0xpZ2h0Y29yZEFwaS9kb2NzXCIpXHJcbiAgICAgICAgICAgICAgICB9fSB3cmFwcGVyPXtmYWxzZX0+XHJcbiAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRhdGlvblxyXG4gICAgICAgICAgICAgICAgPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbj5cclxuICAgICAgICAgICAgPC9mb3JtTW9kdWxlLkZvcm1TZWN0aW9uPixcclxuICAgICAgICAgICAgYWxsQ29tcG9uZW50cy5tYXAoY29tcCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wTmFtZSA9IGNvbXAuZGlzcGxheU5hbWUgfHwgY29tcC5uYW1lXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wUGF0aCA9IGBMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuJHtPYmplY3Qua2V5cyh3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzKS5maW5kKGUgPT4gd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50c1tlXVtjb21wTmFtZV0pfS4ke2NvbXBOYW1lfWBcclxuICAgICAgICAgICAgICAgIHJldHVybiA8Q29tcG9uZW50UHJldmlldyBrZXk9e2NvbXBQYXRofSBjb21wPXtjb21wfSAvPlxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgcmVuZGVycygpe1xyXG5cclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgQ29tcG9uZW50UHJldmlldyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgdGFiOiBcInByZXZpZXdcIixcclxuICAgICAgICAgICAgZWxlbTogcHJvcHMuY29tcCxcclxuICAgICAgICAgICAgb3B0aW9uczoge31cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgY29uc3QgY29tcCA9IHRoaXMucHJvcHMuY29tcFxyXG4gICAgICAgIGxldCBBbGxQcmV2aWV3cyA9IFtdXHJcbiAgICAgICAgaWYoY29tcC5BbGxQcmV2aWV3cylBbGxQcmV2aWV3cyA9IGNvbXAuQWxsUHJldmlld3NcclxuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlXHJcbiAgICAgICAgbGV0IGdldFByb3BzID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZmluYWwgPSB7fVxyXG4gICAgICAgICAgICBBbGxQcmV2aWV3cy5mb3JFYWNoKGNhdGVnb3J5ID0+IHtcclxuICAgICAgICAgICAgICAgIGZpbmFsW09iamVjdC5rZXlzKGNhdGVnb3J5WzBdKVswXV0gPSBjYXRlZ29yeVswXVtPYmplY3Qua2V5cyhjYXRlZ29yeVswXSlbMF1dXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHN0YXRlLm9wdGlvbnMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgICAgIGZpbmFsW2tleV0gPSBBbGxQcmV2aWV3cy5maW5kKGUgPT4gZS5maW5kKGUgPT4gZVtrZXldKSlbc3RhdGUub3B0aW9uc1trZXldXVtrZXldXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHJldHVybiBmaW5hbFxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcmVuZGVyUHJldmlldyA9ICgpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIDxkaXYgc3R5bGU9e3ttYXJnaW46IFwiMjBweFwifX0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcInZhcigtLWJhY2tncm91bmQtc2Vjb25kYXJ5KVwiLCBcclxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIjMwcHggMzBweFwiLCBcclxuICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiOHB4XCJcclxuICAgICAgICAgICAgICAgIH19IGNsYXNzTmFtZT1cImxjLXRhYi1ib3gtc2hhZG93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAge1JlYWN0LmNyZWF0ZUVsZW1lbnQoY29tcCwgZ2V0UHJvcHMoKSl9XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByZW5kZXJDb2RlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gPGRpdiBzdHlsZT17e21hcmdpbjogXCIyMHB4XCJ9fT5cclxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tYmFja2dyb3VuZC1zZWNvbmRhcnkpXCIsIFxyXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMzBweCAzMHB4XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCI4cHhcIlxyXG4gICAgICAgICAgICAgICAgfX0gY2xhc3NOYW1lPVwibGMtdGFiLWJveC1zaGFkb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdTdWJUaXRsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgSlNYXHJcbiAgICAgICAgICAgICAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ1N1YlRpdGxlPlxyXG4gICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuRXJyb3JDYXRjaGVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7UmVhY3QuY3JlYXRlRWxlbWVudCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5Db2RlQmxvY2sgbGFuZ3VhZ2U9XCJqc3hcIiBjb250ZW50PXtnZW5lcmF0ZUNvZGUoXCJqc3hcIil9Lz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgICAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuRXJyb3JDYXRjaGVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ1N1YlRpdGxlPiAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWN0XHJcbiAgICAgICAgICAgICAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ1N1YlRpdGxlPlxyXG4gICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuRXJyb3JDYXRjaGVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7UmVhY3QuY3JlYXRlRWxlbWVudCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5Db2RlQmxvY2sgbGFuZ3VhZ2U9XCJqc1wiIGNvbnRlbnQ9e2dlbmVyYXRlQ29kZShcInJlYWN0XCIpfS8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkVycm9yQ2F0Y2hlcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGdldFN0ckZvclByb3AgPSAodmFsdWUsIGNvbXBQYXRoLCBsYW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIil7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVcclxuICAgICAgICAgICAgfWVsc2UgaWYodHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIil7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxyXG4gICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIil7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKVxyXG4gICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpe1xyXG4gICAgICAgICAgICAgICAgaWYodmFsdWUgJiYgdmFsdWUuJCR0eXBlb2YgJiYgKHZhbHVlLiQkdHlwZW9mID09PSBTeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKSB8fCB2YWx1ZS4kJHR5cGVvZiA9PT0gMHhlYWM3KSl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoY29tcFBhdGggPT09IFwiTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuVGFic1wiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYobGFuZyA9PT0gXCJyZWFjdFwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7c3R5bGU6IHtcclxubWFyZ2luVG9wOiBcIjIwcHhcIiwgbWFyZ2luQm90dG9tOiBcIjIwcHhcIlxyXG59fSxcclxuUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7c3R5bGU6IHtcclxuYmFja2dyb3VuZENvbG9yOiBcInZhcigtLWJhY2tncm91bmQtc2Vjb25kYXJ5KVwiLFxyXG5wYWRkaW5nOiBcIjMwcHggMzBweFwiLFxyXG5ib3JkZXJSYWRpdXM6IFwiOHB4XCJcclxufSwgY2xhc3NOYW1lOiBcImxjLXRhYi1ib3gtc2hhZG93XCIgfSxcclxuUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UaXRsZSwgbnVsbCwgXCJQcmV2aWV3IHRhYnNcIilcclxuKVxyXG4pYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihsYW5nID09PSBcImpzeFwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgPGRpdiBzdHlsZT17e1xyXG5tYXJnaW5Ub3A6IFwiMjBweFwiLCBtYXJnaW5Cb3R0b206IFwiMjBweFwiXHJcbn19PlxyXG48ZGl2IHN0eWxlPXt7XHJcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tYmFja2dyb3VuZC1zZWNvbmRhcnkpXCIsIFxyXG4gICAgcGFkZGluZzogXCIzMHB4IDMwcHhcIiwgXHJcbiAgICBib3JkZXJSYWRpdXM6IFwiOHB4XCJcclxufX0gY2xhc3NOYW1lPVwibGMtdGFiLWJveC1zaGFkb3dcIj5cclxuICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UaXRsZT5QcmV2aWV3IHRhYnM8L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlRpdGxlPlxyXG48L2Rpdj5cclxuPC9kaXY+YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIllvdXIgY29tcG9uZW50cyBoZXJlLlwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIFwiICAgIFwiKVxyXG4gICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgZ2VuZXJhdGVDb2RlID0gZnVuY3Rpb24obGFuZyl7IC8vIGNvZGUgZm9ybWF0dGluZyBpcyBoYXJkXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBOYW1lID0gY29tcC5kaXNwbGF5TmFtZSB8fCBjb21wLm5hbWVcclxuICAgICAgICAgICAgbGV0IGNhdGVnb3JpZXMgPSBPYmplY3Qua2V5cyh3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzKVxyXG4gICAgICAgICAgICBjb25zdCBjb21wQ2F0ZWdvcnkgPSBjYXRlZ29yaWVzLmZpbmQoZSA9PiB3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzW2VdW2NvbXBOYW1lXSlcclxuICAgICAgICAgICAgY29uc3QgY29tcFBhdGggPSBgTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLiR7Y29tcENhdGVnb3J5fS4ke2NvbXBOYW1lfWBcclxuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBnZXRQcm9wcygpXHJcblxyXG4gICAgICAgICAgICBpZihsYW5nID09PSBcImpzeFwiKXtcclxuICAgICAgICAgICAgICAgIGxldCBwcm9wU3RyaW5ncyA9IFtdXHJcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW5Qcm9wID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocHJvcHMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZihrZXkgPT0gXCJjaGlsZHJlblwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5Qcm9wID0gZ2V0U3RyRm9yUHJvcChwcm9wc1trZXldLCBjb21wUGF0aCwgbGFuZylcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ciA9IGtleStcIj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgcHJvcHNba2V5XSA9PT0gXCJzdHJpbmdcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gSlNPTi5zdHJpbmdpZnkocHJvcHNba2V5XSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gYHske2dldFN0ckZvclByb3AocHJvcHNba2V5XSwgY29tcFBhdGgsIGxhbmcpfX1gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcFN0cmluZ3MucHVzaChzdHIpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIGxldCBvcGVuVGFnXHJcbiAgICAgICAgICAgICAgICBpZihjaGlsZHJlblByb3Ape1xyXG4gICAgICAgICAgICAgICAgICAgIG9wZW5UYWcgPSBgPCR7Y29tcFBhdGh9ICR7cHJvcFN0cmluZ3Muam9pbihcIiBcIil9PmBcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2xvc2VUYWcgPSBgPC8ke2NvbXBQYXRofT5gXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke29wZW5UYWd9XFxuICAgICR7Y2hpbGRyZW5Qcm9wfVxcbiR7Y2xvc2VUYWd9YFxyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgb3BlblRhZyA9IGA8JHtjb21wUGF0aH0gJHtwcm9wU3RyaW5ncy5qb2luKFwiIFwiKX0vPmBcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3BlblRhZ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9ZWxzZSBpZihsYW5nID09PSBcInJlYWN0XCIpe1xyXG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4gfHwgbnVsbFxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHByb3BzLmNoaWxkcmVuXHJcbiAgICAgICAgICAgICAgICBpZihjaGlsZHJlbiAmJiBjaGlsZHJlbi4kJHR5cGVvZiAmJiAoY2hpbGRyZW4uJCR0eXBlb2YgPT09IFN5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpIHx8IGNoaWxkcmVuLiQkdHlwZW9mID09PSAweGVhYzcpKXtcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGdldFN0ckZvclByb3AoY2hpbGRyZW4sIGNvbXBQYXRoLCBsYW5nKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHByb3BTdHJpbmdzID0gW11cclxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHByb3BzKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZpc2libGVLZXkgPSAvW15cXHdcXGRfXS9nLnRlc3Qoa2V5KSA/IEpTT04uc3RyaW5naWZ5KGtleSkgOiBrZXlcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc3RyID0gdmlzaWJsZUtleStcIjogXCJcclxuICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgcHJvcHNba2V5XSA9PT0gXCJzdHJpbmdcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBKU09OLnN0cmluZ2lmeShwcm9wc1trZXldKVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gZ2V0U3RyRm9yUHJvcChwcm9wc1trZXldLCBjb21wUGF0aCwgbGFuZykuc3BsaXQoXCJcXG5cIikubWFwKChzdHIsIGkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGkgPT09IDApcmV0dXJuIHN0clxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiICAgIFwiICsgc3RyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oXCJcXG5cIilcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcFN0cmluZ3MucHVzaChzdHIpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgbGV0IHByb3BPYmplY3QgPSBcIntcIlxyXG4gICAgICAgICAgICAgICAgaWYocHJvcFN0cmluZ3MubGVuZ3RoKXtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wU3RyaW5ncy5mb3JFYWNoKChzdHIsIGkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlzTGFzdCA9IGkgPT09IHByb3BTdHJpbmdzLmxlbmd0aCAtIDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlzRmlyc3QgPSBpID09PSAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpc0ZpcnN0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BPYmplY3QgKz0gXCIsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wT2JqZWN0ICs9IFwiXFxuICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BPYmplY3QgKz0gc3RyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzTGFzdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wT2JqZWN0ICs9XCJcXG59XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wT2JqZWN0ICs9IFwifVwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW5EYXRhID0gdHlwZW9mIGNoaWxkcmVuID09PSBcInN0cmluZ1wiICYmIGNoaWxkcmVuLnN0YXJ0c1dpdGgoXCJSZWFjdC5jcmVhdGVFbGVtZW50XCIpID8gY2hpbGRyZW4gOiBKU09OLnN0cmluZ2lmeShjaGlsZHJlbilcclxuICAgICAgICAgICAgICAgIHJldHVybiBgUmVhY3QuY3JlYXRlRWxlbWVudCgke2NvbXBQYXRofSwgJHtwcm9wT2JqZWN0fSwgJHtjaGlsZHJlbkRhdGF9KWBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaGVscCA9IGNvbXAuaGVscCB8fCB7fVxyXG4gICAgICAgIGxldCBpbmZvID0gaGVscC5pbmZvID8gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwiaW5mb1wiPlxyXG4gICAgICAgICAgICB7aGVscC5pbmZvfVxyXG4gICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcclxuICAgICAgICBsZXQgd2FybiA9IGhlbHAud2FybiA/IDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3ggdHlwZT1cIndhcm5cIj5cclxuICAgICAgICAgICAge2hlbHAud2Fybn1cclxuICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveD4gOiBudWxsXHJcbiAgICAgICAgbGV0IGRhbmdlciA9IGhlbHAuZGFuZ2VyID8gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwiZGFuZ2VyXCI+XHJcbiAgICAgICAgICAgIHtoZWxwLmRhbmdlcn1cclxuICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveD4gOiBudWxsXHJcbiAgICAgICAgbGV0IGVycm9yID0gaGVscC5lcnJvciA/IDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3ggdHlwZT1cImVycm9yXCI+XHJcbiAgICAgICAgICAgIHtoZWxwLmVycm9yfVxyXG4gICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcclxuICAgICAgICBsZXQgc3VjY2VzcyA9IGhlbHAuc3VjY2VzcyA/IDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3ggdHlwZT1cInN1Y2Nlc3NcIj5cclxuICAgICAgICAgICAge2hlbHAuc3VjY2Vzc31cclxuICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveD4gOiBudWxsXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2PlxyXG4gICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdzVGl0bGU+XHJcbiAgICAgICAgICAgICAgICB7Y29tcC5kaXNwbGF5TmFtZSB8fCBjb21wLm5hbWV9XHJcbiAgICAgICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdzVGl0bGU+XHJcbiAgICAgICAgICAgIHtpbmZvfVxyXG4gICAgICAgICAgICB7c3VjY2Vzc31cclxuICAgICAgICAgICAge3dhcm59XHJcbiAgICAgICAgICAgIHtlcnJvcn1cclxuICAgICAgICAgICAge2Rhbmdlcn1cclxuICAgICAgICAgICAge0FsbFByZXZpZXdzLm1hcChjYXRlZ29yeSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZihjYXRlZ29yeVswXS5vbkNsaWNrKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICBpZihjYXRlZ29yeVswXS50ZXh0KXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICBpZihjYXRlZ29yeVswXS5jaGlsZHJlbilyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgaWYoY2F0ZWdvcnkubGVuZ3RoID09PSAxKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBPYmplY3Qua2V5cyhjYXRlZ29yeVswXSlbMF1cclxuICAgICAgICAgICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtrZXl9XHJcbiAgICAgICAgICAgICAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ1N1YlRpdGxlPixcclxuICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuRHJvcGRvd24gb3B0aW9ucz17Y2F0ZWdvcnkubWFwKChlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFwib3B0LVwiK2luZGV4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IEpTT04uc3RyaW5naWZ5KGVbT2JqZWN0LmtleXMoZSlbMF1dKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSl9IHZhbHVlPXtcIm9wdC1cIisoc3RhdGUub3B0aW9uc1trZXldIHx8IFwiMFwiKX0gb25DaGFuZ2U9eyh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLm9wdGlvbnMsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBba2V5XTogKHZhbHVlLnZhbHVlIHx8IFwiMFwiKS5yZXBsYWNlKFwib3B0LVwiLCBcIlwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9fSBzZWFyY2hhYmxlPXt0cnVlfS8+LFxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3ttYXJnaW5Cb3R0b206IFwiOHB4XCJ9fT48L2Rpdj5cclxuICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuVGFicyB0YWJzPXtbe2xhYmVsOiBcIlByZXZpZXdcIiwgaWQ6IFwicHJldmlld1wifSwge2xhYmVsOiBcIkNvZGVcIiwgaWQ6IFwiY29kZVwifV19IFxyXG4gICAgICAgICAgICAgICAgYWN0aXZlPXtzdGF0ZS50YWJ9IGNoaWxkcmVuPXtzdGF0ZS50YWIgPT09IFwicHJldmlld1wiID8gcmVuZGVyUHJldmlldygpIDogcmVuZGVyQ29kZSgpfSBvbkNoYW5nZT17KHRhYikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfX0vPlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufSIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4uL21vZHVsZXMvdXRpbHNcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi4vbW9kdWxlcy9kb210b29sc1wiO1xyXG5cclxuaW1wb3J0IFhTdmcgZnJvbSBcIi4veFN2Z1wiO1xyXG5pbXBvcnQgUmVsb2FkSWNvbiBmcm9tIFwiLi9yZWxvYWRJY29uXCI7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tIFwiLi9pY29ucy9lZGl0XCI7XHJcbmltcG9ydCBEZWxldGVJY29uIGZyb20gXCIuL2ljb25zL2RlbGV0ZVwiO1xyXG5pbXBvcnQgU3dpdGNoIGZyb20gXCIuL2NvbXBvbmVudHMvc3dpdGNoXCI7XHJcbmltcG9ydCBUb29sdGlwV3JhcCBmcm9tIFwiLi90b29sdGlwV3JhcFwiO1xyXG5pbXBvcnQgeyBwcm9jZXNzRmlsZSB9IGZyb20gXCIuLi9tb2R1bGVzL3BsdWdpbkNlcnRpZmllclwiO1xyXG5pbXBvcnQgY29udGVudE1hbmFnZXIgZnJvbSBcIi4uL21vZHVsZXMvY29udGVudE1hbmFnZXJcIjtcclxuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCJwYXRoXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcbmNvbnN0IGFuY2hvckNsYXNzZXMgPSBCRFYyLmFuY2hvckNsYXNzZXM7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfUGx1Z2luQ2FyZCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zaG93U2V0dGluZ3MgPSB0aGlzLnNob3dTZXR0aW5ncy5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbFN0YXRlKCk7XHJcbiAgICAgICAgdGhpcy5oYXNTZXR0aW5ncyA9IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luICYmIHR5cGVvZih0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXRTZXR0aW5nc1BhbmVsKSA9PT0gXCJmdW5jdGlvblwiO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZ3NQYW5lbCA9IFwiXCI7XHJcblxyXG4gICAgICAgIHRoaXMuZWRpdCA9IHRoaXMuZWRpdC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuZGVsZXRlID0gdGhpcy5kZWxldGUuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnJlbG9hZCA9IHRoaXMucmVsb2FkLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGNoZWNrZWQ6IHRoaXMucHJvcHMuZW5hYmxlZCxcclxuICAgICAgICAgICAgc2V0dGluZ3M6IGZhbHNlLFxyXG4gICAgICAgICAgICByZWxvYWRzOiAwLFxyXG4gICAgICAgICAgICB0cnVzdGVkOiBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd1NldHRpbmdzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5oYXNTZXR0aW5ncykgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3NldHRpbmdzOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2VTZXR0aW5ncygpIHtcclxuICAgICAgICB0aGlzLnBhbmVsUmVmLmN1cnJlbnQuaW5uZXJIVE1MID0gXCJcIjtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtzZXR0aW5nc09wZW46IGZhbHNlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5zZXR0aW5ncykgcmV0dXJuO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zZXR0aW5nc1BhbmVsID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVmcy5zZXR0aW5nc3BhbmVsLmFwcGVuZENoaWxkKHRoaXMuc2V0dGluZ3NQYW5lbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXNldHRpbmdzQ29va2llW1wiZm9yay1wcy0zXCJdKSByZXR1cm47XHJcbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaXNIaWRkZW4gPSAoY29udGFpbmVyLCBlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZighY29udGFpbmVyKXtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKG5ldyBFcnJvcihgQ29udGFpbmVyIGlzIHVuZGVmaW5lZC5gKSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNUb3AgPSBjb250YWluZXIuc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY0JvdHRvbSA9IGNUb3AgKyBjb250YWluZXIuY2xpZW50SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZVRvcCA9IGVsZW1lbnQub2Zmc2V0VG9wO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZUJvdHRvbSA9IGVUb3AgKyBlbGVtZW50LmNsaWVudEhlaWdodDtcclxuICAgICAgICAgICAgICAgIHJldHVybiAgKGVUb3AgPCBjVG9wIHx8IGVCb3R0b20gPiBjQm90dG9tKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRoaXNOb2RlID0gdGhpcy5yZWZzLmNhcmROb2RlO1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzTm9kZS5jbG9zZXN0KFwiZGl2W2NsYXNzKj1cXFwiY29udGVudFJlZ2lvblNjcm9sbGVyLVxcXCJdXCIpXHJcbiAgICAgICAgICAgIGlmICghaXNIaWRkZW4oY29udGFpbmVyLCB0aGlzTm9kZSkpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3QgdGhpc05vZGVPZmZzZXQgPSBET00ub2Zmc2V0KHRoaXNOb2RlKTtcclxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyT2Zmc2V0ID0gRE9NLm9mZnNldChjb250YWluZXIpO1xyXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbCA9IGNvbnRhaW5lci5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdGhpc05vZGVPZmZzZXQudG9wIC0gY29udGFpbmVyT2Zmc2V0LnRvcCArIGNvbnRhaW5lci5zY3JvbGxUb3AgLSAzMDtcclxuICAgICAgICAgICAgRE9NLmFuaW1hdGUoe1xyXG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMCxcclxuICAgICAgICAgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24ocHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZW5kUG9pbnQgPiBvcmlnaW5hbCkgY29udGFpbmVyLnNjcm9sbFRvcCA9IG9yaWdpbmFsICsgKHByb2dyZXNzICogKGVuZFBvaW50IC0gb3JpZ2luYWwpKTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGNvbnRhaW5lci5zY3JvbGxUb3AgPSBvcmlnaW5hbCAtIChwcm9ncmVzcyAqIChvcmlnaW5hbCAtIGVuZFBvaW50KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBnZXRTdHJpbmcodmFsdWUpIHtcclxuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gXCI/Pz9cIjtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNldHRpbmdzQ29tcG9uZW50KCkge1xyXG4gICAgICAgIHRyeSB7IHRoaXMuc2V0dGluZ3NQYW5lbCA9IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldFNldHRpbmdzUGFuZWwoKTsgfVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHsgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBcIlVuYWJsZSB0byBnZXQgc2V0dGluZ3MgcGFuZWwgZm9yIFwiICsgdGhpcy5uYW1lICsgXCIuXCIsIGVycik7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNhcmQgYmQtYWRkb24tY2FyZCBzZXR0aW5ncy1vcGVuIHVpLXN3aXRjaC1pdGVtXCIsIHJlZjogXCJjYXJkTm9kZVwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7c3R5bGU6IHtcImZsb2F0XCI6IFwicmlnaHRcIiwgXCJjdXJzb3JcIjogXCJwb2ludGVyXCJ9LCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcy5zZXR0aW5nc3BhbmVsLmlubmVySFRNTCA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe3NldHRpbmdzOiBmYWxzZX0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFhTdmcsIG51bGwpXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnNldHRpbmdzUGFuZWwgPT09IFwib2JqZWN0XCIgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogYHBsdWdpbi1zZXR0aW5ncy0ke3RoaXMubmFtZX1gLCBjbGFzc05hbWU6IFwicGx1Z2luLXNldHRpbmdzXCIsIHJlZjogXCJzZXR0aW5nc3BhbmVsXCJ9KSxcclxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuc2V0dGluZ3NQYW5lbCAhPT0gXCJvYmplY3RcIiAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBgcGx1Z2luLXNldHRpbmdzLSR7dGhpcy5uYW1lfWAsIGNsYXNzTmFtZTogXCJwbHVnaW4tc2V0dGluZ3NcIiwgcmVmOiBcInNldHRpbmdzcGFuZWxcIiwgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHtfX2h0bWw6IHRoaXMuc2V0dGluZ3NQYW5lbH19KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgYnVpbGRUaXRsZShuYW1lLCB2ZXJzaW9uLCBhdXRob3IpIHtcclxuICAgICAgICBjb25zdCB0aXRsZSA9IFwie3tuYW1lfX0gdnt7dmVyc2lvbn19IGJ5IHt7YXV0aG9yfX1cIi5zcGxpdCgvKHt7W0EtWmEtel0rfX0pLyk7XHJcbiAgICAgICAgY29uc3QgbmFtZUluZGV4ID0gdGl0bGUuZmluZEluZGV4KHMgPT4gcyA9PSBcInt7bmFtZX19XCIpO1xyXG4gICAgICAgIGlmIChuYW1lSW5kZXgpIHRpdGxlW25hbWVJbmRleF0gPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBcIm5hbWUgYmRhLW5hbWVcIn0sIG5hbWUpO1xyXG4gICAgICAgIGNvbnN0IHZlcnNpb25JbmRleCA9IHRpdGxlLmZpbmRJbmRleChzID0+IHMgPT0gXCJ7e3ZlcnNpb259fVwiKTtcclxuICAgICAgICBpZiAobmFtZUluZGV4KSB0aXRsZVt2ZXJzaW9uSW5kZXhdID0gUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJ2ZXJzaW9uIGJkYS12ZXJzaW9uXCJ9LCB2ZXJzaW9uKTtcclxuICAgICAgICBjb25zdCBhdXRob3JJbmRleCA9IHRpdGxlLmZpbmRJbmRleChzID0+IHMgPT0gXCJ7e2F1dGhvcn19XCIpO1xyXG4gICAgICAgIGlmIChuYW1lSW5kZXgpIHtcclxuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB7Y2xhc3NOYW1lOiBcImF1dGhvciBiZGEtYXV0aG9yXCJ9O1xyXG4gICAgICAgICAgICBpZiAoYXV0aG9yLmxpbmsgfHwgYXV0aG9yLmlkKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9wcy5jbGFzc05hbWUgKz0gYCAke2FuY2hvckNsYXNzZXMuYW5jaG9yfSAke2FuY2hvckNsYXNzZXMuYW5jaG9yVW5kZXJsaW5lT25Ib3Zlcn1gO1xyXG4gICAgICAgICAgICAgICAgcHJvcHMudGFyZ2V0ID0gXCJfYmxhbmtcIjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYXV0aG9yLmxpbmspIHByb3BzLmhyZWYgPSBhdXRob3IubGluaztcclxuICAgICAgICAgICAgICAgIGlmIChhdXRob3IuaWQpIHByb3BzLm9uQ2xpY2sgPSAoKSA9PiB7QkRWMi5MYXllclN0YWNrLnBvcExheWVyKCk7IEJEVjIub3BlbkRNKGF1dGhvci5pZCk7fTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aXRsZVthdXRob3JJbmRleF0gPSBSZWFjdC5jcmVhdGVFbGVtZW50KGF1dGhvci5saW5rIHx8IGF1dGhvci5pZCA/IFwiYVwiIDogXCJzcGFuXCIsIHByb3BzLCBhdXRob3IubmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aXRsZS5mbGF0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgbWFrZUxpbmsodGl0bGUsIHVybCkge1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0ge2NsYXNzTmFtZTogXCJiZGEtbGluayBiZGEtbGluay13ZWJzaXRlXCIsIHRhcmdldDogXCJfYmxhbmtcIn07XHJcbiAgICAgICAgaWYgKHR5cGVvZih1cmwpID09IFwic3RyaW5nXCIpIHByb3BzLmhyZWYgPSB1cmw7XHJcbiAgICAgICAgaWYgKHR5cGVvZih1cmwpID09IFwiZnVuY3Rpb25cIikgcHJvcHMub25DbGljayA9IChldmVudCkgPT4ge2V2ZW50LnByZXZlbnREZWZhdWx0KCk7IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB1cmwoKTt9O1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHByb3BzLCB0aXRsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbWFrZUJ1dHRvbih0aXRsZSwgY2hpbGRyZW4sIGFjdGlvbikge1xyXG4gICAgICAgIHJldHVybiA8VG9vbHRpcFdyYXAgY29sb3I9XCJibGFja1wiIHNpZGU9XCJ0b3BcIiB0ZXh0PXt0aXRsZX0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtYWRkb24tYnV0dG9uXCIgb25DbGljaz17YWN0aW9ufT57Y2hpbGRyZW59PC9kaXY+XHJcbiAgICAgICAgPC9Ub29sdGlwV3JhcD47XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKXtcclxuICAgICAgICB0aGlzLnVubW91bnRlZCA9IHRydWVcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbGlua3MoKSB7XHJcbiAgICAgICAgY29uc3QgbGlua3MgPSBbXTtcclxuICAgICAgICBjb25zdCBhZGRvbiA9IHRoaXMucHJvcHMuYWRkb247XHJcbiAgICAgICAgaWYgKGFkZG9uLndlYnNpdGUpIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIldlYnNpdGVcIiwgYWRkb24ud2Vic2l0ZSkpO1xyXG4gICAgICAgIGlmIChhZGRvbi5zb3VyY2UpIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIlNvdXJjZVwiLCBhZGRvbi5zb3VyY2UpKTtcclxuICAgICAgICBpZiAoYWRkb24uaW52aXRlKSB7XHJcbiAgICAgICAgICAgIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIlN1cHBvcnQgU2VydmVyXCIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRlc3RlciA9IC9cXC5nZ1xcLyguKikkLztcclxuICAgICAgICAgICAgICAgIGxldCBjb2RlID0gYWRkb24uaW52aXRlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRlc3Rlci50ZXN0KGNvZGUpKSBjb2RlID0gY29kZS5tYXRjaCh0ZXN0ZXIpWzFdO1xyXG4gICAgICAgICAgICAgICAgQkRWMi5MYXllclN0YWNrLnBvcExheWVyKCk7XHJcbiAgICAgICAgICAgICAgICBCRFYyLkludml0ZUFjdGlvbnMuYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbChjb2RlKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWRkb24uZG9uYXRlKSBsaW5rcy5wdXNoKHRoaXMubWFrZUxpbmsoXCJEb25hdGVcIiwgYWRkb24uZG9uYXRlKSk7XHJcbiAgICAgICAgaWYgKGFkZG9uLnBhdHJlb24pIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIlBhdHJlb25cIiwgYWRkb24ucGF0cmVvbikpO1xyXG4gICAgICAgIHJldHVybiBsaW5rcztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZm9vdGVyKCkge1xyXG4gICAgICAgIGNvbnN0IGxpbmtzID0gdGhpcy5saW5rcztcclxuICAgICAgICByZXR1cm4gKGxpbmtzLmxlbmd0aCB8fCB0aGlzLmhhc1NldHRpbmdzKSAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1jYXJkLWZvb3RlciBiZGEtZm9vdGVyXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IFwiYmQtYWRkb24tbGlua3MgYmRhLWxpbmtzXCJ9LFxyXG4gICAgICAgICAgICAgICAgLi4uKGxpbmtzLm1hcCgoZWxlbWVudCwgaW5kZXgpID0+IGluZGV4IDwgbGlua3MubGVuZ3RoIC0gMSA/IFtlbGVtZW50LCBcIiB8IFwiXSA6IGVsZW1lbnQpLmZsYXQoKSlcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgdGhpcy5oYXNTZXR0aW5ncyAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge29uQ2xpY2s6IHRoaXMuc2hvd1NldHRpbmdzLCBjbGFzc05hbWU6IFwiYmQtYnV0dG9uIGJkYS1zZXR0aW5ncy1idXR0b25cIiwgZGlzYWJsZWQ6ICF0aGlzLnN0YXRlLmNoZWNrZWR9LCBcIlNldHRpbmdzXCIpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZSgpIHtcclxuICAgICAgICB0aGlzLnByb3BzLnRvZ2dsZSAmJiB0aGlzLnByb3BzLnRvZ2dsZSh0aGlzLm5hbWUpO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2NoZWNrZWQ6ICF0aGlzLnN0YXRlLmNoZWNrZWR9KTtcclxuICAgIH1cclxuXHJcbiAgICBlZGl0KCkge3RoaXMucHJvcHMuZWRpdCh0aGlzLm5hbWUpO31cclxuICAgIGRlbGV0ZSgpIHt0aGlzLnByb3BzLnJlbW92ZSh0aGlzLm5hbWUpO31cclxuICAgIHJlbG9hZCgpIHt0aGlzLnByb3BzLnJlbG9hZCh0aGlzLm5hbWUpO31cclxuXHJcbiAgICBnZXQgbmFtZSgpIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcodGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gPyB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXROYW1lKCkgOiB0aGlzLnByb3BzLmFkZG9uLm5hbWUpO31cclxuICAgIGdldCBhdXRob3IoKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luID8gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0QXV0aG9yKCkgOiB0aGlzLnByb3BzLmFkZG9uLmF1dGhvcik7fVxyXG4gICAgZ2V0IGRlc2NyaXB0aW9uKCkge3JldHVybiB0aGlzLmdldFN0cmluZyh0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiA/IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldERlc2NyaXB0aW9uKCkgOiB0aGlzLnByb3BzLmFkZG9uLmRlc2NyaXB0aW9uKTt9XHJcbiAgICBnZXQgdmVyc2lvbigpIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcodGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gPyB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXRWZXJzaW9uKCkgOiB0aGlzLnByb3BzLmFkZG9uLnZlcnNpb24pO31cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuc2V0dGluZ3MpIHJldHVybiB0aGlzLnNldHRpbmdzQ29tcG9uZW50O1xyXG4gICAgICAgIGNvbnN0IHthdXRob3JJZCwgYXV0aG9yTGlua30gPSB0aGlzLnByb3BzLmFkZG9uO1xyXG5cclxuICAgICAgICBjb25zdCBzdHlsZSA9IHt9XHJcbiAgICAgICAgaWYoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTZcIl0pe1xyXG4gICAgICAgICAgICBpZighdGhpcy5pc1NjYW5uaW5nKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNTY2FubmluZyA9IHRydWVcclxuICAgICAgICAgICAgICAgIHByb2Nlc3NGaWxlKHJlc29sdmUodGhpcy5wcm9wcy5hZGRvbi5maWxlbmFtZS5lbmRzV2l0aChcIi5wbHVnaW4uanNcIikgPyBjb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyIDogY29udGVudE1hbmFnZXIudGhlbWVzRm9sZGVyLCB0aGlzLnByb3BzLmFkZG9uLmZpbGVuYW1lKSwgKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMudW5tb3VudGVkKXJldHVyblxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzVHJ1c3RlZDogcmVzdWx0LnN1c3BlY3QgPyBcInN1c3BlY3RcIiA6IHRydWVcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSwgKCkgPT4ge30pXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5zdGF0ZS5pc1RydXN0ZWQgPT09IHRydWUpe1xyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLmJvcmRlckNvbG9yID0gXCIjNDA4N2VkXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuc3RhdGUuaXNUcnVzdGVkID09PSBcInN1c3BlY3RcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUuYm9yZGVyQ29sb3IgPSBcInJnYigyNDAsIDcxLCA3MSlcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1jYXJkIGJkLWFkZG9uLWNhcmQgc2V0dGluZ3MtY2xvc2VkIHVpLXN3aXRjaC1pdGVtXCIsIHN0eWxlfSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtYWRkb24taGVhZGVyIGJkYS1oZWFkZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtY2FyZC10aXRsZSBiZGEtaGVhZGVyLXRpdGxlXCJ9LCB0aGlzLmJ1aWxkVGl0bGUodGhpcy5uYW1lLCB0aGlzLnZlcnNpb24sIHtuYW1lOiB0aGlzLmF1dGhvciwgaWQ6IGF1dGhvcklkLCBsaW5rOiBhdXRob3JMaW5rfSkpLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWFkZG9uLWNvbnRyb2xzIGJkYS1jb250cm9sc1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5lZGl0ICYmIHRoaXMubWFrZUJ1dHRvbihcIkVkaXRcIiwgPEVkaXRJY29uIGNsYXNzTmFtZT1cImJkLWljb25cIiAvPiwgdGhpcy5lZGl0KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5yZW1vdmUgJiYgdGhpcy5tYWtlQnV0dG9uKFwiRGVsZXRlXCIsIDxEZWxldGVJY29uIGNsYXNzTmFtZT1cImJkLWljb25cIiAvPiwgdGhpcy5kZWxldGUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnJlbG9hZCAmJiB0aGlzLm1ha2VCdXR0b24oXCJSZWxvYWRcIiwgPFJlbG9hZEljb24gY2xhc3NOYW1lPVwiYmQtaWNvblwiIC8+LCB0aGlzLnJlbG9hZCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3dpdGNoLCB7b25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIGNoZWNrZWQ6IHRoaXMuc3RhdGUuY2hlY2tlZH0pXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1zY3JvbGxlci13cmFwIGJkYS1kZXNjcmlwdGlvbi13cmFwIHNjcm9sbGVyLXdyYXAgZmFkZVwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLXNjcm9sbGVyIGJkLWFkZG9uLWRlc2NyaXB0aW9uIGJkYS1kZXNjcmlwdGlvbiBzY3JvbGxlclwifSwgdGhpcy5kZXNjcmlwdGlvbilcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgdGhpcy5mb290ZXJcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBvcmlnaW5hbFJlbmRlciA9IFYyQ19QbHVnaW5DYXJkLnByb3RvdHlwZS5yZW5kZXI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWMkNfUGx1Z2luQ2FyZC5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHtcclxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcclxuICAgIHNldDogZnVuY3Rpb24oKSB7Y29uc29sZS53YXJuKFwiQWRkb24gcG9saWN5IGZvciBwbHVnaW5zICM1IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvd2lraS9BZGRvbi1Qb2xpY2llcyNwbHVnaW5zXCIpO30sXHJcbiAgICBnZXQ6ICgpID0+IG9yaWdpbmFsUmVuZGVyXHJcbn0pOyIsImltcG9ydCBFcnJvckJvdW5kYXJ5IGZyb20gXCIuL2Vycm9yQm91bmRhcnlcIjtcclxuaW1wb3J0IENvbnRlbnRDb2x1bW4gZnJvbSBcIi4vY29udGVudENvbHVtblwiO1xyXG5pbXBvcnQgUmVsb2FkSWNvbiBmcm9tIFwiLi9yZWxvYWRJY29uXCI7XHJcbmltcG9ydCBBZGRvbkNhcmQgZnJvbSBcIi4vYWRkb25jYXJkXCI7XHJcbmltcG9ydCBEcm9wZG93biBmcm9tIFwiLi9jb21wb25lbnRzL2Ryb3Bkb3duXCI7XHJcbmltcG9ydCBTZWFyY2ggZnJvbSBcIi4vY29tcG9uZW50cy9zZWFyY2hcIjtcclxuXHJcbmltcG9ydCB7c2V0dGluZ3NDb29raWUsIHBsdWdpbkNvb2tpZSwgdGhlbWVDb29raWUsIGJkcGx1Z2lucywgYmR0aGVtZXN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4uL21vZHVsZXMvY29udGVudE1hbmFnZXJcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi4vbW9kdWxlcy9wbHVnaW5Nb2R1bGVcIjtcclxuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuLi9tb2R1bGVzL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi4vbW9kdWxlcy93ZWJwYWNrTW9kdWxlc1wiO1xyXG5pbXBvcnQgQmRBcGkgZnJvbSBcIi4uL21vZHVsZXMvYmRBcGlcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi9tb2R1bGVzL3V0aWxzXCI7XHJcbmltcG9ydCBUb29sdGlwV3JhcCBmcm9tIFwiLi90b29sdGlwV3JhcFwiO1xyXG5pbXBvcnQgYmRFdmVudHMgZnJvbSBcIi4uL21vZHVsZXMvYmRFdmVudHNcIjtcclxuaW1wb3J0IEVtdWxhdGVkVG9vbHRpcCBmcm9tIFwiLi90b29sdGlwXCI7XHJcblxyXG5jb25zdCBUb29sdGlwID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJUb29sdGlwXCIpO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLnJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FyZExpc3QgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7c29ydDogXCJuYW1lXCIsIGFzY2VuZGluZzogdHJ1ZSwgcXVlcnk6IFwiXCJ9O1xyXG4gICAgICAgIHRoaXMuaXNQbHVnaW5zID0gdGhpcy5wcm9wcy50eXBlID09IFwicGx1Z2luc1wiO1xyXG4gICAgICAgIHRoaXMuY29va2llID0gdGhpcy5pc1BsdWdpbnMgPyBwbHVnaW5Db29raWUgOiB0aGVtZUNvb2tpZTtcclxuICAgICAgICB0aGlzLm1hbmFnZXIgPSB0aGlzLmlzUGx1Z2lucyA/IHBsdWdpbk1vZHVsZSA6IHRoZW1lTW9kdWxlO1xyXG5cclxuICAgICAgICB0aGlzLnNvcnQgPSB0aGlzLnNvcnQuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnJldmVyc2UgPSB0aGlzLnJldmVyc2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNlYXJjaCA9IHRoaXMuc2VhcmNoLmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMub25BZGRvbkNoYW5nZXMgPSBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKClcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vbkFkZG9uQ2hhbmdlcyA9IHRoaXMub25BZGRvbkNoYW5nZXMuYmluZCh0aGlzKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZE1vdW50KCl7XHJcbiAgICAgICAgY29uc3QgdHlwZSA9ICh0aGlzLmlzUGx1Z2lucyA/IFwicGx1Z2luXCIgOiBcInRoZW1lXCIpICsgXCItXCJcclxuICAgICAgICBiZEV2ZW50cy5vbihgJHt0eXBlfWxvYWRlZGAsIHRoaXMub25BZGRvbkNoYW5nZXMpXHJcbiAgICAgICAgYmRFdmVudHMub24oYCR7dHlwZX11bmxvYWRlZGAsIHRoaXMub25BZGRvbkNoYW5nZXMpXHJcbiAgICAgICAgYmRFdmVudHMub24oYCR7dHlwZX1yZWxvYWRlZGAsIHRoaXMub25BZGRvbkNoYW5nZXMpXHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKXtcclxuICAgICAgICBjb25zdCB0eXBlID0gKHRoaXMuaXNQbHVnaW5zID8gXCJwbHVnaW5cIiA6IFwidGhlbWVcIikgKyBcIi1cIlxyXG4gICAgICAgIGJkRXZlbnRzLm9mZihgJHt0eXBlfWxvYWRlZGAsIHRoaXMub25BZGRvbkNoYW5nZXMpXHJcbiAgICAgICAgYmRFdmVudHMub2ZmKGAke3R5cGV9dW5sb2FkZWRgLCB0aGlzLm9uQWRkb25DaGFuZ2VzKVxyXG4gICAgICAgIGJkRXZlbnRzLm9mZihgJHt0eXBlfXJlbG9hZGVkYCwgdGhpcy5vbkFkZG9uQ2hhbmdlcylcclxuICAgIH1cclxuXHJcbiAgICBvcGVuRm9sZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNoZWxsID0gcmVxdWlyZShcImVsZWN0cm9uXCIpLnNoZWxsO1xyXG4gICAgICAgIGNvbnN0IG9wZW4gPSBzaGVsbC5vcGVuUGF0aCB8fCBzaGVsbC5vcGVuSXRlbTtcclxuICAgICAgICBvcGVuKHRoaXMuaXNQbHVnaW5zID8gQ29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlciA6IENvbnRlbnRNYW5hZ2VyLnRoZW1lc0ZvbGRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgZWRpdChuYW1lKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2cobmFtZSk7XHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLmVkaXQobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGVsZXRlKG5hbWUpIHtcclxuICAgICAgICBjb25zdCBzaG91bGREZWxldGUgPSBhd2FpdCB0aGlzLmNvbmZpcm1EZWxldGUobmFtZSk7XHJcbiAgICAgICAgaWYgKCFzaG91bGREZWxldGUpIHJldHVybjtcclxuICAgICAgICB0aGlzLm1hbmFnZXIuZGVsZXRlKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbmZpcm1EZWxldGUobmFtZSkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgQmRBcGkuc2hvd0NvbmZpcm1hdGlvbk1vZGFsKFwiQXJlIFlvdSBTdXJlP1wiLCBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAke25hbWV9P2AsIHtcclxuICAgICAgICAgICAgICAgIGRhbmdlcjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0OiBcIkRlbGV0ZVwiLFxyXG4gICAgICAgICAgICAgICAgb25Db25maXJtOiAoKSA9PiB7cmVzb2x2ZSh0cnVlKTt9LFxyXG4gICAgICAgICAgICAgICAgb25DYW5jZWw6ICgpID0+IHtyZXNvbHZlKGZhbHNlKTt9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzb3J0T3B0aW9ucygpIHtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7bGFiZWw6IFwiTmFtZVwiLCB2YWx1ZTogXCJuYW1lXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiQXV0aG9yXCIsIHZhbHVlOiBcImF1dGhvclwifSxcclxuICAgICAgICAgICAge2xhYmVsOiBcIlZlcnNpb25cIiwgdmFsdWU6IFwidmVyc2lvblwifSxcclxuICAgICAgICAgICAge2xhYmVsOiBcIlJlY2VudGx5IEFkZGVkXCIsIHZhbHVlOiBcImFkZGVkXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiTGFzdCBNb2RpZmllZFwiLCB2YWx1ZTogXCJtb2RpZmllZFwifSxcclxuICAgICAgICAgICAge2xhYmVsOiBcIkZpbGUgU2l6ZVwiLCB2YWx1ZTogXCJzaXplXCJ9LFxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRpcmVjdGlvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge2xhYmVsOiBcIkFzY2VuZGluZ1wiLCB2YWx1ZTogdHJ1ZX0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJEZXNjZW5kaW5nXCIsIHZhbHVlOiBmYWxzZX1cclxuICAgICAgICBdO1xyXG4gICAgfVxyXG5cclxuICAgIHJldmVyc2UodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHthc2NlbmRpbmc6IHZhbHVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc29ydCh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3NvcnQ6IHZhbHVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VhcmNoKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7cXVlcnk6IGV2ZW50LnRhcmdldC52YWx1ZS50b0xvY2FsZUxvd2VyQ2FzZSgpfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJvcHMoYWRkb24pIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBrZXk6IHRoaXMuZ2V0TmFtZShhZGRvbiksXHJcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMuY29va2llW3RoaXMuZ2V0TmFtZShhZGRvbildLFxyXG4gICAgICAgICAgICB0b2dnbGU6IHRoaXMubWFuYWdlci50b2dnbGUuYmluZCh0aGlzLm1hbmFnZXIpLFxyXG4gICAgICAgICAgICBlZGl0OiBzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtN1wiXSA/IHRoaXMuZWRpdC5iaW5kKHRoaXMpIDogbnVsbCxcclxuICAgICAgICAgICAgcmVtb3ZlOiB0aGlzLmRlbGV0ZS5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICBhZGRvbjogYWRkb24sXHJcbiAgICAgICAgICAgIGhhc2g6IGFkZG9uLmhhc2hcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldFN0cmluZyh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybiBcIj8/P1wiO1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbGlzdCgpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLnR5cGUgPT09IFwicGx1Z2luc1wiID8gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpIDogT2JqZWN0LnZhbHVlcyhiZHRoZW1lcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QWRkb25zKCkge1xyXG4gICAgICAgIGNvbnN0IHNvcnRlZEFkZG9ucyA9IHRoaXMubGlzdC5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhcCA9IHRoaXMuc3RhdGUuc29ydC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRoaXMuc3RhdGUuc29ydC5zbGljZSgxKTtcclxuICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhLnBsdWdpbiAmJiBhLnBsdWdpbltgZ2V0JHtjYXB9YF0gPyB0aGlzLmdldFN0cmluZyhhLnBsdWdpbltgZ2V0JHtjYXB9YF0oKSkgOiB0aGlzLmdldFN0cmluZyhhW3RoaXMuc3RhdGUuc29ydF0pO1xyXG4gICAgICAgICAgICBjb25zdCBzZWNvbmQgPSBiLnBsdWdpbiAmJiBiLnBsdWdpbltgZ2V0JHtjYXB9YF0gPyB0aGlzLmdldFN0cmluZyhiLnBsdWdpbltgZ2V0JHtjYXB9YF0oKSkgIDogdGhpcy5nZXRTdHJpbmcoYlt0aGlzLnN0YXRlLnNvcnRdKTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZihmaXJzdCkgPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZpcnN0LnRvTG9jYWxlTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShzZWNvbmQudG9Mb2NhbGVMb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIGlmIChmaXJzdCA+IHNlY29uZCkgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgIGlmIChzZWNvbmQgPiBmaXJzdCkgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoIXRoaXMuc3RhdGUuYXNjZW5kaW5nKSBzb3J0ZWRBZGRvbnMucmV2ZXJzZSgpO1xyXG4gICAgICAgIGNvbnN0IHJlbmRlcmVkID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgYSA9IDA7IGEgPCBzb3J0ZWRBZGRvbnMubGVuZ3RoOyBhKyspIHtcclxuICAgICAgICAgICAgY29uc3QgYWRkb24gPSBzb3J0ZWRBZGRvbnNbYV07XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLnF1ZXJ5KSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2hlcyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5nZXROYW1lKGFkZG9uKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGF1dGhvciA9IHRoaXMuZ2V0QXV0aG9yKGFkZG9uKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdGhpcy5nZXREZXNjcmlwdGlvbihhZGRvbik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJzaW9uID0gdGhpcy5nZXRWZXJzaW9uKGFkZG9uKTtcclxuICAgICAgICAgICAgICAgIGlmIChuYW1lKSBtYXRjaGVzID0gbmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc3RhdGUucXVlcnkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGF1dGhvcikgbWF0Y2hlcyA9IG1hdGNoZXMgfHwgYXV0aG9yLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zdGF0ZS5xdWVyeSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24pIG1hdGNoZXMgPSBtYXRjaGVzIHx8IGRlc2NyaXB0aW9uLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zdGF0ZS5xdWVyeSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodmVyc2lvbikgbWF0Y2hlcyA9IG1hdGNoZXMgfHwgdmVyc2lvbi50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc3RhdGUucXVlcnkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVzKSBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMuZ2V0UHJvcHMoYWRkb24pO1xyXG4gICAgICAgICAgICByZW5kZXJlZC5wdXNoKDxFcnJvckJvdW5kYXJ5PjxBZGRvbkNhcmQgey4uLnByb3BzfSByZWxvYWQ9eyFzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSAmJiB0aGlzLm1hbmFnZXIucmVsb2FkLmJpbmQodGhpcy5tYW5hZ2VyKX0gLz48L0Vycm9yQm91bmRhcnk+KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlbmRlcmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE5hbWUoYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldE5hbWUoKSA6IGFkZG9uLm5hbWUpO31cclxuICAgIGdldEF1dGhvcihhZGRvbikge3JldHVybiB0aGlzLmdldFN0cmluZyhhZGRvbi5wbHVnaW4gPyBhZGRvbi5wbHVnaW4uZ2V0QXV0aG9yKCkgOiBhZGRvbi5hdXRob3IpO31cclxuICAgIGdldERlc2NyaXB0aW9uKGFkZG9uKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKGFkZG9uLnBsdWdpbiA/IGFkZG9uLnBsdWdpbi5nZXREZXNjcmlwdGlvbigpIDogYWRkb24uZGVzY3JpcHRpb24pO31cclxuICAgIGdldFZlcnNpb24oYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldFZlcnNpb24oKSA6IGFkZG9uLnZlcnNpb24pO31cclxuXHJcbiAgICByZW5kZXJDaGVja1VwZGF0ZXMoKXtcclxuICAgICAgICBpZighd2luZG93LlplcmVzUGx1Z2luTGlicmFyeSlyZXR1cm4gbnVsbFxyXG4gICAgICAgIGlmKCF3aW5kb3cuUGx1Z2luVXBkYXRlcylyZXR1cm4gbnVsbFxyXG4gICAgICAgIGlmKHR5cGVvZiB3aW5kb3cuUGx1Z2luVXBkYXRlcy5jaGVja0FsbCAhPT0gXCJmdW5jdGlvblwiKXJldHVybiBudWxsXHJcbiAgICAgICAgaWYoIXRoaXMuaXNQbHVnaW5zKXJldHVybiBudWxsXHJcblxyXG4gICAgICAgIGxldCB0b29sdGlwSXNTaG93aW5nID0gZmFsc2VcclxuICAgICAgICBsZXQgdG9vbHRpcFxyXG4gICAgICAgIHJldHVybiA8VG9vbHRpcFdyYXAgdGV4dD1cIkNoZWNrcyBmb3IgdXBkYXRlcyBvZiBwbHVnaW5zIHRoYXQgc3VwcG9ydCB0aGlzIGZlYXR1cmUuIFJpZ2h0LWNsaWNrIGZvciBhIGxpc3QuXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPXt7bWFyZ2luTGVmdDogXCIxMHB4XCJ9fSBvbk1vdXNlTGVhdmU9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwSXNTaG93aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwLmhpZGUoKVxyXG4gICAgICAgICAgICAgICAgfX0+XHJcbiAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24gcmVmPVwiY2hlY2tVcGRhdGVCdXR0b25cIiBjb2xvcj1cImJyYW5kXCIgbG9vaz1cImZpbGxlZFwiIHNpemU9XCJtaW5cIiBob3ZlckNvbG9yPVwiZGVmYXVsdFwiIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChcIlBsdWdpbiB1cGRhdGUgY2hlY2sgaW4gcHJvZ3Jlc3MuXCIsIHt0eXBlOiBcImluZm9cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5QbHVnaW5VcGRhdGVzLmNoZWNrQWxsKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KFwiUGx1Z2luIHVwZGF0ZSBjaGVjayBjb21wbGV0ZS5cIiwge3R5cGU6IFwic3VjY2Vzc1wifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KFwiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBjaGVja2luZyB1cGRhdGUuXCIsIHt0eXBlOiBcImVycm9yXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGNoZWNraW5nIHVwZGF0ZS5cIiwge3R5cGU6IFwiZXJyb3JcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfX0gd3JhcHBlcj17ZmFsc2V9IGRpc2FibGVkPXtmYWxzZX0gb25SaWdodENsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIXRoaXMucmVmcy5jaGVja1VwZGF0ZUJ1dHRvbilyZXR1cm5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5QbHVnaW5VcGRhdGVzIHx8ICF3aW5kb3cuUGx1Z2luVXBkYXRlcy5wbHVnaW5zKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodG9vbHRpcElzU2hvd2luZylyZXR1cm5cclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwID0gbmV3IEVtdWxhdGVkVG9vbHRpcCh0aGlzLnJlZnMuY2hlY2tVcGRhdGVCdXR0b24ucmVmcy5vcmlnaW5hbC5yZWZzLmJ1dHRvbiwgT2JqZWN0LnZhbHVlcyh3aW5kb3cuUGx1Z2luVXBkYXRlcy5wbHVnaW5zKS5tYXAocCA9PiBwLm5hbWUpLmpvaW4oXCIsIFwiKSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWRlOiBcImJvdHRvbVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hFdmVudHM6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwLnNob3coKVxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXBJc1Nob3dpbmcgPSB0cnVlXHJcbiAgICAgICAgICAgICAgICB9fT5cclxuICAgICAgICAgICAgICAgICAgICBDaGVjayBmb3IgVXBkYXRlc1xyXG4gICAgICAgICAgICAgICAgPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvVG9vbHRpcFdyYXA+XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHJlZnJlc2hJY29uID0gPFRvb2x0aXAgY29sb3I9XCJibGFja1wiIHBvc2l0aW9uPVwidG9wXCIgdGV4dD1cIlJlbG9hZCBMaXN0XCI+XHJcbiAgICAgICAgICAgIHsocHJvcHMpID0+IFxyXG4gICAgICAgICAgICA8UmVsb2FkSWNvbiB7Li4ucHJvcHN9IGNsYXNzTmFtZT1cImJkLWljb24gYmQtcmVsb2FkIGJkLXJlbG9hZC1oZWFkZXJcIiBzaXplPVwiMThweFwiIG9uQ2xpY2s9e2FzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUGx1Z2lucykgcGx1Z2luTW9kdWxlLnVwZGF0ZVBsdWdpbkxpc3QoKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgdGhlbWVNb2R1bGUudXBkYXRlVGhlbWVMaXN0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKCk7XHJcbiAgICAgICAgICAgIH19IC8+XHJcbiAgICAgICAgICAgIH08L1Rvb2x0aXA+O1xyXG4gICAgICAgIGNvbnN0IGFkZG9uQ2FyZHMgPSB0aGlzLmdldEFkZG9ucygpO1xyXG5cclxuICAgICAgICByZXR1cm4gPENvbnRlbnRDb2x1bW4gdGl0bGU9e2Ake3RoaXMucHJvcHMudHlwZS50b1VwcGVyQ2FzZSgpfeKAlCR7YWRkb25DYXJkcy5sZW5ndGh9YH0+XHJcbiAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiBrZXk9XCJmb2xkZXItYnV0dG9uXCIgY29sb3I9XCJicmFuZFwiIFxyXG4gICAgICAgICAgICAgICAgbG9vaz1cImZpbGxlZFwiIHNpemU9XCJtaW5cIiBob3ZlckNvbG9yPVwiZGVmYXVsdFwiIG9uQ2xpY2s9e3RoaXMub3BlbkZvbGRlci5iaW5kKHRoaXMpfSB3cmFwcGVyPXtmYWxzZX1cclxuICAgICAgICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luTGVmdDogXCIxMHB4XCJcclxuICAgICAgICAgICAgICAgIH19PlxyXG4gICAgICAgICAgICAgICAgT3BlbiB7dGhpcy5pc1BsdWdpbnMgPyBcIlBsdWdpblwiIDogXCJUaGVtZVwifSBGb2xkZXJcclxuICAgICAgICAgICAgPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbj5cclxuICAgICAgICAgICAge3RoaXMucmVuZGVyQ2hlY2tVcGRhdGVzKCl9XHJcbiAgICAgICAgICAgIHshc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTVcIl0gJiYgcmVmcmVzaEljb259XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtY29udHJvbHMgYmQtYWRkb24tY29udHJvbHNcIj5cclxuICAgICAgICAgICAgICAgIDxTZWFyY2ggb25DaGFuZ2U9e3RoaXMuc2VhcmNofSBwbGFjZWhvbGRlcj17YFNlYXJjaCAke3RoaXMucHJvcHMudHlwZX0uLi5gfSAvPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1hZGRvbi1kcm9wZG93bnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJiZC1sYWJlbFwiPlNvcnQgYnk6PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duIG9wdGlvbnM9e3RoaXMuc29ydE9wdGlvbnN9IG9uQ2hhbmdlPXt0aGlzLnNvcnR9IHN0eWxlPVwidHJhbnNwYXJlbnRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImJkLWxhYmVsXCI+T3JkZXI6PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duIG9wdGlvbnM9e3RoaXMuZGlyZWN0aW9uc30gb25DaGFuZ2U9e3RoaXMucmV2ZXJzZX0gc3R5bGU9XCJ0cmFuc3BhcmVudFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmRhLXNsaXN0IGJkLWFkZG9uLWxpc3RcIj57YWRkb25DYXJkc308L2Rpdj5cclxuICAgICAgICA8L0NvbnRlbnRDb2x1bW4+XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IG9yaWdpbmFsUmVuZGVyID0gQ2FyZExpc3QucHJvdG90eXBlLnJlbmRlcjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KENhcmRMaXN0LnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xyXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgc2V0OiBmdW5jdGlvbigpIHtjb25zb2xlLndhcm4oXCJBZGRvbiBwb2xpY3kgZm9yIHBsdWdpbnMgIzUgaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC93aWtpL0FkZG9uLVBvbGljaWVzI3BsdWdpbnNcIik7fSxcclxuICAgIGdldDogKCkgPT4gb3JpZ2luYWxSZW5kZXJcclxufSk7IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJETG9nbyBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwic3ZnXCIsXHJcbiAgICAgICAgICAgIHtoZWlnaHQ6IFwiMTAwJVwiLCB3aWR0aDogdGhpcy5wcm9wcy5zaXplIHx8IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nbyBcIiArIHRoaXMucHJvcHMuY2xhc3NOYW1lLCBzdHlsZToge2ZpbGxSdWxlOiBcImV2ZW5vZGRcIiwgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLCBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJ9LCB2aWV3Qm94OiBcIjAgMCAyMDAwIDIwMDBcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcIm1ldGFkYXRhXCIsIG51bGwpLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkZWZzXCIsIG51bGwsXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmaWx0ZXJcIiwge2lkOiBcInNoYWRvdzFcIn0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZlRHJvcFNoYWRvd1wiLCB7XCJkeFwiOiBcIjIwXCIsIFwiZHlcIjogXCIwXCIsIFwic3RkRGV2aWF0aW9uXCI6IFwiMjBcIiwgXCJmbG9vZC1jb2xvclwiOiBcInJnYmEoMCwwLDAsMC4zNSlcIn0pKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZpbHRlclwiLCB7aWQ6IFwic2hhZG93MlwifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVEcm9wU2hhZG93XCIsIHtcImR4XCI6IFwiMTVcIiwgXCJkeVwiOiBcIjBcIiwgXCJzdGREZXZpYXRpb25cIjogXCIyMFwiLCBcImZsb29kLWNvbG9yXCI6IFwicmdiYSgyNTUsMjU1LDI1NSwwLjE1KVwifSkpLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmlsdGVyXCIsIHtpZDogXCJzaGFkb3czXCJ9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmZURyb3BTaGFkb3dcIiwge1wiZHhcIjogXCIxMFwiLCBcImR5XCI6IFwiMFwiLCBcInN0ZERldmlhdGlvblwiOiBcIjIwXCIsIFwiZmxvb2QtY29sb3JcIjogXCJyZ2JhKDAsMCwwLDAuMzUpXCJ9KSlcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCBudWxsLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7c3R5bGU6IHtmaWx0ZXI6IFwidXJsKCNzaGFkb3czKVwifSwgZDogXCJNMTE5NS40NCsxMzUuNDQyTDExOTUuNDQrMTM1LjQ0Mkw5OTcuNisxMzYuNDQyQzEwMjQuMisxNDkuNzQyKzExNzAuMzQrMTYzLjU0MisxMTkzLjY0KzE3OS43NDJDMTI2NC4zNCsyMjguODQyKzEzMTkuNzQrMjkxLjI0MisxMzU4LjI0KzM2NS4wNDJDMTM5OC4xNCs0NDEuNjQyKzE0MTkuNzQrNTMwLjY0MisxNDIyLjU0KzYyOS42NDJMMTQyMi41NCs2MzAuODQyTDE0MjIuNTQrNjMyLjA0MkMxNDIyLjU0Kzc3My4xNDIrMTQyMi41NCsxMjI4LjE0KzE0MjIuNTQrMTM2OS4xNEwxNDIyLjU0KzEzNzAuMzRMMTQyMi41NCsxMzcxLjU0QzE0MTkuODQrMTQ3MC41NCsxMzk4LjI0KzE1NTkuNTQrMTM1OC4yNCsxNjM2LjE0QzEzMTkuNzQrMTcwOS45NCsxMjY0LjQ0KzE3NzIuMzQrMTE5My42NCsxODIxLjQ0QzExNzEuMDQrMTgzNy4xNCsxMDI1LjcrMTg1MC41NCsxMDAwKzE4NjMuNTRMMTE5My41NCsxODY0LjU0QzE1MzkuNzQrMTg2Ni40NCsxODY0LjU0KzE2OTMuMzQrMTg2NC41NCsxMjk2LjY0TDE4NjQuNTQrNzE2Ljk0MkMxODY2LjQ0KzMxMi40NDIrMTU0MS42NCsxMzUuNDQyKzExOTUuNDQrMTM1LjQ0MlpcIiwgZmlsbDogXCIjMTcxNzE3XCIsIG9wYWNpdHk6IFwiMVwifSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtzdHlsZToge2ZpbHRlcjogXCJ1cmwoI3NoYWRvdzIpXCJ9LCBkOiBcIk0xNjk1LjU0KzYzMS40NDJDMTY4NS44NCsyNzguMDQyKzE0MDkuMzQrMTM1LjQ0MisxMDUyLjk0KzEzNS40NDJMMzYxLjc0KzEzNi40NDJMODAzLjc0KzQ5MC40NDJMMTA2MC43NCs0OTAuNDQyQzEzMzUuMjQrNDkwLjQ0MisxMzM1LjI0KzgzNS4zNDIrMTA2MC43NCs4MzUuMzQyTDEwNjAuNzQrMTE2NC44NEMxMTUwLjIyKzExNjQuODQrMTIxMC41MysxMjAxLjQ4KzEyNDEuNjgrMTI1MC44N0MxMzA2LjA3KzEzNTMrMTI0NS43NisxNTA5LjY0KzEwNjAuNzQrMTUwOS42NEwzNjEuNzQrMTg2My41NEwxMDUyLjk0KzE4NjQuNTRDMTQwOS4yNCsxODY0LjU0KzE2ODUuNzQrMTcyMS45NCsxNjk1LjU0KzEzNjguNTRDMTY5NS41NCsxMjA1Ljk0KzE2NTEuMDQrMTA4NC40NCsxNTcyLjY0Kzk5OS45NDJDMTY1MS4wNCs5MTUuNTQyKzE2OTUuNTQrNzk0LjA0MisxNjk1LjU0KzYzMS40NDJaXCIsIGZpbGw6IFwiIzNFODJFNVwiLCBvcGFjaXR5OiBcIjFcIn0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7c3R5bGU6IHtmaWx0ZXI6IFwidXJsKCNzaGFkb3cxKVwifSwgZDogXCJNMTQ2OS4yNSs2MzEuNDQyQzE0NTkuNTUrMjc4LjA0MisxMTgzLjA1KzEzNS40NDIrODI2LjY1KzEzNS40NDJMMTM1LjQ1KzEzNS40NDJMMTM1LjQ1KzEwMDRDMTM1LjQ1KzEwMDQrMTM1LjQyNysxMjU1LjIxKzM1NS42MjYrMTI1NS4yMUM1NzUuODI1KzEyNTUuMjErNTc1Ljg0OCsxMDA0KzU3NS44NDgrMTAwNEw1NzcuNDUrNDkwLjQ0Mkw4MzQuNDUrNDkwLjQ0MkMxMTA4Ljk1KzQ5MC40NDIrMTEwOC45NSs4MzUuMzQyKzgzNC40NSs4MzUuMzQyTDY2NC42NSs4MzUuMzQyTDY2NC42NSsxMTY0Ljg0TDgzNC40NSsxMTY0Ljg0QzkyMy45MzIrMTE2NC44NCs5ODQuMjQ0KzEyMDEuNDgrMTAxNS4zOSsxMjUwLjg3QzEwNzkuNzgrMTM1MysxMDE5LjQ3KzE1MDkuNjQrODM0LjQ1KzE1MDkuNjRMMTM1LjQ1KzE1MDkuNjRMMTM1LjQ1KzE4NjQuNTRMODI2LjY1KzE4NjQuNTRDMTE4Mi45NSsxODY0LjU0KzE0NTkuNDUrMTcyMS45NCsxNDY5LjI1KzEzNjguNTRDMTQ2OS4yNSsxMjA1Ljk0KzE0MjQuNzUrMTA4NC40NCsxMzQ2LjM1Kzk5OS45NDJDMTQyNC43NSs5MTUuNTQyKzE0NjkuMjUrNzk0LjA0MisxNDY5LjI1KzYzMS40NDJaXCIsIGZpbGw6IFwiI0ZGRkZGRlwiLCBvcGFjaXR5OiBcIjFcIn0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19DaGVja2JveCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgY2hlY2tlZDogdGhpcy5wcm9wcy5jaGVja2VkIHx8IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJsaVwiLFxyXG4gICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJjaGVja2JveCBcIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGVja2JveEVsZW1lbnQpWzBdLmNoZWNrYm94LCBvbkNsaWNrOiB0aGlzLm9uQ2xpY2t9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJjaGVja2JveC1pbm5lciBcIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGVja2JveElubmVyKVswXS5jaGVja2JveElubmVyfSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCB7Y2xhc3NOYW1lOiBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGVja2JveEVsZW1lbnQpWzBdLmNoZWNrYm94RWxlbWVudCwgY2hlY2tlZDogdGhpcy5zdGF0ZS5jaGVja2VkLCBvbkNoYW5nZTogKCkgPT4ge30sIHR5cGU6IFwiY2hlY2tib3hcIn0pLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbClcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnRleHRcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljaygpIHtcclxuICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKHRoaXMucHJvcHMuaWQsICF0aGlzLnN0YXRlLmNoZWNrZWQpO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBjaGVja2VkOiAhdGhpcy5zdGF0ZS5jaGVja2VkXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgQXJyb3cgZnJvbSBcIi4uL2ljb25zL2Rvd25hcnJvd1wiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlbGVjdCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge29wZW46IGZhbHNlLCB2YWx1ZTogdGhpcy5wcm9wcy52YWx1ZSB8fCB0aGlzLnByb3BzLm9wdGlvbnNbMF0udmFsdWV9O1xyXG4gICAgICAgIHRoaXMuZHJvcGRvd24gPSBSZWFjdC5jcmVhdGVSZWYoKTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2hvd01lbnUgPSB0aGlzLnNob3dNZW51LmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5oaWRlTWVudSA9IHRoaXMuaGlkZU1lbnUuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93TWVudShldmVudCkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7b3BlbjogdHJ1ZX0sICgpID0+IHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuaGlkZU1lbnUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGVNZW51KCkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe29wZW46IGZhbHNlfSwgKCkgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5oaWRlTWVudSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHt2YWx1ZX0pO1xyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uQ2hhbmdlKSB0aGlzLnByb3BzLm9uQ2hhbmdlKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2VsZWN0ZWQoKSB7cmV0dXJuIHRoaXMucHJvcHMub3B0aW9ucy5maW5kKG8gPT4gby52YWx1ZSA9PSB0aGlzLnN0YXRlLnZhbHVlKTt9XHJcblxyXG4gICAgZ2V0IG9wdGlvbnMoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkO1xyXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC1vcHRpb25zXCI+XHJcbiAgICAgICAgICAgIHt0aGlzLnByb3BzLm9wdGlvbnMubWFwKG9wdCA9PiBcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgYmQtc2VsZWN0LW9wdGlvbiR7c2VsZWN0ZWQudmFsdWUgPT0gb3B0LnZhbHVlID8gXCIgc2VsZWN0ZWRcIiA6IFwiXCJ9YH0gb25DbGljaz17dGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMsIG9wdC52YWx1ZSl9PntvcHQubGFiZWx9PC9kaXY+XHJcbiAgICAgICAgICAgICl9XHJcbiAgICAgICAgPC9kaXY+O1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzdHlsZSA9IHRoaXMucHJvcHMuc3R5bGUgPT0gXCJ0cmFuc3BhcmVudFwiID8gXCIgYmQtc2VsZWN0LXRyYW5zcGFyZW50XCIgOiBcIlwiO1xyXG4gICAgICAgIGNvbnN0IGlzT3BlbiA9IHRoaXMuc3RhdGUub3BlbiA/IFwiIG1lbnUtb3BlblwiIDogXCJcIjtcclxuICAgICAgICByZXR1cm4gIDxkaXYgY2xhc3NOYW1lPXtgYmQtc2VsZWN0JHtzdHlsZX0ke2lzT3Blbn1gfSBvbkNsaWNrPXt0aGlzLnNob3dNZW51fSByZWY9e3RoaXMuZHJvcGRvd259PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXZhbHVlXCI+e3RoaXMuc2VsZWN0ZWQubGFiZWx9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPEFycm93IGNsYXNzTmFtZT1cImJkLXNlbGVjdC1hcnJvd1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAge3RoaXMuc3RhdGUub3BlbiAmJiB0aGlzLm9wdGlvbnN9XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj47XHJcbiAgICB9XHJcbn1cclxuXHJcbi8vIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC13cmFwXCI+XHJcbi8vIDxsYWJlbCBjbGFzc05hbWU9XCJiZC1sYWJlbFwiPnt0aGlzLnByb3BzLmxhYmVsfTwvbGFiZWw+XHJcbi8vIDxkaXYgY2xhc3NOYW1lPXtgYmQtc2VsZWN0JHtzdHlsZX0ke2lzT3Blbn1gfSBvbkNsaWNrPXt0aGlzLnNob3dNZW51fSByZWY9e3RoaXMuZHJvcGRvd259PlxyXG4vLyAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3QtY29udHJvbHNcIj5cclxuLy8gICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC12YWx1ZVwiPnt0aGlzLnNlbGVjdGVkLmxhYmVsfTwvZGl2PlxyXG4vLyAgICAgICAgIDxBcnJvdyBjbGFzc05hbWU9XCJiZC1zZWxlY3QtYXJyb3dcIiAvPlxyXG4vLyAgICAgPC9kaXY+XHJcbi8vIDwvZGl2PlxyXG4vLyB7dGhpcy5zdGF0ZS5vcGVuICYmIHRoaXMub3B0aW9uc31cclxuLy8gPC9kaXY+OyIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBTZWFyY2hJY29uIGZyb20gXCIuLi9pY29ucy9zZWFyY2hcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgZm9jdXNlZDogZmFsc2VcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gW1wiYmQtc2VhcmNoLXdyYXBwZXJcIl1cclxuICAgICAgICBpZih0aGlzLnN0YXRlLmZvY3VzZWQpY2xhc3NOYW1lLnB1c2goXCJmb2N1c2VkXCIpXHJcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXtjbGFzc05hbWUuam9pbihcIiBcIil9PlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBvbkNoYW5nZT17dGhpcy5wcm9wcy5vbkNoYW5nZX0gb25LZXlEb3duPXt0aGlzLnByb3BzLm9uS2V5RG93bn0gdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJiZC1zZWFyY2hcIiBwbGFjZWhvbGRlcj17dGhpcy5wcm9wcy5wbGFjZWhvbGRlcn0gbWF4TGVuZ3RoPVwiNTBcIiBcclxuICAgICAgICAgICAgICAgICAgICBvbkZvY3VzPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2ZvY3VzZWQ6IHRydWV9KVxyXG4gICAgICAgICAgICAgICAgICAgIH19IG9uQmx1cj17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtmb2N1c2VkOiBmYWxzZX0pXHJcbiAgICAgICAgICAgICAgICAgICAgfX0vPlxyXG4gICAgICAgICAgICAgICAgICAgIDxTZWFyY2hJY29uIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj47XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3dpdGNoIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7Y2hlY2tlZDogdGhpcy5wcm9wcy5jaGVja2VkfTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc3dpdGNoID0gPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuU3dpdGNoIG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlfSB2YWx1ZT17dGhpcy5zdGF0ZS5jaGVja2VkfSAvPlxyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuZGlzYWJsZWQpIHJldHVybjtcclxuICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKHZhbHVlKTtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtjaGVja2VkOiB2YWx1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zd2l0Y2hcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfQ29udGVudENvbHVtbiBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBkaXNwbGF5TmFtZSgpIHtyZXR1cm4gXCJDb250ZW50Q29sdW1uXCI7fVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICAvL2xldCBjb250ZW50TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29udGVudENvbHVtbilbMF1cclxuICAgICAgICBsZXQgdGl0bGUgPSB0aGlzLnByb3BzLnRpdGxlID8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiaDJcIiwge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRpdGxlIGgyIG1hcmdpbi1yZXNldCBtYXJnaW4tYm90dG9tLTIwXCJ9LCB0aGlzLnByb3BzLnRpdGxlKSA6IG51bGxcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5jaGlsZHJlblxyXG4gICAgICAgIF1cclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBjb250ZW50TW9kdWxlLmNvbnRlbnRDb2x1bW4gKyBcIiBcIitjb250ZW50TW9kdWxlLmNvbnRlbnRDb2x1bW5EZWZhdWx0K1wiIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIiwgc3R5bGU6IHtwYWRkaW5nOiBcIjYwcHggNDBweCAwcHhcIn19LFxyXG4gICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5jaGlsZHJlblxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IFNldHRpbmdzIGZyb20gXCIuLi9tb2R1bGVzL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi4vbW9kdWxlcy9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi4vbW9kdWxlcy9kb210b29sc1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4uL21vZHVsZXMvdXRpbHNcIlxyXG5cclxuaW1wb3J0IFNldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xyXG5pbXBvcnQgQ2hlY2tib3ggZnJvbSBcIi4vY2hlY2tib3hcIjtcclxuaW1wb3J0IFYyQ19Dc3NFZGl0b3JEZXRhY2hlZCBmcm9tIFwiLi9jc3NFZGl0b3JEZXRhY2hlZFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0Nzc0VkaXRvciBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYucHJvcHMubGluZXMgPSAwO1xyXG4gICAgICAgIHNlbGYuc2V0SW5pdGlhbFN0YXRlKCk7XHJcbiAgICAgICAgc2VsZi5hdHRhY2ggPSBzZWxmLmF0dGFjaC5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYuZGV0YWNoZWRFZGl0b3IgPSBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVjJDX0Nzc0VkaXRvckRldGFjaGVkLCB7YXR0YWNoOiBzZWxmLmF0dGFjaH0pO1xyXG4gICAgICAgIHNlbGYub25DbGljayA9IHNlbGYub25DbGljay5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYudXBkYXRlQ3NzID0gc2VsZi51cGRhdGVDc3MuYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLnNhdmVDc3MgPSBzZWxmLnNhdmVDc3MuYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLmRldGFjaCA9IHNlbGYuZGV0YWNoLmJpbmQoc2VsZik7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGRldGFjaGVkOiB0aGlzLnByb3BzLmRldGFjaGVkIHx8IEJEVjIuZWRpdG9yRGV0YWNoZWRcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIC8vIHRoaXMudXBkYXRlTGluZUNvdW50KCk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBhY2UuZWRpdChcImJkLWN1c3RvbWNzcy1lZGl0b3JcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VGhlbWUoXCJhY2UvdGhlbWUvZGlzY29yZFwiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXNzaW9uLnNldE1vZGUoXCJhY2UvbW9kZS9jc3NcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRGb250U2l6ZSgxNCk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oXCJjaGFuZ2VcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNzcygpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNzcygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBpZiAocHJldlN0YXRlLmRldGFjaGVkICYmICFzZWxmLnN0YXRlLmRldGFjaGVkKSB7XHJcbiAgICAgICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZShzZWxmLmRldGFjaGVkUm9vdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvZGVNaXJyb3IoKSB7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG9wdGlvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbGluZU51bWJlcnM6IHRydWUsXHJcbiAgICAgICAgICAgIG1vZGU6IFwiY3NzXCIsXHJcbiAgICAgICAgICAgIGluZGVudFVuaXQ6IDQsXHJcbiAgICAgICAgICAgIHRoZW1lOiBcIm1hdGVyaWFsXCIsXHJcbiAgICAgICAgICAgIHNjcm9sbGJhclN0eWxlOiBcInNpbXBsZVwiXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY3NzKCkge1xyXG4gICAgICAgIGNvbnN0IF9jY3NzID0gRGF0YVN0b3JlLmdldEJERGF0YShcImJkY3VzdG9tY3NzXCIpO1xyXG4gICAgICAgIGxldCBjY3NzID0gXCJcIjtcclxuICAgICAgICBpZiAoX2Njc3MgJiYgX2Njc3MgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgY2NzcyA9IEJ1ZmZlci5mcm9tKF9jY3NzLCBcImJhc2U2NFwiKS50b1N0cmluZyhcInV0ZjhcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjY3NzO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUxpbmVDb3VudCgpIHtcclxuICAgICAgICBjb25zdCBsaW5lQ291bnQgPSB0aGlzLnJlZnMuZWRpdG9yLnZhbHVlLnNwbGl0KFwiXFxuXCIpLmxlbmd0aDtcclxuICAgICAgICBpZiAobGluZUNvdW50ID09IHRoaXMucHJvcHMubGluZXMpIHJldHVybjtcclxuICAgICAgICB0aGlzLnJlZnMubGluZXMudGV4dENvbnRlbnQgPSBBcnJheS5mcm9tKG5ldyBBcnJheShsaW5lQ291bnQpLCAoXywgaSkgPT4gaSArIDEpLmpvaW4oXCIuXFxuXCIpICsgXCIuXCI7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5saW5lcyA9IGxpbmVDb3VudDtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgIGNvbnN0IHtkZXRhY2hlZH0gPSBzZWxmLnN0YXRlO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIGRldGFjaGVkICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7aWQ6IFwiZWRpdG9yLWRldGFjaGVkXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiBcIkN1c3RvbSBDU1MgRWRpdG9yXCJ9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImgzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICBcIkVkaXRvciBEZXRhY2hlZFwiXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hdHRhY2goKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgXCJBdHRhY2hcIlxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAhZGV0YWNoZWQgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwge3RleHQ6IFwiQ3VzdG9tIENTUyBFZGl0b3JcIn0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiZWRpdG9yLXdyYXBwZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogXCJiZC1jdXN0b21jc3MtZWRpdG9yXCIsIGNsYXNzTmFtZTogXCJlZGl0b3JcIiwgcmVmOiBcImVkaXRvclwifSwgc2VsZi5jc3MpXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1hdHRhY2gtY29udHJvbHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInVsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3gtZ3JvdXBcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDaGVja2JveCwge2lkOiBcImxpdmUtdXBkYXRlXCIsIHRleHQ6IFwiTGl2ZSBVcGRhdGVcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIGNoZWNrZWQ6IHNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdfSlcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1kZXRhY2gtY29udHJvbHMtYnV0dG9uXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjNweCAwIDAgM3B4XCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjM2Y0MTQ2XCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwidXBkYXRlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVcGRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjBcIiwgYm9yZGVyTGVmdDogXCIxcHggc29saWQgIzJkMmQyZFwiLCBib3JkZXJSaWdodDogXCIxcHggc29saWQgIzJkMmQyZFwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcInNhdmVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNhdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjAgM3B4IDNweCAwXCIsIGJvcmRlckxlZnQ6IFwiMXB4IHNvbGlkICMzZjQxNDZcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJkZXRhY2hcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkRldGFjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Zm9udFNpemU6IFwiMTBweFwiLCBtYXJnaW5MZWZ0OiBcIjVweFwifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVuc2F2ZWQgY2hhbmdlcyBhcmUgbG9zdCBvbiBkZXRhY2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJoZWxwLXRleHRcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlByZXNzIFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiY29kZVwiLCB7Y2xhc3NOYW1lOiBcImlubGluZVwifSwgXCJjdHJsXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIrXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IFwiaW5saW5lXCJ9LCBcIixcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiB3aXRoIHRoZSBlZGl0b3IgZm9jdXNlZCB0byBhY2Nlc3MgdGhlIGVkaXRvcidzIHNldHRpbmdzLlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICBdXHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljayhhcmcpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzd2l0Y2ggKGFyZykge1xyXG4gICAgICAgICAgICBjYXNlIFwidXBkYXRlXCI6XHJcbiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZUNzcygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJzYXZlXCI6XHJcbiAgICAgICAgICAgICAgICBzZWxmLnNhdmVDc3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiZGV0YWNoXCI6XHJcbiAgICAgICAgICAgICAgICBzZWxmLmRldGFjaCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKGlkLCBjaGVja2VkKSB7XHJcbiAgICAgICAgc3dpdGNoIChpZCkge1xyXG4gICAgICAgICAgICBjYXNlIFwibGl2ZS11cGRhdGVcIjpcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdID0gY2hlY2tlZDtcclxuICAgICAgICAgICAgICAgIFNldHRpbmdzLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUNzcygpIHtcclxuICAgICAgICBET00ucmVtb3ZlU3R5bGUoXCJjdXN0b21jc3NcIik7XHJcbiAgICAgICAgRE9NLmFkZFN0eWxlKFwiY3VzdG9tY3NzXCIsIHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0VmFsdWUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZUNzcygpIHtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0QkREYXRhKFwiYmRjdXN0b21jc3NcIiwgQnVmZmVyLmZyb20odGhpcy5lZGl0b3Iuc2Vzc2lvbi5nZXRWYWx1ZSgpLCBcInV0Zi04XCIpLnRvU3RyaW5nKFwiYmFzZTY0XCIpKTtcclxuICAgIH1cclxuXHJcbiAgICBkZXRhY2goKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGRldGFjaGVkOiB0cnVlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgZHJvb3QgPSBzZWxmLmRldGFjaGVkUm9vdDtcclxuICAgICAgICBpZiAoIWRyb290KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRkFJTEVEIFRPIElOSkVDVCBST09UOiAuYXBwXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKHNlbGYuZGV0YWNoZWRFZGl0b3IsIGRyb290KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGV0YWNoZWRSb290KCkge1xyXG4gICAgICAgIGNvbnN0IF9yb290ID0gRE9NLnF1ZXJ5KFwiI2JkLWN1c3RvbWNzcy1kZXRhY2gtY29udGFpbmVyXCIpO1xyXG4gICAgICAgIGlmICghX3Jvb3QpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluamVjdERldGFjaGVkUm9vdCgpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGV0YWNoZWRSb290O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX3Jvb3Q7XHJcbiAgICB9XHJcblxyXG4gICAgaW5qZWN0RGV0YWNoZWRSb290KCkge1xyXG4gICAgICAgIGNvbnN0IGFwcCA9IERPTS5xdWVyeShcIi5hcHAsIC5cIitVdGlscy5yZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5hcHAgJiYgZS5sYXllcnMpWzBdLmFwcCkpO1xyXG4gICAgICAgIGlmICghYXBwKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgRE9NLmluc2VydEFmdGVyKERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtY3VzdG9tY3NzLWRldGFjaC1jb250YWluZXJcIj5gKSwgYXBwKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2goKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGRldGFjaGVkOiBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBTZXR0aW5ncyBmcm9tIFwiLi4vbW9kdWxlcy9zZXR0aW5nc1BhbmVsXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4uL21vZHVsZXMvZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4uL21vZHVsZXMvZG9tdG9vbHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi9tb2R1bGVzL3V0aWxzXCJcclxuXHJcbmltcG9ydCBDaGVja2JveCBmcm9tIFwiLi9jaGVja2JveFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0Nzc0VkaXRvckRldGFjaGVkIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5vbkNsaWNrID0gc2VsZi5vbkNsaWNrLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi51cGRhdGVDc3MgPSBzZWxmLnVwZGF0ZUNzcy5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYuc2F2ZUNzcyA9IHNlbGYuc2F2ZUNzcy5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYub25DaGFuZ2UgPSBzZWxmLm9uQ2hhbmdlLmJpbmQoc2VsZik7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgRE9NLmFkZENsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmQtZGV0YWNoZWQtZWRpdG9yXCIpO1xyXG4gICAgICAgIEJEVjIuZWRpdG9yRGV0YWNoZWQgPSB0cnVlO1xyXG4gICAgICAgIC8vIHRoaXMudXBkYXRlTGluZUNvdW50KCk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBhY2UuZWRpdChcImJkLWN1c3RvbWNzcy1lZGl0b3ItZGV0YWNoZWRcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VGhlbWUoXCJhY2UvdGhlbWUvZGlzY29yZFwiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXNzaW9uLnNldE1vZGUoXCJhY2UvbW9kZS9jc3NcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRGb250U2l6ZSgxNCk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oXCJjaGFuZ2VcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNzcygpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNzcygpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcclxuICAgICAgICBET00ucmVtb3ZlQ2xhc3MoRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKSwgXCJiZC1kZXRhY2hlZC1lZGl0b3JcIik7XHJcbiAgICAgICAgQkRWMi5lZGl0b3JEZXRhY2hlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVMaW5lQ291bnQoKSB7XHJcbiAgICAgICAgY29uc3QgbGluZUNvdW50ID0gdGhpcy5yZWZzLmVkaXRvci52YWx1ZS5zcGxpdChcIlxcblwiKS5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGxpbmVDb3VudCA9PSB0aGlzLnByb3BzLmxpbmVzKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5yZWZzLmxpbmVzLnRleHRDb250ZW50ID0gQXJyYXkuZnJvbShuZXcgQXJyYXkobGluZUNvdW50KSwgKF8sIGkpID0+IGkgKyAxKS5qb2luKFwiLlxcblwiKSArIFwiLlwiO1xyXG4gICAgICAgIHRoaXMucHJvcHMubGluZXMgPSBsaW5lQ291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG9wdGlvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbGluZU51bWJlcnM6IHRydWUsXHJcbiAgICAgICAgICAgIG1vZGU6IFwiY3NzXCIsXHJcbiAgICAgICAgICAgIGluZGVudFVuaXQ6IDQsXHJcbiAgICAgICAgICAgIHRoZW1lOiBcIm1hdGVyaWFsXCIsXHJcbiAgICAgICAgICAgIHNjcm9sbGJhclN0eWxlOiBcInNpbXBsZVwiXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY3NzKCkge1xyXG4gICAgICAgIGNvbnN0IF9jY3NzID0gRGF0YVN0b3JlLmdldEJERGF0YShcImJkY3VzdG9tY3NzXCIpO1xyXG4gICAgICAgIGxldCBjY3NzID0gXCJcIjtcclxuICAgICAgICBpZiAoX2Njc3MgJiYgX2Njc3MgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgY2NzcyA9IEJ1ZmZlci5mcm9tKF9jY3NzLCBcImJhc2U2NFwiKS50b1N0cmluZyhcInV0ZjhcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjY3NzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByb290KCkge1xyXG4gICAgICAgIGNvbnN0IF9yb290ID0gRE9NLnF1ZXJ5KFwiI2JkLWN1c3RvbWNzcy1kZXRhY2gtY29udGFpbmVyXCIpO1xyXG4gICAgICAgIGlmICghX3Jvb3QpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluamVjdFJvb3QoKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRldGFjaGVkUm9vdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9yb290O1xyXG4gICAgfVxyXG5cclxuICAgIGluamVjdFJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgYXBwID0gRE9NLnF1ZXJ5KFwiLmFwcCwgLlwiK1V0aWxzLnJlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLmFwcCAmJiBlLmxheWVycylbMF0uYXBwKSk7XHJcbiAgICAgICAgaWYgKCFhcHApIHJldHVybiBmYWxzZTtcclxuICAgICAgICBET00uaW5zZXJ0QWZ0ZXIoRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRhaW5lclwiPmApLCBhcHApO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJkLWRldGFjaGVkLWNzcy1lZGl0b3JcIiwgaWQ6IFwiYmQtY3VzdG9tY3NzLWRldGFjaC1lZGl0b3JcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWlubmVycGFuZVwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImVkaXRvci13cmFwcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IFwiYmQtY3VzdG9tY3NzLWVkaXRvci1kZXRhY2hlZFwiLCBjbGFzc05hbWU6IFwiZWRpdG9yXCIsIHJlZjogXCJlZGl0b3JcIn0sIHNlbGYuY3NzKVxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtpZDogXCJiZC1jdXN0b21jc3MtYXR0YWNoLWNvbnRyb2xzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ1bFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImNoZWNrYm94LWdyb3VwXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hlY2tib3gsIHtpZDogXCJsaXZlLXVwZGF0ZVwiLCB0ZXh0OiBcIkxpdmUgVXBkYXRlXCIsIG9uQ2hhbmdlOiBzZWxmLm9uQ2hhbmdlLCBjaGVja2VkOiBzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXX0pXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtpZDogXCJiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRyb2xzLWJ1dHRvblwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2JvcmRlclJhZGl1czogXCIzcHggMCAwIDNweFwiLCBib3JkZXJSaWdodDogXCIxcHggc29saWQgIzNmNDE0NlwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcInVwZGF0ZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVXBkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2JvcmRlclJhZGl1czogXCIwXCIsIGJvcmRlckxlZnQ6IFwiMXB4IHNvbGlkICMyZDJkMmRcIiwgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkICMyZDJkMmRcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJzYXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJTYXZlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2JvcmRlclJhZGl1czogXCIwIDNweCAzcHggMFwiLCBib3JkZXJMZWZ0OiBcIjFweCBzb2xpZCAjM2Y0MTQ2XCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwiYXR0YWNoXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJBdHRhY2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInNwYW5cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2ZvbnRTaXplOiBcIjEwcHhcIiwgbWFyZ2luTGVmdDogXCI1cHhcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVbnNhdmVkIGNoYW5nZXMgYXJlIGxvc3Qgb24gYXR0YWNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UoaWQsIGNoZWNrZWQpIHtcclxuICAgICAgICBzd2l0Y2ggKGlkKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJsaXZlLXVwZGF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl0gPSBjaGVja2VkO1xyXG4gICAgICAgICAgICAgICAgU2V0dGluZ3Muc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljayhpZCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHN3aXRjaCAoaWQpIHtcclxuICAgICAgICAgICAgY2FzZSBcImF0dGFjaFwiOlxyXG4gICAgICAgICAgICAgICAgaWYgKERPTS5xdWVyeShcIiNlZGl0b3ItZGV0YWNoZWRcIikpIHNlbGYucHJvcHMuYXR0YWNoKCk7XHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0RG9tLnVubW91bnRDb21wb25lbnRBdE5vZGUoc2VsZi5yb290KTtcclxuICAgICAgICAgICAgICAgIHNlbGYucm9vdC5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwidXBkYXRlXCI6XHJcbiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZUNzcygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJzYXZlXCI6XHJcbiAgICAgICAgICAgICAgICBzZWxmLnNhdmVDc3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVDc3MoKSB7XHJcbiAgICAgICAgRE9NLnJlbW92ZVN0eWxlKFwiY3VzdG9tY3NzXCIpO1xyXG4gICAgICAgIERPTS5hZGRTdHlsZShcImN1c3RvbWNzc1wiLCB0aGlzLmVkaXRvci5zZXNzaW9uLmdldFZhbHVlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHNhdmVDc3MoKSB7XHJcbiAgICAgICAgRGF0YVN0b3JlLnNldEJERGF0YShcImJkY3VzdG9tY3NzXCIsIEJ1ZmZlci5mcm9tKHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0VmFsdWUoKSwgXCJ1dGYtOFwiKS50b1N0cmluZyhcImJhc2U2NFwiKSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQkRFcnJvckJvdW5kYXJ5IGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgIHRoaXMuc3RhdGUgPSB7aGFzRXJyb3I6IGZhbHNlfTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRDYXRjaCgpIHtcclxuICAgICAgdGhpcy5zZXRTdGF0ZSh7aGFzRXJyb3I6IHRydWV9KTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgIGlmICh0aGlzLnN0YXRlLmhhc0Vycm9yKSByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwicmVhY3QtZXJyb3JcIn0sIFwiQ29tcG9uZW50IEVycm9yXCIpOyAgXHJcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuOyBcclxuICAgIH1cclxufVxyXG5cclxuY29uc3Qgb3JpZ2luYWxSZW5kZXIgPSBCREVycm9yQm91bmRhcnkucHJvdG90eXBlLnJlbmRlcjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJERXJyb3JCb3VuZGFyeS5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHtcclxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcclxuICAgIHNldDogZnVuY3Rpb24oKSB7Y29uc29sZS53YXJuKFwiQWRkb24gcG9saWN5IGZvciBwbHVnaW5zICM1IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvd2lraS9BZGRvbi1Qb2xpY2llcyNwbHVnaW5zXCIpO30sXHJcbiAgICBnZXQ6ICgpID0+IG9yaWdpbmFsUmVuZGVyXHJcbn0pOyAiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGVsZXRlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IFwiMjRweFwiO1xyXG4gICAgICAgIHJldHVybiA8c3ZnIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gZmlsbD1cInZhcigtLXRleHQtbm9ybWFsKVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fSBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCJub25lXCIgZD1cIk0wIDBoMjR2MjRIMFYwelwiLz48cGF0aCBkPVwiTTYgMTljMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjdINnYxMnptMi40Ni03LjEybDEuNDEtMS40MUwxMiAxMi41OWwyLjEyLTIuMTIgMS40MSAxLjQxTDEzLjQxIDE0bDIuMTIgMi4xMi0xLjQxIDEuNDFMMTIgMTUuNDFsLTIuMTIgMi4xMi0xLjQxLTEuNDFMMTAuNTkgMTRsLTIuMTMtMi4xMnpNMTUuNSA0bC0xLTFoLTVsLTEgMUg1djJoMTRWNHpcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGgyNHYyNEgwelwiLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPjtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb3duQXJyb3cgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIxNnB4XCI7XHJcbiAgICAgICAgcmV0dXJuIDxzdmcgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSBmaWxsPVwidmFyKC0tdGV4dC1ub3JtYWwpXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC4xMiA5LjI5TDEyIDEzLjE3bDMuODgtMy44OGMuMzktLjM5IDEuMDItLjM5IDEuNDEgMCAuMzkuMzkuMzkgMS4wMiAwIDEuNDFsLTQuNTkgNC41OWMtLjM5LjM5LTEuMDIuMzktMS40MSAwTDYuNyAxMC43Yy0uMzktLjM5LS4zOS0xLjAyIDAtMS40MS4zOS0uMzggMS4wMy0uMzkgMS40MiAwelwiLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPjtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFZGl0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IFwiMjRweFwiO1xyXG4gICAgICAgIHJldHVybiA8c3ZnIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ2YXIoLS10ZXh0LW5vcm1hbClcIiBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fSBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9PlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDE3LjI1VjIxaDMuNzVMMTcuODEgOS45NGwtMy43NS0zLjc1TDMgMTcuMjV6TTIwLjcxIDcuMDRjLjM5LS4zOS4zOS0xLjAyIDAtMS40MWwtMi4zNC0yLjM0Yy0uMzktLjM5LTEuMDItLjM5LTEuNDEgMGwtMS44MyAxLjgzIDMuNzUgMy43NSAxLjgzLTEuODN6XCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCIgZmlsbD1cIm5vbmVcIiAvPlxyXG4gICAgICAgICAgICAgICA8L3N2Zz47XHJcbiAgICB9XHJcbn0iLCJ7LyogPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiIHdpZHRoPVwiMThweFwiIGhlaWdodD1cIjE4cHhcIj5cclxuICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCIgZmlsbD1cIm5vbmVcIi8+XHJcbiAgICA8cGF0aCBkPVwiTTEzIDNjLTQuOTcgMC05IDQuMDMtOSA5SDFsMy44OSAzLjg5LjA3LjE0TDkgMTJINmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuOTMgMC0zLjY4LS43OS00Ljk0LTIuMDZsLTEuNDIgMS40MkM4LjI3IDE5Ljk5IDEwLjUxIDIxIDEzIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0tMSA1djVsNC4yOCAyLjU0LjcyLTEuMjEtMy41LTIuMDhWOEgxMnpcIi8+XHJcbjwvc3ZnPiAqL31cclxuXHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIaXN0b3J5IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IFwiMThweFwiO1xyXG4gICAgICAgIHJldHVybiA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwidmFyKC0tdGV4dC1ub3JtYWwpXCIgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fSBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9PlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiIGZpbGw9XCJub25lXCIvPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTEzIDNjLTQuOTcgMC05IDQuMDMtOSA5SDFsMy44OSAzLjg5LjA3LjE0TDkgMTJINmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuOTMgMC0zLjY4LS43OS00Ljk0LTIuMDZsLTEuNDIgMS40MkM4LjI3IDE5Ljk5IDEwLjUxIDIxIDEzIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0tMSA1djVsNC4yOCAyLjU0LjcyLTEuMjEtMy41LTIuMDhWOEgxMnpcIi8+XHJcbiAgICAgICAgPC9zdmc+O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjE2cHhcIjtcclxuICAgICAgICByZXR1cm4gPHN2ZyBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IGZpbGw9XCJ2YXIoLS10ZXh0LW5vcm1hbClcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgc3R5bGU9e3t3aWR0aDogc2l6ZSwgaGVpZ2h0OiBzaXplfX0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGgyNHYyNEgwVjB6XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHpcIi8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz47XHJcbiAgICB9XHJcbn0iLCJsZXQgbWFyZ2luTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luVG9wNjApWzBdXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYXJnaW5Ub3AgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgaWYoIW1hcmdpbk1vZHVsZSltYXJnaW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Ub3A2MClbMF1cclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e21hcmdpbk1vZHVsZS5tYXJnaW5Ub3A2MH0+PC9kaXY+XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgVjJDX1NldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xyXG5pbXBvcnQgVjJDX1NldHRpbmdzR3JvdXAgZnJvbSBcIi4vc2V0dGluZ3NHcm91cFwiO1xyXG5pbXBvcnQgZGF0YVN0b3JlIGZyb20gXCIuLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgeyBkZWZhdWx0UlBDLCBzZXR0aW5nc1JQQyB9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQ3VzdG9tUmljaFByZXNlbmNlIGZyb20gXCIuLi9tb2R1bGVzL0N1c3RvbVJpY2hQcmVzZW5jZVwiXHJcbmltcG9ydCB7IHJlbW90ZSB9IGZyb20gXCJlbGVjdHJvblwiO1xyXG5pbXBvcnQgTWFyZ2luVG9wIGZyb20gXCIuL21hcmdpbnRvcFwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4uL21vZHVsZXMvdXRpbHNcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmxldCBWMkNfUHJlc2VuY2VTZXR0aW5nc01vZHVsZXNcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1ByZXNlbmNlU2V0dGluZ3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcblxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IGRhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJycGNcIikgfHwgZGVmYXVsdFJQQyxcclxuICAgICAgICAgICAgYXNzZXRzOiBbXVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wcmV2aWV3ID0gbnVsbFxyXG4gICAgICAgIHRoaXMuaXNmZXRjaGluZyA9IGZhbHNlXHJcbiAgICAgICAgaWYodGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkKXtcclxuICAgICAgICAgICAgdGhpcy5mZXRjaEFzc2V0cygpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmFzc2V0Q29tcG9uZW50cyA9IG5ldyBTZXQoKVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVdoZW5GZXRjaGVkKGNvbXApe1xyXG4gICAgICAgIHRoaXMuYXNzZXRDb21wb25lbnRzLmFkZChjb21wKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0lucHV0VGV4dH0gc2V0dGluZyBcclxuICAgICAqL1xyXG4gICAgb25DaGFuZ2Uoc2V0dGluZywgdmFsdWUpe1xyXG4gICAgICAgIGxldCBkZWZhdWx0U2V0dGluZyA9IFJQQ1Byb3BzLmZpbmQoZSA9PiBlLmlkID09PSBzZXR0aW5nLnByb3BzLmlkKVxyXG5cclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgZGF0YTogT2JqZWN0LmFzc2lnbihzZXR0aW5nc1JQQywgdGhpcy5zdGF0ZS5kYXRhLCB7XHJcbiAgICAgICAgICAgICAgICBbZGVmYXVsdFNldHRpbmcuaWRdOiAhIXZhbHVlID8gdmFsdWUgOiBudWxsXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBhc3NldHM6IHRoaXMuc3RhdGUuYXNzZXRzXHJcbiAgICAgICAgfSlcclxuICAgICAgICBpZihzZXR0aW5nLnByb3BzLmlkID09PSBcImFwcGxpY2F0aW9uX2lkXCIpe1xyXG4gICAgICAgICAgICB0aGlzLmZldGNoQXNzZXRzKClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJycGNcIiwgc2V0dGluZ3NSUEMpO1xyXG4gICAgICAgIHRoaXMucHJldmlldy5mb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgQ3VzdG9tUmljaFByZXNlbmNlLnNldChzZXR0aW5nc1JQQylcclxuICAgIH1cclxuXHJcbiAgICBmZXRjaEFzc2V0cygpe1xyXG4gICAgICAgIGlmKHRoaXMuaXNmZXRjaGluZyA9PT0gdHJ1ZSl7XHJcbiAgICAgICAgICAgIGxldCBhcHAgPSB0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWRcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQgIT09IGFwcCl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoQXNzZXRzKClcclxuICAgICAgICAgICAgfSwgNTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCF0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQpe1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuc3RhdGUuZGF0YSxcclxuICAgICAgICAgICAgICAgIGFzc2V0czogW11cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgICAgIHRoaXMuYXNzZXRDb21wb25lbnRzLmZvckVhY2goZSA9PiBlLmZvcmNlVXBkYXRlKCkpXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSB0cnVlXHJcbiAgICAgICAgQ3VzdG9tUmljaFByZXNlbmNlLmZldGNoQXNzZXRzKHRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZClcclxuICAgICAgICAudGhlbihhc3NldHMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuc3RhdGUuZGF0YSxcclxuICAgICAgICAgICAgICAgIGFzc2V0czogT2JqZWN0LmtleXMoYXNzZXRzKS5tYXAoayA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFzc2V0ID0gYXNzZXRzW2tdXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGFzc2V0LmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBhc3NldC5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBhc3NldC50eXBlXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgICAgIHRoaXMuYXNzZXRDb21wb25lbnRzLmZvckVhY2goZSA9PiBlLmZvcmNlVXBkYXRlKCkpXHJcbiAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuc3RhdGUuZGF0YSxcclxuICAgICAgICAgICAgICAgIGFzc2V0czogW11cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgICAgIHRoaXMuYXNzZXRDb21wb25lbnRzLmZvckVhY2goZSA9PiBlLmZvcmNlVXBkYXRlKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVQcmV2aWV3KGRhdGEpe1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBkYXRhXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbW9kdWxlcygpe1xyXG4gICAgICAgIHJldHVybiBWMkNfUHJlc2VuY2VTZXR0aW5nc01vZHVsZXMgfHwgKFYyQ19QcmVzZW5jZVNldHRpbmdzTW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdXHJcbiAgICAgICAgXSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlXHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIDxWMkNfU2V0dGluZ3NHcm91cCB0aXRsZT1cIlJpY2hQcmVzZW5jZSBTZXR0aW5nc1wiIHNldHRpbmdzPXt0aGlzLnByb3BzLnNldHRpbmdzfSBvbkNoYW5nZT17dGhpcy5wcm9wcy5vbkNoYW5nZX0vPixcclxuICAgICAgICAgICAgPE1hcmdpblRvcCAvPixcclxuICAgICAgICAgICAgPFYyQ19TZXR0aW5nc1RpdGxlIHRleHQ9XCJSaWNoUHJlc2VuY2VcIi8+LFxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgey8qKiBvcHRpb25zICovfVxyXG4gICAgICAgICAgICAgICAge3RoaXMub3B0aW9uc0NvbXBvbmVudHN9XHJcbiAgICAgICAgICAgIDwvZGl2PixcclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDxNYXJnaW5Ub3AgLz5cclxuICAgICAgICAgICAgICAgIDxWMkNfU2V0dGluZ3NUaXRsZSB0ZXh0PVwiUHJldmlld1wiLz5cclxuICAgICAgICAgICAgICAgIHsvKiogcHJldmlldyAqL31cclxuICAgICAgICAgICAgICAgIDxScGNQcmV2aWV3IHNldHRpbmdzPXt0aGlzfS8+XHJcbiAgICAgICAgICAgIDwvZGl2PixcclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e21hcmdpbk1vZHVsZS5tYXJnaW5Cb3R0b20yMH0+PC9kaXY+LFxyXG4gICAgICAgICAgICA8YnV0dG9uIHN0eWxlPXt7b3BhY2l0eTogMC4wMX19IG9uQ2xpY2s9e3dpbmRvdy5vaGdvZG9oZnVja30+XHJcbiAgICAgICAgICAgICAgICBPaCBnb2QgT2ggZnVja1xyXG4gICAgICAgICAgICA8L2J1dHRvbj4sXHJcbiAgICAgICAgICAgIDxidXR0b24gc3R5bGU9e3tvcGFjaXR5OiAwLjAxfX0gb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVtb3RlLnNoZWxsLm9wZW5FeHRlcm5hbChcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9TGtZYTdycHNfZzRcIilcclxuICAgICAgICAgICAgfX0+XHJcbiAgICAgICAgICAgICAgICBTZWUgPyBJIHB1bGxlZCBhIGxpdGxlIHNuZWFreSBvbiB5YVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICBdXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG9wdGlvbnNDb21wb25lbnRzKCl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnNDb21wb25lbnRzIHx8ICh0aGlzLl9vcHRpb25zQ29tcG9uZW50cyA9IFJQQ1Byb3BzLm1hcChlID0+IHtcclxuICAgICAgICAgICAgaWYoZS50eXBlID09PSBcInRleHRcIil7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gPElucHV0VGV4dCBzZXR0aW5nPXtlfSBtYW5hZ2VyPXt0aGlzfSBpZD17ZS5pZH0vPlxyXG4gICAgICAgICAgICB9ZWxzZSBpZihlLnR5cGUgPT09IFwibnVtYmVyXCIpe1xyXG4gICAgICAgICAgICAgICAgbGV0IGFycmF5ID0gWzxJbnB1dE51bWJlciBzZXR0aW5nPXtlfSBtYW5hZ2VyPXt0aGlzfSBpZD17ZS5pZH0vPl0vKlxyXG4gICAgICAgICAgICAgICAgaWYoZS5pZCA9PT0gXCJ0aW1lc3RhbXBzLnN0YXJ0XCIpe1xyXG4gICAgICAgICAgICAgICAgICAgIGFycmF5LnVuc2hpZnQoPERpc2NvcmRCdXR0b24gdGl0bGU9XCJDb3B5IEN1cnJlbnQgVGltZXN0YW1wXCIgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBEaXNjb3JkTmF0aXZlLmNsaXBib2FyZC5jb3B5KERhdGUubm93KCkrXCJcIilcclxuICAgICAgICAgICAgICAgICAgICB9fSAvPilcclxuICAgICAgICAgICAgICAgIH0qL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKGUudHlwZSA9PT0gXCJjaG9pY2VcIil7XHJcbiAgICAgICAgICAgICAgICBpZihbXCJhc3NldHMuc21hbGxcIiwgXCJhc3NldHMubGFyZ2VcIl0uaW5jbHVkZXMoZS5pZCkpe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8SW5wdXRDaG9pY2Ugc2V0dGluZz17ZX0gbWFuYWdlcj17dGhpc30gaWQ9e2UuaWR9IGNob2ljZXM9e1t7dmFsdWU6IFwibm9uZVwiLCBsYWJlbDogXCJObyBhc3NldHNcIn1dLmNvbmNhdCh0aGlzLnN0YXRlLmFzc2V0cy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogXCJhc3NldC1cIitlLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGUubmFtZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSkpfS8+XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJVbmtub3duIGNob2ljZS5cIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkpXHJcbiAgICB9XHJcbn1cclxuY29uc3QgUlBDUHJvcHMgPSBbXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiQXBwbGljYXRpb24gSURcIixcclxuICAgICAgICBpZDogXCJhcHBsaWNhdGlvbl9pZFwiLFxyXG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXHJcbiAgICAgICAgcGxhY2Vob2xkZXI6IFwiNzExNDE2OTU3NzE4NzU3NDE4XCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiTmFtZVwiLFxyXG4gICAgICAgIGlkOiBcIm5hbWVcIixcclxuICAgICAgICB0eXBlOiBcInRleHRcIixcclxuICAgICAgICBwbGFjZWhvbGRlcjogXCJMaWdodGNvcmRcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJEZXRhaWxzXCIsXHJcbiAgICAgICAgaWQ6IFwiZGV0YWlsc1wiLFxyXG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxyXG4gICAgICAgIHBsYWNlaG9sZGVyOiBcIkJyb3dzaW5nIERpc2NvcmRcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJTdGF0ZVwiLFxyXG4gICAgICAgIGlkOiBcInN0YXRlXCIsXHJcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXHJcbiAgICAgICAgcGxhY2Vob2xkZXI6IFwiTGlnaHRjb3JkIENsaWVudFwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIlRpbWVzdGFtcCBTdGFydFwiLFxyXG4gICAgICAgIGlkOiBcInRpbWVzdGFtcHMuc3RhcnRcIixcclxuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxyXG4gICAgICAgIGdldCBwbGFjZWhvbGRlcigpe1xyXG4gICAgICAgICAgICByZXR1cm4gRGF0ZS5ub3coKVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiTGFyZ2VBc3NldFwiLFxyXG4gICAgICAgIGlkOiBcImFzc2V0cy5sYXJnZVwiLFxyXG4gICAgICAgIHR5cGU6IFwiY2hvaWNlXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiU21hbGxBc3NldFwiLFxyXG4gICAgICAgIGlkOiBcImFzc2V0cy5zbWFsbFwiLFxyXG4gICAgICAgIHR5cGU6IFwiY2hvaWNlXCJcclxuICAgIH0sXHJcbl1cclxuXHJcbmxldCBpbnB1dFRleHRNb2R1bGVzXHJcbmNsYXNzIElucHV0VGV4dCBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICBpZihpbnB1dFRleHRNb2R1bGVzICYmIGlucHV0VGV4dE1vZHVsZXNbMF0pcmV0dXJuIGlucHV0VGV4dE1vZHVsZXNcclxuICAgICAgICByZXR1cm4gaW5wdXRUZXh0TW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUucmVtb3ZlS2V5YmluZClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLl9ob3Jpem9udGFsKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuaW5wdXRNaW5pKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTE2ICYmIGUuc2l6ZTIwKVswXSxcclxuICAgICAgICBdXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xyXG4gICAgICAgIHN1cGVyKHByb3BzKVxyXG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgZGF0YTogdGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmRhdGFbc2V0dGluZy5pZF1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5wdXQgPSA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuVGV4dElucHV0IHBsYWNlaG9sZGVyPXtzZXR0aW5nLnBsYWNlaG9sZGVyfSBuYW1lPXtzZXR0aW5nLmlkfSB2YWx1ZT17dGhpcy5zdGF0ZS5kYXRhfSBvbkNoYW5nZT17KHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgZGF0YTogdmFsdWVcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgaWYoIXRoaXMubGFzdEVkaXRlZCB8fCB0aGlzLmxhc3RFZGl0ZWQgPCBEYXRlLm5vdygpIC0gNTAwKXtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB2YWx1ZSlcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdEVkaXRlZCA9IERhdGUubm93KClcclxuICAgICAgICAgICAgfWVsc2UgaWYoIXRoaXMuaXNUaW1pbmcpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB0aGlzLnN0YXRlLmRhdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXHJcbiAgICAgICAgICAgICAgICB9LCA1MDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfX0gdHlwZT1cInRleHRcIi8+XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcclxuXHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgcm93TW9kdWxlLFxyXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGUsXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZTIsXHJcbiAgICAgICAgICAgIGNvbG9yTW9kdWxlLFxyXG4gICAgICAgICAgICBzaXplTW9kdWxlLFxyXG4gICAgICAgICAgICBmbGV4TW9kdWxlLFxyXG4gICAgICAgICAgICBpbnB1dE1vZHVsZSxcclxuICAgICAgICAgICAgc2l6ZU1vZHVsZTIsXHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG5cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtyb3dNb2R1bGUucm93K1wiIFwiK21hcmdpbk1vZHVsZS5tYXJnaW5Cb3R0b20yMH0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtyb3dNb2R1bGUuaXRlbX0gJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH1gfT5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XHJcbiAgICAgICAgICAgICAgICAgICAge3NldHRpbmcudGl0bGV9XHJcbiAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAge3RoaXMuaW5wdXR9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8RGl2aWRlci8+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgSW5wdXROdW1iZXJNb2R1bGVzXHJcbmNsYXNzIElucHV0TnVtYmVyIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XHJcbiAgICBnZXQgbW9kdWxlcygpe1xyXG4gICAgICAgIHJldHVybiBJbnB1dE51bWJlck1vZHVsZXMgfHwgKElucHV0TnVtYmVyTW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUucmVtb3ZlS2V5YmluZClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLl9ob3Jpem9udGFsKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuaW5wdXRNaW5pKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTE2ICYmIGUuc2l6ZTIwKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JUcmFuc3BhcmVudClbMF0sXHJcbiAgICAgICAgXSlcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpXHJcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBkYXRhOiB0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuZGF0YVtzZXR0aW5nLmlkXVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pbnB1dCA9IDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5UZXh0SW5wdXQgcGxhY2Vob2xkZXI9e3NldHRpbmcucGxhY2Vob2xkZXJ9IG5hbWU9e3NldHRpbmcuaWR9IHZhbHVlPXt0aGlzLnN0YXRlLmRhdGF9IHR5cGU9XCJudW1iZXJcIiBvbkNoYW5nZT17KHZhbHVlLCBuYW1lLCBpbnB1dCkgPT4ge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1teXFxkXSsvZywgXCJcIilcclxuICAgICAgICAgICAgaWYodmFsdWUgPT0gdGhpcy5zdGF0ZS5kYXRhKXtcclxuICAgICAgICAgICAgICAgIGlucHV0LnNldFZhbHVlKHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmKCF0aGlzLmxhc3RFZGl0ZWQgfHwgdGhpcy5sYXN0RWRpdGVkIDwgRGF0ZS5ub3coKSAtIDUwMCl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgdmFsdWUpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXHJcbiAgICAgICAgICAgIH1lbHNlIGlmKCF0aGlzLmlzVGltaW5nKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNUaW1pbmcgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgdGhpcy5zdGF0ZS5kYXRhKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUaW1pbmcgPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxyXG4gICAgICAgICAgICAgICAgfSwgNTAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IHZhbHVlXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfX0gdHlwZT1cInRleHRcIi8+XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcclxuXHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgcm93TW9kdWxlLFxyXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGUsXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZTIsXHJcbiAgICAgICAgICAgIGNvbG9yTW9kdWxlLFxyXG4gICAgICAgICAgICBzaXplTW9kdWxlLFxyXG4gICAgICAgICAgICBmbGV4TW9kdWxlLFxyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuXHJcblxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e3Jvd01vZHVsZS5yb3crXCIgXCIrbWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwfT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3Jvd01vZHVsZS5pdGVtfSAke2ZsZXhNb2R1bGUuZmxleENoaWxkfWB9PlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cclxuICAgICAgICAgICAgICAgICAgICB7c2V0dGluZy50aXRsZX1cclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICB7dGhpcy5pbnB1dH1cclxuICAgICAgICAgICAgICAgIHtzZXR0aW5nLmlkID09PSBcInRpbWVzdGFtcHMuc3RhcnRcIiA/IFxyXG4gICAgICAgICAgICAgICAgPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBEaXNjb3JkTmF0aXZlLmNsaXBib2FyZC5jb3B5KERhdGUubm93KCkrXCJcIilcclxuICAgICAgICAgICAgICAgIH19IGNvbG9yPVwiYnJhbmRcIj5Db3B5IGN1cnJlbnQgdGltZXN0YW1wPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbj4gOiBudWxsfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPERpdmlkZXIvPlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxubGV0IElucHV0Q2hvaWNlTW9kdWxlc1xyXG5jbGFzcyBJbnB1dENob2ljZSBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xyXG4gICAgICAgIHN1cGVyKHByb3BzKVxyXG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgZGF0YTogdGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmRhdGFbc2V0dGluZy5pZF0gPyBcImFzc2V0LVwiK3RoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5kYXRhW3NldHRpbmcuaWRdIDogXCJub25lXCJcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLnVwZGF0ZVdoZW5GZXRjaGVkKHRoaXMpXHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UoZGF0YSl7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gZGF0YS52YWx1ZVxyXG5cclxuICAgICAgICBpZighdGhpcy5sYXN0RWRpdGVkIHx8IHRoaXMubGFzdEVkaXRlZCA8IERhdGUubm93KCkgLSA1MDApe1xyXG4gICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgdmFsdWUgPT09IFwibm9uZVwiID8gbnVsbCA6IHZhbHVlLnJlcGxhY2UoXCJhc3NldC1cIiwgXCJcIikpXHJcbiAgICAgICAgICAgIHRoaXMubGFzdEVkaXRlZCA9IERhdGUubm93KClcclxuICAgICAgICB9ZWxzZSBpZighdGhpcy5pc1RpbWluZyl7XHJcbiAgICAgICAgICAgIHRoaXMuaXNUaW1pbmcgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB0aGlzLnN0YXRlLmRhdGEgPT09IFwibm9uZVwiID8gbnVsbCA6IHRoaXMuc3RhdGUuZGF0YS5yZXBsYWNlKFwiYXNzZXQtXCIsIFwiXCIpKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IG51bGxcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdEVkaXRlZCA9IERhdGUubm93KClcclxuICAgICAgICAgICAgfSwgNTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGRhdGE6IHZhbHVlXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKClcclxuICAgIH1cclxuICAgIFxyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gSW5wdXRDaG9pY2VNb2R1bGVzIHx8IChJbnB1dENob2ljZU1vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnJlbW92ZUtleWJpbmQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF1cclxuICAgICAgICBdKVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXHJcblxyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIHJvd01vZHVsZSxcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlLFxyXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGUyLFxyXG4gICAgICAgICAgICBjb2xvck1vZHVsZSxcclxuICAgICAgICAgICAgc2l6ZU1vZHVsZSxcclxuICAgICAgICAgICAgZmxleE1vZHVsZVxyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuICAgICAgICBcclxuICAgICAgICBsZXQgb3B0aW9ucyA9IHRoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5hc3NldHMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdmFsdWU6IFwiYXNzZXQtXCIrZS5pZCxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBlLm5hbWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIG9wdGlvbnMudW5zaGlmdCh7XHJcbiAgICAgICAgICAgIHZhbHVlOiBcIm5vbmVcIixcclxuICAgICAgICAgICAgbGFiZWw6IFwiTm8gYXNzZXRzXCJcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtyb3dNb2R1bGUucm93K1wiIFwiK21hcmdpbk1vZHVsZS5tYXJnaW5Cb3R0b20yMH0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtyb3dNb2R1bGUuaXRlbX0gJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH1gfT5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XHJcbiAgICAgICAgICAgICAgICAgICAge3NldHRpbmcudGl0bGV9XHJcbiAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkRyb3Bkb3duIHZhbHVlPXt0aGlzLnN0YXRlLmRhdGF9IG9wdGlvbnM9e29wdGlvbnN9IG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyl9IC8+XHJcbiAgICAgICAgICAgICAgICB7Lyo8U2VsZWN0IHZhbHVlPXt0aGlzLnN0YXRlLmRhdGF9IG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyl9IG9wdGlvbnM9e29wdGlvbnN9Lz4qL31cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxEaXZpZGVyLz5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCBEaXZpZGVyTW9kdWxlcyA9IFtdXHJcbmNsYXNzIERpdmlkZXIgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIERpdmlkZXJNb2R1bGVzJiZEaXZpZGVyTW9kdWxlc1swXSA/IERpdmlkZXJNb2R1bGVzIDogKERpdmlkZXJNb2R1bGVzID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyICYmIE9iamVjdC5rZXlzKGUpLmxlbmd0aCA9PT0gMSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRpdmlkZXJEZWZhdWx0KVswXVxyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgZGl2aWRlcixcclxuICAgICAgICAgICAgZGl2aWRlckRlZmF1bHRcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcblxyXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzPXtgJHtkaXZpZGVyLmRpdmlkZXJ9ICR7ZGl2aWRlckRlZmF1bHQuZGl2aWRlckRlZmF1bHR9YH0+PC9kaXY+XHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIERpc2NvcmRCdXR0b24gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHJvd01vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnJlbW92ZUtleWJpbmQpWzBdXHJcbiAgICAgICAgbGV0IG1hcmdpbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXVxyXG4gICAgICAgIGxldCBmbGV4TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdXHJcblxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e3Jvd01vZHVsZS5yb3crXCIgXCIrbWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwfT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3Jvd01vZHVsZS5pdGVtfSAke2ZsZXhNb2R1bGUuZmxleENoaWxkfWB9PlxyXG4gICAgICAgICAgICAgICAgPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uIG9uQ2xpY2s9e3RoaXMucHJvcHMub25DbGlja30gY29sb3I9XCJicmFuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLnRpdGxlfVxyXG4gICAgICAgICAgICAgICAgPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBScGNQcmV2aWV3IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzID0ge30pe1xyXG4gICAgICAgIHN1cGVyKHByb3BzKVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGFjdGl2ZTogXCJwcm9maWxlXCJcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50YWJzID0gW11cclxuXHJcbiAgICAgICAgdGhpcy5wcm9wcy5zZXR0aW5ncy5wcmV2aWV3ID0gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIGNoYW5nZVRhYih0YWIpe1xyXG4gICAgICAgIGxldCBhbmNpZW50VGFiID0gdGhpcy5zdGF0ZS5hY3RpdmVcclxuICAgICAgICBpZihhbmNpZW50VGFiID09PSB0YWIucHJvcHMuaWQpcmV0dXJuXHJcblxyXG4gICAgICAgIHRoaXMudGFicy5mb3JFYWNoKGUgPT4ge1xyXG4gICAgICAgICAgICBlLnNldEFjdGl2ZShmYWxzZSlcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRhYi5zZXRBY3RpdmUodHJ1ZSlcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgYWN0aXZlOiB0YWIucHJvcHMuaWRcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9XCJsYy10YWJXcmFwcGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGMtdGFibmF2XCIgc3R5bGU9e3tmbGV4OiBcIjAgMSBhdXRvXCJ9fT5cclxuICAgICAgICAgICAgICAgIDxUYWIgcHJldmlldz17dGhpc30gdGl0bGU9XCJGdWxsIFByb2ZpbGVcIiBpZD1cInByb2ZpbGVcIi8+XHJcbiAgICAgICAgICAgICAgICA8VGFiIHByZXZpZXc9e3RoaXN9IHRpdGxlPVwiVXNlciBQb3BvdXRcIiBpZD1cInBvcG91dFwiLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxQcmVzZW5jZUVycm9yQ2F0Y2hlciBwcmV2aWV3PXt0aGlzLnByZXZpZXd9IHN0YXRlPXt0aGlzLnN0YXRlLnJwY30gcHJvcHM9e3twcmV2aWV3OiB0aGlzfX0ga2V5PXt0aGlzLnN0YXRlLmFjdGl2ZX0gLz5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9ICAgXHJcblxyXG4gICAgaXNBY3RpdmUodGFiKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5hY3RpdmUgPT09IHRhYlxyXG4gICAgfVxyXG5cclxuICAgIGdldCBwcmV2aWV3KCl7XHJcbiAgICAgICAgaWYodGhpcy5zdGF0ZS5hY3RpdmUgPT09IFwicHJvZmlsZVwiKXJldHVybiBQcm9maWxlXHJcbiAgICAgICAgcmV0dXJuIFBvcG91dFxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBUYWIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xyXG4gICAgICAgIHN1cGVyKHByb3BzKVxyXG5cclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBhY3RpdmU6IHByb3BzLnByZXZpZXcuaXNBY3RpdmUocHJvcHMuaWQpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHByb3BzLnByZXZpZXcudGFicy5wdXNoKHRoaXMpXHJcbiAgICB9XHJcblxyXG4gICAgc2V0QWN0aXZlKGlzQWN0aXZlKXtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgYWN0aXZlOiAhIWlzQWN0aXZlXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgY2xhc3NOYW1lID0gYGxjLW5hdkl0ZW1gXHJcbiAgICAgICAgaWYodGhpcy5zdGF0ZS5hY3RpdmUpe1xyXG4gICAgICAgICAgICBjbGFzc05hbWUgKz0gYCBsYy1uYXZJdGVtQWN0aXZlYFxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBjbGFzc05hbWUgKz0gYCBsYy1uYXZJdGVtSW5hY3RpdmVgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e2NsYXNzTmFtZX0gb25DbGljaz17KCk9PntcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5wcmV2aWV3LmNoYW5nZVRhYih0aGlzKVxyXG4gICAgICAgIH19PlxyXG4gICAgICAgICAgICB7dGhpcy5wcm9wcy50aXRsZX1cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCBlbXB0eUNsYXNzZXNcclxuY2xhc3MgUHJlc2VuY2VFcnJvckNhdGNoZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29tcG9uZW50RGlkQ2F0Y2goZXJyLCBlcnJJbmZvKXtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVyciwgZXJySW5mbylcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgZXJyb3I6IHRydWVcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgaWYoIXRoaXMuc3RhdGUpe1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICAgICAgZXJyb3I6IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIXRoaXMuc3RhdGUuZXJyb3Ipe1xyXG4gICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2aWV3ID0gbmV3IHRoaXMucHJvcHMucHJldmlldyh0aGlzLnByb3BzLnByb3BzKVxyXG4gICAgICAgICAgICAgICAgcHJldmlldy5zZXRTdGF0ZSh0aGlzLnByb3BzLnN0YXRlKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpZXcucmVuZGVyKClcclxuICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUuZXJyb3IgPSB0cnVlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXIoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGVtcHR5Q2xhc3NlcyA9IGVtcHR5Q2xhc3NlcyB8fCBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLmVtcHR5U3RhdGVJbWFnZSAmJiBlLmVtcHR5U3RhdGUpXHJcbiAgICAgICAgICAgIGlmKCFlbXB0eUNsYXNzZXMpe1xyXG4gICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KFwiQW4gZXJyb3Igb2NjdXJlZC4gUGxlYXNlIGNoZWNrIHRoZSBjb25zb2xlIGZvciBtb3JlIGluZm9ybWF0aW9ucy5cIilcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIDxkaXYgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgIG1hcmdpbjogXCIyMHB4XCJcclxuICAgICAgICAgICAgfX0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcInZhcigtLWJhY2tncm91bmQtcHJpbWFyeSlcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogXCIzMHB4IDMwcHhcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjhweFwiXHJcbiAgICAgICAgICAgICAgICB9fSBjbGFzc05hbWU9e2BsYy10YWItYm94LXNoYWRvdyAke2VtcHR5Q2xhc3Nlcy5lbXB0eVN0YXRlfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtlbXB0eUNsYXNzZXMuZW1wdHlTdGF0ZUltYWdlfSBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6IFwiMjBweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgfX0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtlbXB0eUNsYXNzZXMuZW1wdHlTdGF0ZUhlYWRlcn0+QW4gZXJyb3Igb2NjdXJlZDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT17ZW1wdHlDbGFzc2VzLmVtcHR5U3RhdGVTdWJ0ZXh0fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgUGxlYXNlIGNoZWNrIHRoZSBjb25zb2xlIGZvciBtb3JlIGluZm9ybWF0aW9ucy4gSm9pbiBvdXIgwq1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3NOYW1lPXtgJHtCRFYyLmFuY2hvckNsYXNzZXMuYW5jaG9yfSAke0JEVjIuYW5jaG9yQ2xhc3Nlcy5hbmNob3JVbmRlcmxpbmVPbkhvdmVyfWB9IHJvbGU9XCJidXR0b25cIiB0YWJpbmRleD17MH0gb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5qb2luTEMoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgc2VydmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgwq0gZm9yIGhlbHAuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxubGV0IHBvcG91dE1vZHVsZXNcclxubGV0IFVzZXJQb3BvdXRDb21wb25lbnRcclxubGV0IFBvcG91dFByb3BzXHJcbmNsYXNzIFBvcG91dCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBnZXQgbW9kdWxlcygpe1xyXG4gICAgICAgIHJldHVybiBwb3BvdXRNb2R1bGVzIHx8IChwb3BvdXRNb2R1bGVzID0gW1xyXG4gICAgICAgICAgICBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIkZsdXhDb250YWluZXIoRm9yd2FyZFJlZihTdWJzY3JpYmVHdWlsZE1lbWJlcnNDb250YWluZXIoVXNlclBvcG91dCkpKVwiKSxcclxuICAgICAgICAgICAgQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilcclxuICAgICAgICBdKVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIFVzZXJQb3BvdXQsXHJcbiAgICAgICAgICAgIHVzZXJNb2R1bGVcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcblxyXG4gICAgICAgIGNvbnN0IHVzZXIgPSB1c2VyTW9kdWxlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgICAgIGlmKCFVc2VyUG9wb3V0Q29tcG9uZW50KXtcclxuICAgICAgICAgICAgaWYoIVVzZXJQb3BvdXQpdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIHRoZSBVc2VyUG9wb3V0IGNvbXBvbmVudC5gKVxyXG4gICAgICAgICAgICBjb25zdCByZW5kZXIxID0gbmV3IFVzZXJQb3BvdXQuZGVmYXVsdCh7dXNlcklkOiB1c2VyLmlkLCBndWlsZElkOiBudWxsLCBjaGFubmVsSWQ6IG51bGwsIGRpc2FibGVVc2VyUHJvZmlsZUxpbms6IHRydWV9KS5yZW5kZXIoKVxyXG4gICAgICAgICAgICBQb3BvdXRQcm9wcyA9IHJlbmRlcjEucHJvcHNcclxuICAgICAgICAgICAgY29uc3QgcmVuZGVyMiA9IHJlbmRlcjEudHlwZS5yZW5kZXIoUG9wb3V0UHJvcHMsIG51bGwpXHJcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlcjMgPSBuZXcgcmVuZGVyMi50eXBlKHJlbmRlcjIucHJvcHMpLnJlbmRlcigpXHJcbiAgICAgICAgICAgIFVzZXJQb3BvdXRDb21wb25lbnQgPSByZW5kZXIzLnR5cGVcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIVVzZXJQb3BvdXRDb21wb25lbnQpdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIHRoZSBVc2VyUG9wb3V0Q29tcG9uZW50IGNvbXBvbmVudC5gKVxyXG5cclxuICAgICAgICBsZXQgZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRSUEMsIHRoaXMucHJvcHMucHJldmlldy5wcm9wcy5zZXR0aW5ncy5zdGF0ZS5kYXRhKVxyXG4gICAgICAgIGNvbnN0IGFjdGl2aXR5ID0gKGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIGlmKCF0aGlzLmdhbWUpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgbGV0IGdhbWUgPSB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLmdhbWUubmFtZSB8fCBkZWZhdWx0UlBDLm5hbWUsXHJcbiAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbl9pZDogdGhpcy5nYW1lLmFwcGxpY2F0aW9uX2lkIHx8IGRlZmF1bHRSUEMuYXBwbGljYXRpb25faWQsXHJcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiB0aGlzLmdhbWUuZGV0YWlscyB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICBzdGF0ZTogdGhpcy5nYW1lLnN0YXRlIHx8IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcHM6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl0gPyB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl1cclxuICAgICAgICAgICAgICAgIH0gOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICBhc3NldHM6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSA/IHtcclxuICAgICAgICAgICAgICAgICAgICBsYXJnZV9pbWFnZTogdGhpcy5nYW1lW1wiYXNzZXRzLmxhcmdlXCJdLFxyXG4gICAgICAgICAgICAgICAgICAgIHNtYWxsX2ltYWdlOiB0aGlzLmdhbWVbXCJhc3NldHMuc21hbGxcIl0gfHwgdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICB9IDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogMFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBnYW1lXHJcbiAgICAgICAgfSkuY2FsbCh7XHJcbiAgICAgICAgICAgIGdhbWU6IGRhdGFcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICBQb3BvdXRQcm9wcyA9IG5ldyBVc2VyUG9wb3V0LmRlZmF1bHQoe3VzZXJJZDogdXNlci5pZCwgZ3VpbGRJZDogbnVsbCwgY2hhbm5lbElkOiBudWxsLCBkaXNhYmxlVXNlclByb2ZpbGVMaW5rOiB0cnVlfSkucmVuZGVyKCkucHJvcHNcclxuICAgICAgICBjb25zdCBwb3BvdXQgPSBuZXcgVXNlclBvcG91dENvbXBvbmVudChPYmplY3QuYXNzaWduKHt9LCBQb3BvdXRQcm9wcywge1xyXG4gICAgICAgICAgICBhY3Rpdml0eTogYWN0aXZpdHlcclxuICAgICAgICB9KSkucmVuZGVyKCkucHJvcHMuY2hpbGRyZW4gLy8gYnlwYXNzIHRyYWNraW5nXHJcblxyXG4gICAgICAgIC8vIHJlbW92ZSB0aGUgc3RvcCBwcm9wYWdhdGlvbiBzaGl0LlxyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IDxkaXYgey4uLndpbmRvdy5MaWdodGNvcmQuQXBpLl8uZXhjbHVkZVByb3BlcnRpZXMocG9wb3V0LnByb3BzLCBbXCJvbkNsaWNrXCIsIFwib25Db250ZXh0TWVudVwiXSl9IC8+XHJcblxyXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImxjLXVzZXJQb3BvdXQgbGMtdGFiLWJveC1zaGFkb3dcIj5cclxuICAgICAgICAgICAge2NvbnRhaW5lcn1cclxuICAgICAgICA8L2Rpdj5cclxuICAgIH1cclxufVxyXG5cclxubGV0IHByb2ZpbGVNb2R1bGVzXHJcbmxldCBVc2VyUHJvZmlsZUNvbXBvbmVudFxyXG5sZXQgUHJvZmlsZVByb3BzXHJcbmxldCBjb25uZWN0ZWRQcm9maWxlU3RvcmVcclxuY2xhc3MgUHJvZmlsZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBnZXQgbW9kdWxlcygpe1xyXG4gICAgICAgIHJldHVybiBwcm9maWxlTW9kdWxlcyB8fCAocHJvZmlsZU1vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJEVjIuV2VicGFja01vZHVsZXMuZmluZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUgPT09IFwiVXNlclByb2ZpbGVcIiksXHJcbiAgICAgICAgICAgIEJEVjIuV2VicGFja01vZHVsZXMuZmluZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpXHJcbiAgICAgICAgXSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBVc2VyUHJvZmlsZSxcclxuICAgICAgICAgICAgdXNlck1vZHVsZVxyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuXHJcbiAgICAgICAgY29uc3QgdXNlciA9IHVzZXJNb2R1bGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXHJcbiAgICAgICAgaWYoIVVzZXJQcm9maWxlQ29tcG9uZW50KXtcclxuICAgICAgICAgICAgY29uc3QgcmVuZGVyMSA9IG5ldyBVc2VyUHJvZmlsZS5kZWZhdWx0KHtcclxuICAgICAgICAgICAgICAgIHVzZXI6IHVzZXJcclxuICAgICAgICAgICAgfSkucmVuZGVyKClcclxuICAgICAgICAgICAgY29ubmVjdGVkUHJvZmlsZVN0b3JlID0gcmVuZGVyMS50eXBlXHJcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlcjIgPSBuZXcgcmVuZGVyMS50eXBlKHJlbmRlcjEucHJvcHMpLnJlbmRlcigpXHJcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlcjMgPSByZW5kZXIyLnR5cGUucmVuZGVyKHJlbmRlcjIucHJvcHMsIG51bGwpXHJcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlcjQgPSBuZXcgcmVuZGVyMy50eXBlKHJlbmRlcjMucHJvcHMpLnJlbmRlcigpXHJcbiAgICAgICAgICAgIFVzZXJQcm9maWxlQ29tcG9uZW50ID0gcmVuZGVyNC50eXBlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCFVc2VyUHJvZmlsZUNvbXBvbmVudCl0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgdGhlIFVzZXJQcm9maWxlQ29tcG9uZW50IGNvbXBvbmVudC5gKVxyXG5cclxuICAgICAgICBsZXQgZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRSUEMsIHRoaXMucHJvcHMucHJldmlldy5wcm9wcy5zZXR0aW5ncy5zdGF0ZS5kYXRhKVxyXG4gICAgICAgIGNvbnN0IGFjdGl2aXR5ID0gKGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIGlmKCF0aGlzLmdhbWUpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgbGV0IGdhbWUgPSB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLmdhbWUubmFtZSB8fCBkZWZhdWx0UlBDLm5hbWUsXHJcbiAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbl9pZDogdGhpcy5nYW1lLmFwcGxpY2F0aW9uX2lkIHx8IGRlZmF1bHRSUEMuYXBwbGljYXRpb25faWQsXHJcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiB0aGlzLmdhbWUuZGV0YWlscyB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICBzdGF0ZTogdGhpcy5nYW1lLnN0YXRlIHx8IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcHM6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl0gPyB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl1cclxuICAgICAgICAgICAgICAgIH0gOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICBhc3NldHM6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSA/IHtcclxuICAgICAgICAgICAgICAgICAgICBsYXJnZV9pbWFnZTogdGhpcy5nYW1lW1wiYXNzZXRzLmxhcmdlXCJdLFxyXG4gICAgICAgICAgICAgICAgICAgIHNtYWxsX2ltYWdlOiB0aGlzLmdhbWVbXCJhc3NldHMuc21hbGxcIl0gfHwgdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICB9IDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogMFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBnYW1lXHJcbiAgICAgICAgfSkuY2FsbCh7XHJcbiAgICAgICAgICAgIGdhbWU6IGRhdGFcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICBQcm9maWxlUHJvcHMgPSBuZXcgY29ubmVjdGVkUHJvZmlsZVN0b3JlKHtcclxuICAgICAgICAgICAgdXNlcjogdXNlcixcclxuICAgICAgICAgICAgY2xvc2U6ICgpID0+IHt9XHJcbiAgICAgICAgfSkucmVuZGVyKCkucHJvcHNcclxuICAgICAgICBjb25zdCBwcm9maWxlID0gbmV3IFVzZXJQcm9maWxlQ29tcG9uZW50KE9iamVjdC5hc3NpZ24oe30sIFByb2ZpbGVQcm9wcywge1xyXG4gICAgICAgICAgICBhY3Rpdml0eTogYWN0aXZpdHlcclxuICAgICAgICB9KSkucmVuZGVyKCkucHJvcHMuY2hpbGRyZW4gLy8gYnlwYXNzIHRyYWNraW5nXHJcblxyXG4gICAgICAgIHByb2ZpbGUucHJvcHMuc3R5bGUgPSB7XHJcbiAgICAgICAgICAgIHdpZHRoOiBcImF1dG9cIlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwibGMtdGFiIGxjLXRhYi1ib3gtc2hhZG93XCI+XHJcbiAgICAgICAgICAgIHtwcm9maWxlfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi4vLi4vbW9kdWxlcy9kb210b29sc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0xheWVyIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5rZXl1cExpc3RlbmVyID0gdGhpcy5rZXl1cExpc3RlbmVyLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAga2V5dXBMaXN0ZW5lcihlKSB7XHJcbiAgICAgICAgaWYgKGUud2hpY2ggPT09IDI3KSB7XHJcbiAgICAgICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZSh0aGlzLnJlZnMucm9vdC5wYXJlbnROb2RlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCB0aGlzLmtleXVwTGlzdGVuZXIpO1xyXG5cclxuICAgICAgICBjb25zdCB0aGlzTm9kZSA9IERPTS5xdWVyeShgIyR7dGhpcy5wcm9wcy5pZH1gKTtcclxuICAgICAgICBET00uYW5pbWF0ZSh7XHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAyMDAsXHJcbiAgICAgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24ocHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgICAgIHRoaXNOb2RlLnN0eWxlLnRyYW5zZm9ybSA9IGBzY2FsZSgkezEuMSAtIDAuMSAqIHByb2dyZXNzfSkgdHJhbnNsYXRlWigwcHgpYDtcclxuICAgICAgICAgICAgICAgIHRoaXNOb2RlLnN0eWxlLm9wYWNpdHkgPSBwcm9ncmVzcztcclxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzcyA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc05vZGUuc3R5bGUudHJhbnNmb3JtID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc05vZGUuc3R5bGUub3BhY2l0eSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcclxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIHRoaXMua2V5dXBMaXN0ZW5lcik7XHJcblxyXG4gICAgICAgIGNvbnN0IHRoaXNOb2RlID0gRE9NLnF1ZXJ5KGAjJHt0aGlzLnByb3BzLmlkfWApO1xyXG4gICAgICAgIERPTS5hbmltYXRlKHtcclxuICAgICAgICAgICAgZHVyYXRpb246IDIwMCxcclxuICAgICAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgdGhpc05vZGUuc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7MS4xIC0gMC4xICogKDEgLSBwcm9ncmVzcyl9KSB0cmFuc2xhdGVaKDBweClgO1xyXG4gICAgICAgICAgICAgICAgdGhpc05vZGUuc3R5bGUub3BhY2l0eSA9IDEgLSBwcm9ncmVzcztcclxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzcyA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc05vZGUucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgbGF5ZXIgPSBET00ucXVlcnkoXCIucHVibGljU2VydmVyc09wZW5cIik7XHJcbiAgICAgICAgbGF5ZXIuY2xhc3NMaXN0LnJlbW92ZShcInB1YmxpY1NlcnZlcnNPcGVuXCIpO1xyXG4gICAgICAgIERPTS5hbmltYXRlKHtcclxuICAgICAgICAgICAgZHVyYXRpb246IDIwMCxcclxuICAgICAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgbGF5ZXIuc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7MC4wNyAqIHByb2dyZXNzICsgMC45M30pIHRyYW5zbGF0ZVooMHB4KWA7XHJcbiAgICAgICAgICAgICAgICBsYXllci5zdHlsZS5vcGFjaXR5ID0gcHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3MgPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnN0eWxlLnRyYW5zZm9ybSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnN0eWxlLm9wYWNpdHkgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbE1vdW50KCkge1xyXG4gICAgICAgIGNvbnN0IGxheWVyID0gRE9NLnF1ZXJ5KFwiW2NsYXNzKj1cXFwibGF5ZXItXFxcIl1cIik7XHJcbiAgICAgICAgbGF5ZXIuY2xhc3NMaXN0LmFkZChcInB1YmxpY1NlcnZlcnNPcGVuXCIpO1xyXG4gICAgICAgIERPTS5hbmltYXRlKHtcclxuICAgICAgICAgICAgZHVyYXRpb246IDIwMCxcclxuICAgICAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgbGF5ZXIuc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7MC4wNyAqICgxIC0gcHJvZ3Jlc3MpICsgMC45M30pIHRyYW5zbGF0ZVooMHB4KWA7XHJcbiAgICAgICAgICAgICAgICBsYXllci5zdHlsZS5vcGFjaXR5ID0gMSAtIHByb2dyZXNzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwibGF5ZXIgYmQtbGF5ZXIgXCIrQkRNb2R1bGVzLmdldChlID0+IGUubGF5ZXIgJiYgZS5hbmltYXRpbmcpWzBdLmxheWVyLCBpZDogdGhpcy5wcm9wcy5pZCwgcmVmOiBcInJvb3RcIiwgc3R5bGU6IHtvcGFjaXR5OiAwLCB0cmFuc2Zvcm06IFwic2NhbGUoMS4xKSB0cmFuc2xhdGVaKDBweClcIn19LFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLmNoaWxkcmVuXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5pbXBvcnQgVG9vbHMgZnJvbSBcIi4uL3Rvb2xzXCI7XHJcbmltcG9ydCBTZXR0aW5nc1RpdGxlIGZyb20gXCIuLi9zZXR0aW5nc1RpdGxlXCI7XHJcbmltcG9ydCBUYWJCYXJTZXBhcmF0b3IgZnJvbSBcIi4uL3RhYkJhclNlcGFyYXRvclwiO1xyXG5pbXBvcnQgVGFiQmFySGVhZGVyIGZyb20gXCIuLi90YWJCYXJIZWFkZXJcIjtcclxuaW1wb3J0IFRhYkJhckl0ZW0gZnJvbSBcIi4uL3RhYkJhckl0ZW1cIjtcclxuXHJcbmltcG9ydCBTZXJ2ZXJDYXJkIGZyb20gXCIuL3NlcnZlckNhcmRcIjtcclxuaW1wb3J0IFNpZGViYXJWaWV3IGZyb20gXCIuL3NpZGViYXJWaWV3XCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfUHVibGljU2VydmVycyBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbFN0YXRlKCk7XHJcbiAgICAgICAgdGhpcy5jbG9zZSA9IHRoaXMuY2xvc2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmNoYW5nZUNhdGVnb3J5ID0gdGhpcy5jaGFuZ2VDYXRlZ29yeS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoID0gdGhpcy5zZWFyY2guYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNlYXJjaEtleURvd24gPSB0aGlzLnNlYXJjaEtleURvd24uYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmNoZWNrQ29ubmVjdGlvbiA9IHRoaXMuY2hlY2tDb25uZWN0aW9uLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5qb2luID0gdGhpcy5qb2luLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0ID0gdGhpcy5jb25uZWN0LmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuR3VpbGRTdG9yZSA9IEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJnZXRHdWlsZHNcIl0pO1xyXG4gICAgICAgIHRoaXMuQXZhdGFyRGVmYXVsdHMgPSBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZ2V0VXNlckF2YXRhclVSTFwiLCBcIkRFRkFVTFRfQVZBVEFSU1wiXSk7XHJcbiAgICAgICAgdGhpcy5JbnZpdGVBY3Rpb25zID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImFjY2VwdEludml0ZVwiXSk7XHJcbiAgICAgICAgdGhpcy5Tb3J0ZWRHdWlsZFN0b3JlID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldFNvcnRlZEd1aWxkc1wiXSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0Nvbm5lY3Rpb24oKTtcclxuICAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IC0xLFxyXG4gICAgICAgICAgICB0aXRsZTogXCJMb2FkaW5nLi4uXCIsXHJcbiAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXHJcbiAgICAgICAgICAgIHNlcnZlcnM6IFtdLFxyXG4gICAgICAgICAgICBuZXh0OiBudWxsLFxyXG4gICAgICAgICAgICBjb25uZWN0aW9uOiB7XHJcbiAgICAgICAgICAgICAgICBzdGF0ZTogMCxcclxuICAgICAgICAgICAgICAgIHVzZXI6IG51bGxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2UoKSB7XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS51bm1vdW50Q29tcG9uZW50QXROb2RlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucHJvcHMucm9vdElkKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VhcmNoKHF1ZXJ5LCBjbGVhcikge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGZldGNoKGAke3NlbGYuZW5kUG9pbnR9JHtxdWVyeX0ke3F1ZXJ5ID8gXCImc2NoZW1hPW5ld1wiIDogXCI/c2NoZW1hPW5ld1wifWAsIHtcclxuICAgICAgICAgICAgbWV0aG9kOiBcImdldFwiXHJcbiAgICAgICAgfSkudGhlbihhc3luYyByZXMgPT4ge1xyXG4gICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApdGhyb3cgYXdhaXQgcmVzLnRleHQoKVxyXG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHJlcy5qc29uKClcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCBzZXJ2ZXJzID0gZGF0YS5yZXN1bHRzLnJlZHVjZSgoYXJyLCBzZXJ2ZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIHNlcnZlci5qb2luZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGFyci5wdXNoKHNlcnZlcik7XHJcbiAgICAgICAgICAgICAgICAvLyBhcnIucHVzaCg8U2VydmVyQ2FyZCBzZXJ2ZXI9e3NlcnZlcn0gam9pbj17c2VsZi5qb2lufS8+KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhcnI7XHJcbiAgICAgICAgICAgIH0sIFtdKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghY2xlYXIpIHtcclxuICAgICAgICAgICAgICAgIHNlcnZlcnMgPSBzZWxmLnN0YXRlLnNlcnZlcnMuY29uY2F0KHNlcnZlcnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9zZXJ2ZXJzLnVuc2hpZnQoc2VsZi5iZFNlcnZlcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBlbmQgPSBkYXRhLnNpemUgKyBkYXRhLmZyb207XHJcbiAgICAgICAgICAgIGRhdGEubmV4dCA9IGA/ZnJvbT0ke2VuZH1gO1xyXG4gICAgICAgICAgICBpZiAoc2VsZi5zdGF0ZS50ZXJtKSBkYXRhLm5leHQgKz0gYCZ0ZXJtPSR7c2VsZi5zdGF0ZS50ZXJtfWA7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnkpIGRhdGEubmV4dCArPSBgJmNhdGVnb3J5PSR7c2VsZi5jYXRlZ29yeUJ1dHRvbnNbc2VsZi5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5XX1gO1xyXG4gICAgICAgICAgICBpZiAoZW5kID49IGRhdGEudG90YWwpIHtcclxuICAgICAgICAgICAgICAgIGVuZCA9IGRhdGEudG90YWw7XHJcbiAgICAgICAgICAgICAgICBkYXRhLm5leHQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSBgU2hvd2luZyAxLSR7ZW5kfSBvZiAke2RhdGEudG90YWx9IHJlc3VsdHMgaW4gJHtzZWxmLmNhdGVnb3J5QnV0dG9uc1tzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnldfWA7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLnN0YXRlLnRlcm0pIHRpdGxlICs9IGAgZm9yICR7c2VsZi5zdGF0ZS50ZXJtfWA7XHJcblxyXG4gICAgICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxyXG4gICAgICAgICAgICAgICAgc2VydmVyczogc2VydmVycyxcclxuICAgICAgICAgICAgICAgIG5leHQ6IGRhdGEubmV4dFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjbGVhcikge1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhzZWxmKTtcclxuICAgICAgICAgICAgICAgIHNlbGYucmVmcy5zYnYucmVmcy5jb250ZW50U2Nyb2xsZXIuc2Nyb2xsVG9wID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgIHJldHVybiBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6IFwiRmFpbGVkIHRvIGxvYWQgc2VydmVycy4gQ2hlY2sgY29uc29sZSBmb3IgZGV0YWlsc1wiXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgam9pbihzZXJ2ZXJDYXJkKSB7XHJcbiAgICAgICAgaWYgKHNlcnZlckNhcmQucHJvcHMucGlubmVkKSByZXR1cm4gdGhpcy5JbnZpdGVBY3Rpb25zLmFjY2VwdEludml0ZShzZXJ2ZXJDYXJkLnByb3BzLmludml0ZV9jb2RlKTtcclxuXHJcbiAgICAgICAgYXdhaXQgZmV0Y2goYCR7dGhpcy5qb2luRW5kUG9pbnR9LyR7c2VydmVyQ2FyZC5wcm9wcy5zZXJ2ZXIuaWRlbnRpZmllcn1gLHtcclxuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgICAgICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXHJcbiAgICAgICAgICAgIG1vZGU6IFwiY29yc1wiLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc2VydmVyQ2FyZC5zZXRTdGF0ZSh7am9pbmVkOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29ubmVjdCgpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gc2VsZi53aW5kb3dPcHRpb25zO1xyXG4gICAgICAgIG9wdGlvbnMueCA9IE1hdGgucm91bmQod2luZG93LnNjcmVlblggKyB3aW5kb3cuaW5uZXJXaWR0aCAvIDIgLSBvcHRpb25zLndpZHRoIC8gMik7XHJcbiAgICAgICAgb3B0aW9ucy55ID0gTWF0aC5yb3VuZCh3aW5kb3cuc2NyZWVuWSArIHdpbmRvdy5pbm5lckhlaWdodCAvIDIgLSBvcHRpb25zLmhlaWdodCAvIDIpO1xyXG5cclxuICAgICAgICBzZWxmLmpvaW5XaW5kb3cgPSBuZXcgKHdpbmRvdy5yZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLkJyb3dzZXJXaW5kb3cpKG9wdGlvbnMpO1xyXG4gICAgICAgIGNvbnN0IHVybCA9IFwiaHR0cHM6Ly9hdXRoLmRpc2NvcmRzZXJ2ZXJzLmNvbS9jb25uZWN0P3Njb3Blcz1ndWlsZHMuam9pbiZwcmV2aW91c1VybD1odHRwczovL2F1dGguZGlzY29yZHNlcnZlcnMuY29tL2luZm9cIjtcclxuICAgICAgICBzZWxmLmpvaW5XaW5kb3cud2ViQ29udGVudHMub24oXCJkaWQtbmF2aWdhdGVcIiwgKGV2ZW50LCB1cmwpID0+IHtcclxuICAgICAgICAgICAgaWYgKHVybCAhPSBcImh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vaW5mb1wiKSByZXR1cm47XHJcbiAgICAgICAgICAgIHNlbGYuam9pbldpbmRvdy5jbG9zZSgpO1xyXG4gICAgICAgICAgICBzZWxmLmNoZWNrQ29ubmVjdGlvbigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHNlbGYuam9pbldpbmRvdy5sb2FkVVJMKHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHdpbmRvd09wdGlvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgd2lkdGg6IDUwMCxcclxuICAgICAgICAgICAgaGVpZ2h0OiA1NTAsXHJcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjMjgyYjMwXCIsXHJcbiAgICAgICAgICAgIHNob3c6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc2l6YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIG1heGltaXphYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgbWluaW1pemFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBhbHdheXNPblRvcDogdHJ1ZSxcclxuICAgICAgICAgICAgZnJhbWU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjZW50ZXI6IGZhbHNlLFxyXG4gICAgICAgICAgICB3ZWJQcmVmZXJlbmNlczoge1xyXG4gICAgICAgICAgICAgICAgbm9kZUludGVncmF0aW9uOiBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgYmRTZXJ2ZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VydmVyID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBcIkJldHRlckRpc2NvcmRcIixcclxuICAgICAgICAgICAgb25saW5lOiBcIjc1MDArXCIsXHJcbiAgICAgICAgICAgIG1lbWJlcnM6IFwiMjAwMDArXCIsXHJcbiAgICAgICAgICAgIGNhdGVnb3JpZXM6IFtcImNvbW11bml0eVwiLCBcInByb2dyYW1taW5nXCIsIFwic3VwcG9ydFwiXSxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiT2ZmaWNpYWwgQmV0dGVyRGlzY29yZCBzZXJ2ZXIgZm9yIHN1cHBvcnQgZXRjXCIsXHJcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IFwiODYwMDQ3NDQ5NjY5MTQwNDhcIixcclxuICAgICAgICAgICAgaWNvblVybDogXCJodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9pY29ucy84NjAwNDc0NDk2NjkxNDA0OC8yOTJlN2Y2YmZmZjJiNzFkZmQxM2U1MDhhODU5YWVkZC53ZWJwXCIsXHJcbiAgICAgICAgICAgIG5hdGl2ZWpvaW46IHRydWUsXHJcbiAgICAgICAgICAgIGludml0ZV9jb2RlOiBcIjBUbWZvNVpiT1JDUnFiQWRcIixcclxuICAgICAgICAgICAgcGlubmVkOiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBzZXJ2ZXIyID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBcIkxpZ2h0Y29yZFwiLFxyXG4gICAgICAgICAgICBvbmxpbmU6IFwiMzArXCIsXHJcbiAgICAgICAgICAgIG1lbWJlcnM6IFwiNTArXCIsXHJcbiAgICAgICAgICAgIGNhdGVnb3JpZXM6IFtcImNvbW11bml0eVwiLCBcInByb2dyYW1taW5nXCIsIFwic3VwcG9ydFwiXSxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiT2ZmaWNpYWwgTGlnaHRjb3JkIHNlcnZlciBmb3Igc3VwcG9ydCBldGNcIixcclxuICAgICAgICAgICAgaWRlbnRpZmllcjogXCI4NjAwNDc0NDk2NjkxNDA0OFwiLFxyXG4gICAgICAgICAgICBpY29uVXJsOiBcImh0dHBzOi8vYXZhdGFyczMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNjU2OTAwNTg/cz0yMDAmdj00XCIsXHJcbiAgICAgICAgICAgIG5hdGl2ZWpvaW46IHRydWUsXHJcbiAgICAgICAgICAgIGludml0ZV9jb2RlOiBcIjdlRmZmMkFcIixcclxuICAgICAgICAgICAgcGlubmVkOiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBndWlsZExpc3QgPSB0aGlzLlNvcnRlZEd1aWxkU3RvcmUuZ2V0RmxhdHRlbmVkR3VpbGRJZHMoKTtcclxuICAgICAgICBjb25zdCBkZWZhdWx0TGlzdCA9IHRoaXMuQXZhdGFyRGVmYXVsdHMuREVGQVVMVF9BVkFUQVJTO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXJ2ZXJDYXJkLCB7c2VydmVyOiBzZXJ2ZXIyLCBwaW5uZWQ6IHRydWUsIGpvaW46IHRoaXMuam9pbiwgZ3VpbGRMaXN0OiBndWlsZExpc3QsIGZhbGxiYWNrOiBkZWZhdWx0TGlzdFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1KV19KSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNlcnZlckNhcmQsIHtzZXJ2ZXI6IHNlcnZlciwgcGlubmVkOiB0cnVlLCBqb2luOiB0aGlzLmpvaW4sIGd1aWxkTGlzdDogZ3VpbGRMaXN0LCBmYWxsYmFjazogZGVmYXVsdExpc3RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNSldfSlcclxuICAgICAgICBdXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGVuZFBvaW50KCkge1xyXG4gICAgICAgIHJldHVybiBcImh0dHBzOi8vc2VhcmNoLmRpc2NvcmRzZXJ2ZXJzLmNvbVwiO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBqb2luRW5kUG9pbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiaHR0cHM6Ly9qLmRpc2NvcmRzZXJ2ZXJzLmNvbVwiO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb25uZWN0RW5kUG9pbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiaHR0cHM6Ly9qb2luLmRpc2NvcmRzZXJ2ZXJzLmNvbS9jb25uZWN0XCI7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY2hlY2tDb25uZWN0aW9uKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vaW5mb2Ase1xyXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgICAgICAgICAgICAgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiLFxyXG4gICAgICAgICAgICAgICAgbW9kZTogXCJjb3JzXCIsXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRDYXRlZ29yeTogMCxcclxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IHtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogMixcclxuICAgICAgICAgICAgICAgICAgICB1c2VyOiBkYXRhXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBzZWxmLnNlYXJjaChcIlwiLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXHJcbiAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6IFwiTm90IGNvbm5lY3RlZCB0byBkaXNjb3Jkc2VydmVycy5jb20hXCIsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRDYXRlZ29yeTogLTEsXHJcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcjogbnVsbFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2lkZWJhclZpZXcsIHtyZWY6IFwic2J2XCJ9LCB0aGlzLmNvbXBvbmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBzaWRlYmFyOiB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMuc2lkZWJhclxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjb250ZW50OiB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMuY29udGVudFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0b29sczoge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHMsIHtrZXk6IFwicHRcIiwgcmVmOiBcInRvb2xzXCIsIG9uQ2xpY2s6IHRoaXMuY2xvc2V9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2lkZWJhcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInNpZGViYXJcIiwga2V5OiBcInBzXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS10YWItYmFyIFNJREVcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLXRhYi1iYXItaGVhZGVyXCIsIHN0eWxlOiB7Zm9udFNpemU6IFwiMTZweFwifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgXCJQdWJsaWMgU2VydmVyc1wiXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhclNlcGFyYXRvciwgbnVsbCksXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhclNlcGFyYXRvciwgbnVsbCksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFySGVhZGVyLCB7dGV4dDogXCJDYXRlZ29yaWVzXCJ9KSxcclxuICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlCdXR0b25zLm1hcCgodmFsdWUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJJdGVtLCB7aWQ6IGluZGV4LCBvbkNsaWNrOiB0aGlzLmNoYW5nZUNhdGVnb3J5LCBrZXk6IGluZGV4LCB0ZXh0OiB2YWx1ZSwgc2VsZWN0ZWQ6IHRoaXMuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeSA9PT0gaW5kZXh9KTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhclNlcGFyYXRvciwgbnVsbCksXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvb3RlcixcclxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2VhcmNoSW5wdXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1mb3JtLWl0ZW1cIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLXRleHQtaW5wdXQgZmxleC12ZXJ0aWNhbFwiLCBzdHlsZToge3dpZHRoOiBcIjE3MnB4XCIsIG1hcmdpbkxlZnQ6IFwiMTBweFwifX0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCB7cmVmOiBcInNlYXJjaGlucHV0XCIsIG9uS2V5RG93bjogdGhpcy5zZWFyY2hLZXlEb3duLCBvbkNoYW5nZTogKCkgPT4ge30sIHR5cGU6IFwidGV4dFwiLCBjbGFzc05hbWU6IFwiaW5wdXQgZGVmYXVsdFwiLCBwbGFjZWhvbGRlcjogXCJTZWFyY2guLi5cIiwgbWF4TGVuZ3RoOiBcIjUwXCJ9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBzZWFyY2hLZXlEb3duKGUpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBpZiAoc2VsZi5zdGF0ZS5sb2FkaW5nIHx8IGUud2hpY2ggIT09IDEzKSByZXR1cm47XHJcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXHJcbiAgICAgICAgICAgIHRpdGxlOiBcIkxvYWRpbmcuLi5cIixcclxuICAgICAgICAgICAgdGVybTogZS50YXJnZXQudmFsdWVcclxuICAgICAgICB9KTtcclxuICAgICAgICBsZXQgcXVlcnkgPSBgP3Rlcm09JHtlLnRhcmdldC52YWx1ZX1gO1xyXG4gICAgICAgIGlmIChzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnkgIT09IDApIHtcclxuICAgICAgICAgICAgcXVlcnkgKz0gYCZjYXRlZ29yeT0ke3NlbGYuY2F0ZWdvcnlCdXR0b25zW3NlbGYuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeV19YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2VsZi5zZWFyY2gocXVlcnksIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjYXRlZ29yeUJ1dHRvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIFtcIkFsbFwiLCBcIkZQUyBHYW1lc1wiLCBcIk1NTyBHYW1lc1wiLCBcIlN0cmF0ZWd5IEdhbWVzXCIsIFwiTU9CQSBHYW1lc1wiLCBcIlJQRyBHYW1lc1wiLCBcIlRhYmxldG9wIEdhbWVzXCIsIFwiU2FuZGJveCBHYW1lc1wiLCBcIlNpbXVsYXRpb24gR2FtZXNcIiwgXCJNdXNpY1wiLCBcIkNvbW11bml0eVwiLCBcIkxhbmd1YWdlXCIsIFwiUHJvZ3JhbW1pbmdcIiwgXCJPdGhlclwiXTtcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VDYXRlZ29yeShpZCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGlmIChzZWxmLnN0YXRlLmxvYWRpbmcpIHJldHVybjtcclxuICAgICAgICBzZWxmLnJlZnMuc2VhcmNoaW5wdXQudmFsdWUgPSBcIlwiO1xyXG4gICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICBzZWxlY3RlZENhdGVnb3J5OiBpZCxcclxuICAgICAgICAgICAgdGl0bGU6IFwiTG9hZGluZy4uLlwiLFxyXG4gICAgICAgICAgICB0ZXJtOiBudWxsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGlkID09PSAwKSB7XHJcbiAgICAgICAgICAgIHNlbGYuc2VhcmNoKFwiXCIsIHRydWUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNlbGYuc2VhcmNoKGA/Y2F0ZWdvcnk9JHtzZWxmLmNhdGVnb3J5QnV0dG9uc1tpZF19YCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbnRlbnQoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgY29uc3QgZ3VpbGRMaXN0ID0gdGhpcy5Tb3J0ZWRHdWlsZFN0b3JlLmdldEZsYXR0ZW5lZEd1aWxkSWRzKCk7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdExpc3QgPSB0aGlzLkF2YXRhckRlZmF1bHRzLkRFRkFVTFRfQVZBVEFSUztcclxuICAgICAgICBpZiAoc2VsZi5zdGF0ZS5jb25uZWN0aW9uLnN0YXRlID09PSAxKSByZXR1cm4gc2VsZi5ub3RDb25uZWN0ZWQ7XHJcbiAgICAgICAgbGV0IGNvbHVtbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW5EZWZhdWx0KVswXVxyXG4gICAgICAgIHJldHVybiBbQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7cmVmOiBcImNvbnRlbnRcIiwga2V5OiBcInBjXCIsIGNsYXNzTmFtZTogY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgXCIrY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiBzZWxmLnN0YXRlLnRpdGxlfSksXHJcbiAgICAgICAgICAgIHNlbGYuYmRTZXJ2ZXIsXHJcbiAgICAgICAgICAgIHNlbGYuc3RhdGUuc2VydmVycy5tYXAoKHNlcnZlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXJ2ZXJDYXJkLCB7a2V5OiBzZXJ2ZXIuaWRlbnRpZmllciwgc2VydmVyOiBzZXJ2ZXIsIGpvaW46IHNlbGYuam9pbiwgZ3VpbGRMaXN0OiBndWlsZExpc3QsIGZhbGxiYWNrOiBkZWZhdWx0TGlzdFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1KV19KTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHNlbGYuc3RhdGUubmV4dCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAge3R5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuc3RhdGUubG9hZGluZykgcmV0dXJuO3NlbGYuc2V0U3RhdGUoe2xvYWRpbmc6IHRydWV9KTsgc2VsZi5zZWFyY2goc2VsZi5zdGF0ZS5uZXh0LCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgY2xhc3NOYW1lOiBcInVpLWJ1dHRvbiBmaWxsZWQgYnJhbmQgc21hbGwgZ3Jvd1wiLCBzdHlsZToge3dpZHRoOiBcIjEwMCVcIiwgbWFyZ2luVG9wOiBcIjEwcHhcIiwgbWFyZ2luQm90dG9tOiBcIjEwcHhcIn19LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZS5sb2FkaW5nID8gXCJMb2FkaW5nXCIgOiBcIkxvYWQgTW9yZVwiXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHNlbGYuc3RhdGUuc2VydmVycy5sZW5ndGggPiAwICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogc2VsZi5zdGF0ZS50aXRsZX0pXHJcbiAgICAgICAgKV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG5vdENvbm5lY3RlZCgpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICAvL3JldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwgeyB0ZXh0OiBzZWxmLnN0YXRlLnRpdGxlIH0pO1xyXG4gICAgICAgIGxldCBjb2x1bW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250ZW50Q29sdW1uRGVmYXVsdClbMF1cclxuICAgICAgICByZXR1cm4gW0JEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2tleTogXCJuY2NcIiwgcmVmOiBcImNvbnRlbnRcIiwgY2xhc3NOYW1lOiBjb2x1bW5Nb2R1bGUuY29udGVudENvbHVtbitcIiBcIitjb2x1bW5Nb2R1bGUuY29udGVudENvbHVtbitcIiBjb250ZW50LWNvbHVtbiBkZWZhdWx0XCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImgyXCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGl0bGUgaDIgbWFyZ2luLXJlc2V0IG1hcmdpbi1ib3R0b20tMjBcIn0sXHJcbiAgICAgICAgICAgICAgICBcIk5vdCBjb25uZWN0ZWQgdG8gZGlzY29yZHNlcnZlcnMuY29tIVwiLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBzZWxmLmNvbm5lY3QsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJ1aS1idXR0b24gZmlsbGVkIGJyYW5kIHNtYWxsIGdyb3dcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5IZWlnaHQ6IFwiMThweFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luTGVmdDogXCIxMHB4XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lSGVpZ2h0OiBcIjE0cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNvbm5lY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKSwgc2VsZi5iZFNlcnZlclxyXG4gICAgICAgICldO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBmb290ZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS10YWItYmFyLWhlYWRlclwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJhXCIsXHJcbiAgICAgICAgICAgICAgICB7aHJlZjogXCJodHRwczovL2Rpc2NvcmRzZXJ2ZXJzLmNvbVwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgXCJEaXNjb3Jkc2VydmVycy5jb21cIlxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29ubmVjdGlvbigpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBjb25zdCB7Y29ubmVjdGlvbn0gPSBzZWxmLnN0YXRlO1xyXG4gICAgICAgIGlmIChjb25uZWN0aW9uLnN0YXRlICE9PSAyKSByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJzcGFuXCIsXHJcbiAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJTZXBhcmF0b3IsIG51bGwpLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcInNwYW5cIixcclxuICAgICAgICAgICAgICAgIHtzdHlsZToge2NvbG9yOiBcIiNiOWJiYmVcIiwgZm9udFNpemU6IFwiMTBweFwiLCBtYXJnaW5MZWZ0OiBcIjEwcHhcIn19LFxyXG4gICAgICAgICAgICAgICAgXCJDb25uZWN0ZWQgYXM6IFwiLFxyXG4gICAgICAgICAgICAgICAgYCR7Y29ubmVjdGlvbi51c2VyLnVzZXJuYW1lfSMke2Nvbm5lY3Rpb24udXNlci5kaXNjcmltaW5hdG9yfWBcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtzdHlsZToge3BhZGRpbmc6IFwiNXB4IDEwcHggMCAxMHB4XCJ9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtzdHlsZToge3dpZHRoOiBcIjEwMCVcIiwgbWluSGVpZ2h0OiBcIjIwcHhcIn0sIHR5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJ1aS1idXR0b24gZmlsbGVkIGJyYW5kIHNtYWxsIGdyb3dcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wiLCBvbkNsaWNrOiBzZWxmLmNvbm5lY3R9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlJlY29ubmVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxufVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19TZXJ2ZXJDYXJkIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICBpZiAoIXRoaXMucHJvcHMuc2VydmVyLmljb25VcmwpIHRoaXMucHJvcHMuc2VydmVyLmljb25VcmwgPSB0aGlzLnByb3BzLmZhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGltYWdlRXJyb3I6IGZhbHNlLFxyXG4gICAgICAgICAgICBqb2luZWQ6IHRoaXMucHJvcHMuZ3VpbGRMaXN0LmluY2x1ZGVzKHRoaXMucHJvcHMuc2VydmVyLmlkZW50aWZpZXIpXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge3NlcnZlcn0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIGxldCBjYXJkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY2FyZCAmJiBlLmNhcmRQcmltYXJ5KVswXVxyXG4gICAgICAgIGxldCBmbGV4TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZmxleENoaWxkICYmIGUuX2hvcml6b250YWxSZXZlcnNlKVswXVxyXG4gICAgICAgIGxldCB3cmFwTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubm9XcmFwICYmICFlLnN0cmVhbWVyTW9kZUVuYWJsZWQpWzBdXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIiwgLy8gY2FyZFByaW1hcnktMUh2LXRvXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IGAke2NhcmRNb2R1bGUuY2FyZH0gJHtjYXJkTW9kdWxlLmNhcmRQcmltYXJ5fSAke0JETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTgpWzBdLm1hcmdpbkJvdHRvbTh9IGJkLXNlcnZlci1jYXJkJHtzZXJ2ZXIucGlubmVkID8gXCIgYmQtc2VydmVyLWNhcmQtcGlubmVkXCIgOiBcIlwifWB9LFxyXG4gICAgICAgICAgICAvLyBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAvLyBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgLy8geyBjbGFzc05hbWU6IFwiZmxleC0xeE1RZzUgZmxleC0xTzFHS1kgaG9yaXpvbnRhbC0xYWU5Y2kgaG9yaXpvbnRhbC0yRUVFblkgZmxleC0xTzFHS1kgZGlyZWN0aW9uUm93LTN2M3RmRyBqdXN0aWZ5U3RhcnQtMnlJWm8wIGFsaWduU3RyZXRjaC0xaHd4TWEgbm9XcmFwLTNqeW52NlwiIH0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwge3JlZjogXCJpbWdcIiwgY2xhc3NOYW1lOiBcImJkLXNlcnZlci1pbWFnZVwiLCBzcmM6IHNlcnZlci5pY29uVXJsLCBvbkVycm9yOiB0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcyksIGRyYWdnYWJsZTogZmFsc2V9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IGZsZXhNb2R1bGUuZmxleENoaWxkK1wiIGJkLXNlcnZlci1jb250ZW50XCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogZmxleE1vZHVsZS5ob3Jpem9udGFsK1wiIFwiK3dyYXBNb2R1bGUubm9XcmFwK1wiIGJkLXNlcnZlci1oZWFkZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiaDVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiaDUtMThfMW5kIGRlZmF1bHRDb2xvci0xX2FqWDAgbWFyZ2luLXJlc2V0IGJkLXNlcnZlci1uYW1lXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLm5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJoNVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJoNS0xOF8xbmQgZGVmYXVsdENvbG9yLTFfYWpYMCBtYXJnaW4tcmVzZXQgYmQtc2VydmVyLW1lbWJlci1jb3VudFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5tZW1iZXJzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgTWVtYmVyc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogZmxleE1vZHVsZS5ob3Jpem9udGFsK1wiIFwiK3dyYXBNb2R1bGUubm9XcmFwfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwic2Nyb2xsZXJXcmFwLTJsSkVrZCBzY3JvbGxlclRoZW1lZC0yb2VudXMgdGhlbWVHaG9zdEhhaXJsaW5lLURCRC0yZCBzY3JvbGxlckZhZGUtMUlqdzV5IGJkLXNlcnZlci1kZXNjcmlwdGlvbi1jb250YWluZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInNjcm9sbGVyLTJGS0ZQRyBzY3JvbGxlciBiZC1zZXJ2ZXItZGVzY3JpcHRpb25cIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5kZXNjcmlwdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiZmxleC0xeE1RZzUgZmxleC0xTzFHS1kgaG9yaXpvbnRhbC0xYWU5Y2kgaG9yaXpvbnRhbC0yRUVFblkgZGlyZWN0aW9uUm93LTN2M3RmRyBub1dyYXAtM2p5bnY2IGJkLXNlcnZlci1mb290ZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImZsZXhDaGlsZC1mYW9WVzMgYmQtc2VydmVyLXRhZ3NcIiwgc3R5bGU6IHtmbGV4OiBcIjEgMSBhdXRvXCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5jYXRlZ29yaWVzLmpvaW4oXCIsIFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmpvaW5lZCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3R5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJidXR0b24tMzhhU2NyIGxvb2tGaWxsZWQtMUd4MDBQIGNvbG9yQnJhbmQtM3BYcjkxIHNpemVNaW4tMW1KZDF4IGdyb3ctcTc3T05OIGNvbG9yR3JlZW4tMjlpQUtZXCIsIHN0eWxlOiB7bWluSGVpZ2h0OiBcIjEycHhcIiwgbWFyZ2luVG9wOiBcIjRweFwiLCBiYWNrZ3JvdW5kQ29sb3I6IFwiIzNhYzE1Y1wifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkpvaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5lcnJvciAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3R5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJidXR0b24tMzhhU2NyIGxvb2tGaWxsZWQtMUd4MDBQIGNvbG9yQnJhbmQtM3BYcjkxIHNpemVNaW4tMW1KZDF4IGdyb3ctcTc3T05OIGRpc2FibGVkLTlhRjJ1Z1wiLCBzdHlsZToge21pbkhlaWdodDogXCIxMnB4XCIsIG1hcmdpblRvcDogXCI0cHhcIiwgYmFja2dyb3VuZENvbG9yOiBcIiNjMTNhM2FcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJFcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICFzZXJ2ZXIuZXJyb3IgJiYgIXRoaXMuc3RhdGUuam9pbmVkICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dHlwZTogXCJidXR0b25cIiwgY2xhc3NOYW1lOiBcImJ1dHRvbi0zOGFTY3IgbG9va0ZpbGxlZC0xR3gwMFAgY29sb3JCcmFuZC0zcFhyOTEgc2l6ZU1pbi0xbUpkMXggZ3Jvdy1xNzdPTk5cIiwgc3R5bGU6IHttaW5IZWlnaHQ6IFwiMTJweFwiLCBtYXJnaW5Ub3A6IFwiNHB4XCJ9LCBvbkNsaWNrOiAoKSA9PiB7dGhpcy5qb2luKCk7fX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkpvaW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAvLyApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVFcnJvcigpIHtcclxuICAgICAgICB0aGlzLnByb3BzLnNlcnZlci5pY29uVXJsID0gdGhpcy5wcm9wcy5mYWxsYmFjaztcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtpbWFnZUVycm9yOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgam9pbigpIHtcclxuICAgICAgICB0aGlzLnByb3BzLmpvaW4odGhpcyk7XHJcbiAgICAgICAgLy90aGlzLnNldFN0YXRlKHtqb2luZWQ6IHRydWV9KTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5pbXBvcnQgU2Nyb2xsZXIgZnJvbSBcIi4uL3Njcm9sbGVyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2lkZWJhclZpZXcgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge3NpZGViYXIsIGNvbnRlbnQsIHRvb2xzfSA9IHRoaXMucHJvcHMuY2hpbGRyZW47XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJzdGFuZGFyZFNpZGViYXJWaWV3LTNGMUk3aSB1aS1zdGFuZGFyZC1zaWRlYmFyLXZpZXdcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInNpZGViYXJSZWdpb24tVkZUVWtOIHNpZGViYXItcmVnaW9uXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbGVyLCB7a2V5OiBcInNpZGViYXJTY3JvbGxlclwiLCByZWY6IFwic2lkZWJhclNjcm9sbGVyXCIsIHNpZGViYXI6IHRydWUsIGZhZGU6IHNpZGViYXIuZmFkZSB8fCB0cnVlLCBkYXJrOiBzaWRlYmFyLmRhcmsgfHwgdHJ1ZX0sIHNpZGViYXIuY29tcG9uZW50KVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJjb250ZW50UmVnaW9uLTNuRHVZeSBjb250ZW50LXJlZ2lvblwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImNvbnRlbnRUcmFuc2l0aW9uV3JhcC0zaHFPRVcgY29udGVudC10cmFuc2l0aW9uLXdyYXBcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwic2Nyb2xsZXJXcmFwLTJsSkVrZCBmaXJlZm94Rml4U2Nyb2xsRmxleC1jbkkyaXggY29udGVudFJlZ2lvblNjcm9sbGVyV3JhcC0zWVpYZG0gY29udGVudC1yZWdpb24tc2Nyb2xsZXItd3JhcCBzY3JvbGxlclRoZW1lZC0yb2VudXMgdGhlbWVHaG9zdC0yOE1TbjAgc2Nyb2xsZXJUcmFjay0xWklwc3ZcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInNjcm9sbGVyLTJGS0ZQRyBmaXJlZm94Rml4U2Nyb2xsRmxleC1jbkkyaXggY29udGVudFJlZ2lvblNjcm9sbGVyLTI2bmMxZSBjb250ZW50LXJlZ2lvbi1zY3JvbGxlciBzY3JvbGxlclwiLCByZWY6IFwiY29udGVudFNjcm9sbGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiY29udGVudENvbHVtbi0yaHJJWUggY29udGVudENvbHVtbkRlZmF1bHQtMVZRa0dNIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIn0sIGNvbnRlbnQuY29tcG9uZW50KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xzLmNvbXBvbmVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfUmVsb2FkSWNvbiBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xyXG4gICAgICAgICAgICAgICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcclxuICAgICAgICAgICAgICAgIHZpZXdCb3g6IFwiMCAwIDI0IDI0XCIsXHJcbiAgICAgICAgICAgICAgICBmaWxsOiBcIiNkY2RkZGVcIixcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1yZWxvYWQgXCIgKyB0aGlzLnByb3BzLmNsYXNzTmFtZSxcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6IHRoaXMucHJvcHMub25DbGljayxcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7d2lkdGg6IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjI0cHhcIiwgaGVpZ2h0OiB0aGlzLnByb3BzLnNpemUgfHwgXCIyNHB4XCJ9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2Q6IFwiTTE3LjY1IDYuMzVDMTYuMiA0LjkgMTQuMjEgNCAxMiA0Yy00LjQyIDAtNy45OSAzLjU4LTcuOTkgOHMzLjU3IDggNy45OSA4YzMuNzMgMCA2Ljg0LTIuNTUgNy43My02aC0yLjA4Yy0uODIgMi4zMy0zLjA0IDQtNS42NSA0LTMuMzEgMC02LTIuNjktNi02czIuNjktNiA2LTZjMS42NiAwIDMuMTQuNjkgNC4yMiAxLjc4TDEzIDExaDdWNGwtMi4zNSAyLjM1elwifSksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6IFwibm9uZVwiLCBkOiBcIk0wIDBoMjR2MjRIMHpcIn0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2Nyb2xsZXIgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgLy9zY3JvbGxlcldyYXAtMmxKRWtkIHNjcm9sbGVyVGhlbWVkLTJvZW51cyB0aGVtZUdob3N0SGFpcmxpbmUtREJELTJkIHNjcm9sbGVyRmFkZS0xSWp3NXlcclxuICAgICAgICBsZXQgc2Nyb2xsZXJNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsZXJIb3Jpem9udGFsKVswXVxyXG4gICAgICAgIGxldCBzY3JvbGxlck1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaWRlYmFyUmVnaW9uU2Nyb2xsZXIpWzBdXHJcbiAgICAgICAgbGV0IHdyYXBwZXJDbGFzcyA9IGAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcldyYXB9ICR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyVGhlbWVkfSAke3Njcm9sbGVyTW9kdWxlMS50aGVtZUdob3N0SGFpcmxpbmV9JHt0aGlzLnByb3BzLmZhZGUgPyBcIiBcIitzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJGYWRlIDogXCJcIn1gO1xyXG4gICAgICAgIGxldCBzY3JvbGxlckNsYXNzID0gc2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyK1wiIHNjcm9sbGVyXCI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVjayAqL1xyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLnNpZGViYXIpIHNjcm9sbGVyQ2xhc3MgKz0gYCAke3Njcm9sbGVyTW9kdWxlMi5zaWRlYmFyUmVnaW9uU2Nyb2xsZXJ9IHNpZGViYXItcmVnaW9uLXNjcm9sbGVyYFxyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLmNvbnRlbnRDb2x1bW4pIHtcclxuICAgICAgICAgICAgc2Nyb2xsZXJDbGFzcyArPSBcIiBcIitzY3JvbGxlck1vZHVsZTIuY29udGVudFJlZ2lvblNjcm9sbGVyK1wiIGNvbnRlbnQtcmVnaW9uLXNjcm9sbGVyXCI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWNrICovXHJcbiAgICAgICAgICAgIHdyYXBwZXJDbGFzcyA9IGAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcldyYXB9ICR7c2Nyb2xsZXJNb2R1bGUyLmNvbnRlbnRSZWdpb25TY3JvbGxlcldyYXB9IGNvbnRlbnQtcmVnaW9uLXNjcm9sbGVyLXdyYXAgICR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyVGhlbWVkfSAke3Njcm9sbGVyTW9kdWxlMS50aGVtZUdob3N0fSAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlclRyYWNrfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHtjaGlsZHJlbn0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtrZXk6IFwic2Nyb2xsZXJ3cmFwXCIsIGNsYXNzTmFtZTogd3JhcHBlckNsYXNzfSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtrZXk6IFwic2Nyb2xsZXJcIiwgcmVmOiBcInNjcm9sbGVyXCIsIGNsYXNzTmFtZTogc2Nyb2xsZXJDbGFzc30sXHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlblxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufVxyXG5cclxuY29uc3Qgb3JpZ2luYWxSZW5kZXIgPSBWMkNfU2Nyb2xsZXIucHJvdG90eXBlLnJlbmRlcjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFYyQ19TY3JvbGxlci5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHtcclxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcclxuICAgIHNldDogZnVuY3Rpb24oKSB7Y29uc29sZS53YXJuKFwiQWRkb24gcG9saWN5IGZvciBwbHVnaW5zICM1IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvd2lraS9BZGRvbi1Qb2xpY2llcyNwbHVnaW5zXCIpO30sXHJcbiAgICBnZXQ6ICgpID0+IG9yaWdpbmFsUmVuZGVyXHJcbn0pOyAiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuaW1wb3J0IFNldHRpbmdzR3JvdXAgZnJvbSBcIi4vc2V0dGluZ3NHcm91cFwiO1xyXG5pbXBvcnQgTWFyZ2luVG9wIGZyb20gXCIuL21hcmdpbnRvcFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1NlY3Rpb25lZFNldHRpbmdzUGFuZWwgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuc2VjdGlvbnMubWFwKChzZWN0aW9uLCBpKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgICAgICBpICE9PSAwID8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KE1hcmdpblRvcCwge30pIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc0dyb3VwLCBPYmplY3QuYXNzaWduKHt9LCBzZWN0aW9uLCB7b25DaGFuZ2U6IHRoaXMucHJvcHMub25DaGFuZ2V9KSlcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmltcG9ydCBTZXR0aW5nc1RpdGxlIGZyb20gXCIuL3NldHRpbmdzVGl0bGVcIjtcclxuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi9zd2l0Y2hcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19TZXR0aW5nc0dyb3VwIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHt0aXRsZSwgc2V0dGluZ3MsIGJ1dHRvbn0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIGNvbnN0IGJ1dHRvbkNvbXBvbmVudCA9IGJ1dHRvbiA/IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7a2V5OiBcInRpdGxlLWJ1dHRvblwiLCBjbGFzc05hbWU6IFwiYmQtcGZidG5cIiwgb25DbGljazogYnV0dG9uLm9uQ2xpY2t9LCBidXR0b24udGl0bGUpIDogbnVsbDtcclxuICAgICAgICByZXR1cm4gW0JEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogdGl0bGV9KSxcclxuICAgICAgICAgICAgICAgIGJ1dHRvbkNvbXBvbmVudCxcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzLm1hcChzZXR0aW5nID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFN3aXRjaCwge2lkOiBzZXR0aW5nLmlkLCBrZXk6IHNldHRpbmcuaWQsIGRhdGE6IHNldHRpbmcsIGNoZWNrZWQ6IHNldHRpbmdzQ29va2llW3NldHRpbmcuaWRdLCBvbkNoYW5nZTogKGlkLCBjaGVja2VkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UoaWQsIGNoZWNrZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH19KTtcclxuICAgICAgICAgICAgICAgIH0pXTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2V0dGluZ3NUaXRsZSBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcbi8vaDItMmdXRS1vIHRpdGxlLTNzWldZUSBzaXplMTYtMTRjR3o1IGhlaWdodDIwLW1PMmVJTiB3ZWlnaHRTZW1pQm9sZC1OSmV4emkgZGEtaDIgZGEtdGl0bGUgZGEtc2l6ZTE2IGRhLWhlaWdodDIwIGRhLXdlaWdodFNlbWlCb2xkIGRlZmF1bHRDb2xvci0xX2FqWDAgZGEtZGVmYXVsdENvbG9yIG1hcmdpblRvcDYwLTNQR2J0SyBkYS1tYXJnaW5Ub3A2MCBtYXJnaW5Cb3R0b20yMC0zMnFJRDcgZGEtbWFyZ2luQm90dG9tMjBcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImgyXCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMiBtYXJnaW4tcmVzZXQgbWFyZ2luLWJvdHRvbS0yMFwifSxcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy50ZXh0XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBTd2l0Y2ggZnJvbSBcIi4vY29tcG9uZW50cy9zd2l0Y2hcIjtcclxuXHJcbmxldCBjbGFzc25hbWVzID0gW11cclxuZnVuY3Rpb24gZ2V0Q2xhc3NOYW1lKG5hbWUpe1xyXG4gICAgbGV0IGNsYXNzTmFtZSA9IGNsYXNzbmFtZXMuZmluZChlID0+IGUuc3RhcnRzV2l0aChuYW1lK1wiLVwiKSlcclxuICAgIGlmKGNsYXNzTmFtZSlyZXR1cm4gY2xhc3NOYW1lXHJcbiAgICBjbGFzc05hbWUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZVtuYW1lXSlbMF1bbmFtZV1cclxuICAgIGNsYXNzbmFtZXMucHVzaChjbGFzc05hbWUpXHJcbiAgICByZXR1cm4gY2xhc3NOYW1lXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN3aXRjaEl0ZW0gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMuY2hlY2tlZCA9ICF0aGlzLnByb3BzLmNoZWNrZWQ7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLmlkLCB0aGlzLnByb3BzLmNoZWNrZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBsZXQge3RleHQsIGluZm99ID0gdGhpcy5wcm9wcy5kYXRhO1xyXG4gICAgICAgIGlmKCFjbGFzc25hbWVzLmZpbmQoZSA9PiBlLnN0YXJ0c1dpdGgoXCJiZXRhLVwiKSkpe1xyXG4gICAgICAgICAgICBjbGFzc25hbWVzLnB1c2goQkRNb2R1bGVzLmdldChlID0+IGUuYmV0YSAmJiAoIWUuY29udGFpbmVyICYmICFlLnVzZXJTZXR0aW5nc1ZvaWNlKSlbMF0uYmV0YSlcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYodGhpcy5wcm9wcy5kYXRhLmV4cGVyaW1lbnRhbCl7XHJcbiAgICAgICAgICAgIGluZm8gPSBbXHJcbiAgICAgICAgICAgICAgICBpbmZvLFxyXG4gICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInN1cFwiLCB7Y2xhc3NOYW1lOiBnZXRDbGFzc05hbWUoXCJiZXRhXCIpfSwgXCIoRVhQRVJJTUVOVEFMKVwiKVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJ1aS1mbGV4IGZsZXgtdmVydGljYWwgZmxleC1qdXN0aWZ5LXN0YXJ0IGZsZXgtYWxpZ24tc3RyZXRjaCBmbGV4LW5vd3JhcCB1aS1zd2l0Y2gtaXRlbVwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidWktZmxleCBmbGV4LWhvcml6b250YWwgZmxleC1qdXN0aWZ5LXN0YXJ0IGZsZXgtYWxpZ24tc3RyZXRjaCBmbGV4LW5vd3JhcFwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImgzXCIsIHtrZXk6IFwidGl0bGVcIiwgY2xhc3NOYW1lOiBcInVpLWZvcm0tdGl0bGUgaDMgbWFyZ2luLXJlc2V0IG1hcmdpbi1yZXNldCB1aS1mbGV4LWNoaWxkXCJ9LCB0ZXh0KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTd2l0Y2gsIHtrZXk6IFwic3dpdGNoXCIsIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLCBjaGVja2VkOiB0aGlzLnByb3BzLmNoZWNrZWR9KVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRleHQgc3R5bGUtZGVzY3JpcHRpb24gbWFyZ2luLXRvcC00XCIsIHN0eWxlOiB7ZmxleDogXCIxIDEgYXV0b1wifX0sIGluZm8pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfVGFiQmFySGVhZGVyIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6IFwidWktdGFiLWJhci1oZWFkZXJcIn0sIHRoaXMucHJvcHMudGV4dCwgdGhpcy5wcm9wcy5idXR0b24pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19UYWJCYXJJdGVtIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgICAgICB0aGlzLm9uQ2xpY2sgPSB0aGlzLm9uQ2xpY2suYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgc2VsZWN0ZWQ6IHRoaXMucHJvcHMuc2VsZWN0ZWQgfHwgZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBgdWktdGFiLWJhci1pdGVtJHt0aGlzLnByb3BzLnNlbGVjdGVkID8gXCIgc2VsZWN0ZWRcIiA6IFwiXCJ9YCwgb25DbGljazogdGhpcy5vbkNsaWNrfSxcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy50ZXh0XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uQ2xpY2spIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNsaWNrKHRoaXMucHJvcHMuaWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfVGFiQmFyU2VwYXJhdG9yIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLXRhYi1iYXItc2VwYXJhdG9yIG1hcmdpbi10b3AtOCBtYXJnaW4tYm90dG9tLThcIn0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmltcG9ydCBYU3ZnIGZyb20gXCIuL3hTdmdcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19Ub29scyBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMub25DbGljayA9IHRoaXMub25DbGljay5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBsZXQgdG9vbHNNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS50b29sc0NvbnRhaW5lcilbMF1cclxuICAgICAgICBsZXQgY29udGFpbmVyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29udGFpbmVyICYmIGUuY2xvc2VCdXR0b24gJiYgZS5jbG9zZUJ1dHRvbkJvbGQpWzBdXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInRvb2xzLWNvbnRhaW5lciBcIit0b29sc01vZHVsZS50b29sc0NvbnRhaW5lcn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInRvb2xzIFwiK3Rvb2xzTW9kdWxlLnRvb2xzfSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBjb250YWluZXJNb2R1bGUuY29udGFpbmVyfSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJidG4tY2xvc2UgXCIrY29udGFpbmVyTW9kdWxlLmNsb3NlQnV0dG9uLCBvbkNsaWNrOiB0aGlzLm9uQ2xpY2t9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoWFN2ZywgbnVsbClcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJlc2MtdGV4dCBcIitjb250YWluZXJNb2R1bGUua2V5YmluZH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRVNDXCJcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25DbGljaykge1xyXG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2xpY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY2xvc2VCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLlwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmNsb3NlQnV0dG9uICYmIGUua2V5YmluZEJvbGQpWzBdLmNsb3NlQnV0dG9uLnNwbGl0KFwiIFwiKVswXSk7XHJcbiAgICAgICAgaWYgKGNsb3NlQnV0dG9uKSBjbG9zZUJ1dHRvbi5jbGljaygpO1xyXG4gICAgfVxyXG59IiwiLyoqXHJcbiAqIFRvb2x0aXAgdGhhdCBhdXRvbWF0aWNhbGx5IHNob3cgYW5kIGhpZGUgdGhlbXNlbHZlcyBvbiBtb3VzZWVudGVyIGFuZCBtb3VzZWxlYXZlIGV2ZW50cy5cclxuICogV2lsbCBhbHNvIHJlbW92ZSB0aGVtc2VsdmVzIGlmIHRoZSBub2RlIHRvIHdhdGNoIGlzIHJlbW92ZWQgZnJvbSBET00gdGhyb3VnaFxyXG4gKiBhIE11dGF0aW9uT2JzZXJ2ZXIuXHJcbiAqXHJcbiAqIE5vdGUgdGhpcyBpcyBub3QgdXNpbmcgRGlzY29yZCdzIGludGVybmFscyBidXQgbm9ybWFsIERPTSBtYW5pcHVsYXRpb24gYW5kIGVtdWxhdGVzXHJcbiAqIERpc2NvcmQncyBvd24gdG9vbHRpcHMgYXMgY2xvc2VseSBhcyBwb3NzaWJsZS5cclxuICpcclxuICogQG1vZHVsZSBFbXVsYXRlZFRvb2x0aXBcclxuICogQHZlcnNpb24gMC4wLjFcclxuICovXHJcblxyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4uL21vZHVsZXMvdXRpbHNcIjtcclxuaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuLi9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzXCI7XHJcbmxldCBUb29sdGlwQ2xhc3Nlc1xyXG5mdW5jdGlvbiBnZXRUb29sdGlwQ2xhc3Nlcygpe1xyXG5cdGlmKFRvb2x0aXBDbGFzc2VzKXJldHVybiBUb29sdGlwQ2xhc3Nlc1xyXG5cdHJldHVybiBUb29sdGlwQ2xhc3NlcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwidG9vbHRpcFwiLCBcInRvb2x0aXBCbGFja1wiKTtcclxufVxyXG5sZXQgVG9vbHRpcExheWVyc1xyXG5mdW5jdGlvbiBnZXRUb29sdGlwTGF5ZXJzKCl7XHJcblx0aWYoVG9vbHRpcExheWVycylyZXR1cm4gVG9vbHRpcExheWVyc1xyXG5cdHJldHVybiBUb29sdGlwTGF5ZXJzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJsYXllclwiLCBcImxheWVyQ29udGFpbmVyXCIpO1xyXG59XHJcblxyXG5jb25zdCBnZXRDbGFzcyA9IGZ1bmN0aW9uKHNpZGVPckNvbG9yKSB7XHJcbiAgICBjb25zdCB1cHBlckNhc2UgPSBzaWRlT3JDb2xvclswXS50b1VwcGVyQ2FzZSgpICsgc2lkZU9yQ29sb3Iuc2xpY2UoMSk7XHJcbiAgICBjb25zdCB0b29sdGlwQ2xhc3MgPSBnZXRUb29sdGlwQ2xhc3NlcygpW2B0b29sdGlwJHt1cHBlckNhc2V9YF07XHJcbiAgICBpZiAodG9vbHRpcENsYXNzKSByZXR1cm4gdG9vbHRpcENsYXNzO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5jb25zdCBjbGFzc0V4aXN0cyA9IGZ1bmN0aW9uKHNpZGVPckNvbG9yKSB7XHJcbiAgICByZXR1cm4gZ2V0Q2xhc3Moc2lkZU9yQ29sb3IpID8gdHJ1ZSA6IGZhbHNlO1xyXG59O1xyXG5cclxuY29uc3QgdG9QeCA9IGZ1bmN0aW9uKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gYCR7dmFsdWV9cHhgO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW11bGF0ZWRUb29sdGlwIHtcclxuXHQvKipcclxuXHQgKlxyXG5cdCAqIEBjb25zdHJ1Y3RvclxyXG5cdCAqIEBwYXJhbSB7KEhUTUxFbGVtZW50fGpRdWVyeSl9IG5vZGUgLSBET00gbm9kZSB0byBtb25pdG9yIGFuZCBzaG93IHRoZSB0b29sdGlwIG9uXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRpcCAtIHN0cmluZyB0byBzaG93IGluIHRoZSB0b29sdGlwXHJcblx0ICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSB0b29sdGlwXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnN0eWxlPWJsYWNrXSAtIGNvcnJlbGF0ZXMgdG8gdGhlIGRpc2NvcmQgc3R5bGluZy9jb2xvcnMgKGJsYWNrLCBicmFuZCwgZ3JlZW4sIGdyZXksIHJlZCwgeWVsbG93KVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zaWRlPXRvcF0gLSBjYW4gYmUgYW55IG9mIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdFxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucHJldmVudEZsaXA9ZmFsc2VdIC0gcHJldmVudHMgbW92aW5nIHRoZSB0b29sdGlwIHRvIHRoZSBvcHBvc2l0ZSBzaWRlIGlmIGl0IGlzIHRvbyBiaWcgb3IgZ29lcyBvZmZzY3JlZW5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGlzYWJsZWQ9ZmFsc2VdIC0gd2hldGhlciB0aGUgdG9vbHRpcCBzaG91bGQgYmUgZGlzYWJsZWQgZnJvbSBzaG93aW5nIG9uIGhvdmVyXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmF0dGFjaEV2ZW50cz10cnVlXSAtIHdoZXRoZXIgdGhlIHRvb2x0aXAgc2hvdWxkIGxpc3RlbiB0byBtb3VzZWVudGVyIGFuZCBtb3VzZWxlYXZlIGV2ZW50cy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvcihub2RlLCB0ZXh0LCBvcHRpb25zID0ge30pIHtcclxuXHRcdGNvbnN0IHtzdHlsZSA9IFwiYmxhY2tcIiwgc2lkZSA9IFwidG9wXCIsIHByZXZlbnRGbGlwID0gZmFsc2UsIGRpc2FibGVkID0gZmFsc2UsIGF0dGFjaEV2ZW50cyA9IHRydWV9ID0gb3B0aW9ucztcclxuXHRcdHRoaXMubm9kZSA9IG5vZGUgaW5zdGFuY2VvZiBqUXVlcnkgPyBub2RlWzBdIDogbm9kZTtcclxuICAgICAgICB0aGlzLmxhYmVsID0gdGV4dDtcclxuICAgICAgICB0aGlzLnN0eWxlID0gc3R5bGUudG9Mb3dlckNhc2UoKTtcclxuXHRcdHRoaXMuc2lkZSA9IHNpZGUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICB0aGlzLnByZXZlbnRGbGlwID0gcHJldmVudEZsaXA7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkO1xyXG5cclxuICAgICAgICBpZiAoIWNsYXNzRXhpc3RzKHRoaXMuc2lkZSkpIHJldHVybiBVdGlscy5lcnIoXCJFbXVsYXRlZFRvb2x0aXBcIiwgYFNpZGUgJHt0aGlzLnNpZGV9IGRvZXMgbm90IGV4aXN0LmApO1xyXG5cdFx0aWYgKCFjbGFzc0V4aXN0cyh0aGlzLnN0eWxlKSkgcmV0dXJuIFV0aWxzLmVycihcIkVtdWxhdGVkVG9vbHRpcFwiLCBgU3R5bGUgJHt0aGlzLnN0eWxlfSBkb2VzIG5vdCBleGlzdC5gKTtcclxuXHRcdFxyXG5cdFx0dGhpcy5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHRcdHRoaXMuZWxlbWVudC5jbGFzc05hbWUgPSBnZXRUb29sdGlwTGF5ZXJzKCkubGF5ZXIgKyBcIiBcIiArIGdldFRvb2x0aXBMYXllcnMoKS5kaXNhYmxlZFBvaW50ZXJFdmVudHM7XHJcblxyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTmFtZSA9IGAke2dldFRvb2x0aXBDbGFzc2VzKCkudG9vbHRpcH0gJHtnZXRDbGFzcyh0aGlzLnN0eWxlKX1gO1xyXG5cclxuXHRcdHRoaXMubGFiZWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHRcdHRoaXMubGFiZWxFbGVtZW50LmNsYXNzTmFtZSA9IGdldFRvb2x0aXBDbGFzc2VzKCkudG9vbHRpcENvbnRlbnRcclxuXHJcblx0XHRjb25zdCBwb2ludGVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblx0XHRwb2ludGVyRWxlbWVudC5jbGFzc05hbWUgPSBnZXRUb29sdGlwQ2xhc3NlcygpLnRvb2x0aXBQb2ludGVyO1xyXG5cclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuYXBwZW5kKHBvaW50ZXJFbGVtZW50KTtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuYXBwZW5kKHRoaXMubGFiZWxFbGVtZW50KTtcclxuXHRcdHRoaXMuZWxlbWVudC5hcHBlbmQodGhpcy50b29sdGlwRWxlbWVudCk7XHJcblxyXG5cdFx0aWYoYXR0YWNoRXZlbnRzKXtcclxuXHRcdFx0dGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsICgpID0+IHtcclxuXHRcdFx0XHRpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG5cdFx0XHRcdHRoaXMuc2hvdygpO1xyXG5cdFxyXG5cdFx0XHRcdGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xyXG5cdFx0XHRcdFx0bXV0YXRpb25zLmZvckVhY2goKG11dGF0aW9uKSA9PiB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBkaXJlY3RNYXRjaCA9IG5vZGVzLmluZGV4T2YodGhpcy5ub2RlKSA+IC0xO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwYXJlbnRNYXRjaCA9IG5vZGVzLnNvbWUocGFyZW50ID0+IHBhcmVudC5jb250YWlucyh0aGlzLm5vZGUpKTtcclxuXHRcdFx0XHRcdFx0aWYgKGRpcmVjdE1hdGNoIHx8IHBhcmVudE1hdGNoKSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5oaWRlKCk7XHJcblx0XHRcdFx0XHRcdFx0b2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9KTtcclxuXHRcclxuXHRcdFx0XHRvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHtzdWJ0cmVlOiB0cnVlLCBjaGlsZExpc3Q6IHRydWV9KTtcclxuXHRcdFx0fSk7XHJcblx0XHJcblx0XHRcdHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCAoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5oaWRlKCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBDb250YWluZXIgd2hlcmUgdGhlIHRvb2x0aXAgd2lsbCBiZSBhcHBlbmRlZC4gKi9cclxuICAgIGdldCBjb250YWluZXIoKSB7IFxyXG5cdFx0cmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuXCIrVXRpbHMucmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUucG9wb3V0cylbMF0ucG9wb3V0cykrXCIgfiAuXCIrVXRpbHMucmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUubGF5ZXJDb250YWluZXIpWzBdLmxheWVyQ29udGFpbmVyKSk7IFxyXG5cdH1cclxuICAgIC8qKiBCb29sZWFuIHJlcHJlc2VudGluZyBpZiB0aGUgdG9vbHRpcCB3aWxsIGZpdCBvbiBzY3JlZW4gYWJvdmUgdGhlIGVsZW1lbnQgKi9cclxuICAgIGdldCBjYW5TaG93QWJvdmUoKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gdGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCA+PSAwOyB9XHJcbiAgICAvKiogQm9vbGVhbiByZXByZXNlbnRpbmcgaWYgdGhlIHRvb2x0aXAgd2lsbCBmaXQgb24gc2NyZWVuIGJlbG93IHRoZSBlbGVtZW50ICovXHJcbiAgICBnZXQgY2FuU2hvd0JlbG93KCkgeyByZXR1cm4gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHRoaXMubm9kZS5vZmZzZXRIZWlnaHQgKyB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0IDw9IFV0aWxzLnNjcmVlbkhlaWdodDsgfVxyXG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiB0byB0aGUgbGVmdCBvZiB0aGUgZWxlbWVudCAqL1xyXG4gICAgZ2V0IGNhblNob3dMZWZ0KCkgeyByZXR1cm4gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSB0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggPj0gMDsgfVxyXG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiB0byB0aGUgcmlnaHQgb2YgdGhlIGVsZW1lbnQgKi9cclxuXHRnZXQgY2FuU2hvd1JpZ2h0KCkgeyByZXR1cm4gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyB0aGlzLm5vZGUub2Zmc2V0V2lkdGggKyB0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggPD0gVXRpbHMuc2NyZWVuV2lkdGg7IH1cclxuXHJcbiAgICAvKiogSGlkZXMgdGhlIHRvb2x0aXAuIEF1dG9tYXRpY2FsbHkgY2FsbGVkIG9uIG1vdXNlbGVhdmUuICovXHJcblx0aGlkZSgpIHtcclxuICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy50b29sdGlwRWxlbWVudC5jbGFzc05hbWUgPSB0aGlzLl9jbGFzc05hbWU7XHJcblx0fVxyXG5cclxuICAgIC8qKiBTaG93cyB0aGUgdG9vbHRpcC4gQXV0b21hdGljYWxseSBjYWxsZWQgb24gbW91c2VlbnRlci4gV2lsbCBhdHRlbXB0IHRvIGZsaXAgaWYgcG9zaXRpb24gd2FzIHdyb25nLiAqL1xyXG5cdHNob3coKSB7XHJcbiAgICAgICAgdGhpcy50b29sdGlwRWxlbWVudC5jbGFzc05hbWUgPSBgJHtnZXRUb29sdGlwQ2xhc3NlcygpLnRvb2x0aXB9ICR7Z2V0Q2xhc3ModGhpcy5zdHlsZSl9YDtcclxuXHRcdHRoaXMubGFiZWxFbGVtZW50LnRleHRDb250ZW50ID0gdGhpcy5sYWJlbDtcclxuXHRcdHRoaXMuY29udGFpbmVyLmFwcGVuZCh0aGlzLmVsZW1lbnQpO1xyXG5cclxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJ0b3BcIikge1xyXG5cdFx0XHRpZiAodGhpcy5jYW5TaG93QWJvdmUgfHwgKCF0aGlzLmNhblNob3dBYm92ZSAmJiB0aGlzLnByZXZlbnRGbGlwKSkgdGhpcy5zaG93QWJvdmUoKTtcclxuXHRcdFx0ZWxzZSB0aGlzLnNob3dCZWxvdygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJib3R0b21cIikge1xyXG5cdFx0XHRpZiAodGhpcy5jYW5TaG93QmVsb3cgfHwgKCF0aGlzLmNhblNob3dCZWxvdyAmJiB0aGlzLnByZXZlbnRGbGlwKSkgdGhpcy5zaG93QmVsb3coKTtcclxuXHRcdFx0ZWxzZSB0aGlzLnNob3dBYm92ZSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJsZWZ0XCIpIHtcclxuXHRcdFx0aWYgKHRoaXMuY2FuU2hvd0xlZnQgfHwgKCF0aGlzLmNhblNob3dMZWZ0ICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dMZWZ0KCk7XHJcblx0XHRcdGVsc2UgdGhpcy5zaG93UmlnaHQoKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5zaWRlID09IFwicmlnaHRcIikge1xyXG5cdFx0XHRpZiAodGhpcy5jYW5TaG93UmlnaHQgfHwgKCF0aGlzLmNhblNob3dSaWdodCAmJiB0aGlzLnByZXZlbnRGbGlwKSkgdGhpcy5zaG93UmlnaHQoKTtcclxuXHRcdFx0ZWxzZSB0aGlzLnNob3dMZWZ0KCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuICAgIC8qKiBGb3JjZSBzaG93aW5nIHRoZSB0b29sdGlwIGFib3ZlIHRoZSBub2RlLiAqL1xyXG5cdHNob3dBYm92ZSgpIHtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhcInRvcFwiKSk7XHJcblx0XHR0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJ0b3BcIiwgdG9QeCh0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gdGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCAtIDEwKSk7XHJcblx0XHR0aGlzLmNlbnRlckhvcml6b250YWxseSgpO1xyXG5cdH1cclxuXHJcbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCBiZWxvdyB0aGUgbm9kZS4gKi9cclxuXHRzaG93QmVsb3coKSB7XHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJib3R0b21cIikpO1xyXG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwidG9wXCIsIHRvUHgodGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHRoaXMubm9kZS5vZmZzZXRIZWlnaHQgKyAxMCkpO1xyXG5cdFx0dGhpcy5jZW50ZXJIb3Jpem9udGFsbHkoKTtcclxuXHR9XHJcblxyXG4gICAgLyoqIEZvcmNlIHNob3dpbmcgdGhlIHRvb2x0aXAgdG8gdGhlIGxlZnQgb2YgdGhlIG5vZGUuICovXHJcblx0c2hvd0xlZnQoKSB7XHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJsZWZ0XCIpKTtcclxuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcImxlZnRcIiwgdG9QeCh0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCAtIDEwKSk7XHJcblx0XHR0aGlzLmNlbnRlclZlcnRpY2FsbHkoKTtcclxuXHR9XHJcblxyXG4gICAgLyoqIEZvcmNlIHNob3dpbmcgdGhlIHRvb2x0aXAgdG8gdGhlIHJpZ2h0IG9mIHRoZSBub2RlLiAqL1xyXG5cdHNob3dSaWdodCgpIHtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhcInJpZ2h0XCIpKTtcclxuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcImxlZnRcIiwgdG9QeCh0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCArIHRoaXMubm9kZS5vZmZzZXRXaWR0aCArIDEwKSk7XHJcblx0XHR0aGlzLmNlbnRlclZlcnRpY2FsbHkoKTtcclxuXHR9XHJcblxyXG5cdGNlbnRlckhvcml6b250YWxseSgpIHtcclxuICAgICAgICBjb25zdCBub2RlY2VudGVyID0gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyAodGhpcy5ub2RlLm9mZnNldFdpZHRoIC8gMik7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwibGVmdFwiLCB0b1B4KG5vZGVjZW50ZXIgLSAodGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoIC8gMikpKTtcclxuXHR9XHJcblxyXG5cdGNlbnRlclZlcnRpY2FsbHkoKSB7XHJcblx0XHRjb25zdCBub2RlY2VudGVyID0gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArICh0aGlzLm5vZGUub2Zmc2V0SGVpZ2h0IC8gMik7XHJcblx0XHR0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJ0b3BcIiwgdG9QeChub2RlY2VudGVyIC0gKHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQgLyAyKSkpO1xyXG5cdH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBUb29sdGlwIGZyb20gXCIuL3Rvb2x0aXBcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIGNvbnN0IHtzdHlsZSA9IFwiYmxhY2tcIiwgc2lkZSA9IFwidG9wXCIsIHRleHQgPSBcIlwifSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgdGhpcy5ub2RlID0gQkRWMi5yZWFjdERvbS5maW5kRE9NTm9kZSh0aGlzKTtcclxuICAgICAgICB0aGlzLnRvb2x0aXAgPSBuZXcgVG9vbHRpcCh0aGlzLm5vZGUsIHRleHQsIHtzdHlsZSwgc2lkZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMudG9vbHRpcDtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1hTdmcgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcInN2Z1wiLFxyXG4gICAgICAgICAgICB7eG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgdmlld0JveDogXCIwIDAgMTIgMTJcIiwgc3R5bGU6IHt3aWR0aDogXCIxOHB4XCIsIGhlaWdodDogXCIxOHB4XCJ9fSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJnXCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJhY2tncm91bmRcIiwgZmlsbDogXCJub25lXCIsIGZpbGxSdWxlOiBcImV2ZW5vZGRcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtkOiBcIk0wIDBoMTJ2MTJIMFwifSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtjbGFzc05hbWU6IFwiZmlsbFwiLCBmaWxsOiBcIiNkY2RkZGVcIiwgZDogXCJNOS41IDMuMjA1TDguNzk1IDIuNSA2IDUuMjk1IDMuMjA1IDIuNWwtLjcwNS43MDVMNS4yOTUgNiAyLjUgOC43OTVsLjcwNS43MDVMNiA2LjcwNSA4Ljc5NSA5LjVsLjcwNS0uNzA1TDYuNzA1IDZcIn0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY3J5cHRvXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZWN0cm9uXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImV2ZW50c1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJmc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJtb2R1bGVcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibm9kZS1mZXRjaFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJwYXRoXCIpOyJdLCJzb3VyY2VSb290IjoiIn0=