Lightcord/BetterDiscordApp/dist/index.js

12182 lines
1.5 MiB

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.307";
const currentDiscordVersion = window.DiscordNative && window.DiscordNative.remoteApp && window.DiscordNative.remoteApp.getVersion && window.DiscordNative.remoteApp.getVersion() || "0.0.307";
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"
},
/** 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,
"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/Layers.jsx":
/*!********************************!*\
!*** ./src/modules/Layers.jsx ***!
\********************************/
/*! exports provided: default, Layer */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Layer", function() { return Layer; });
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _distant__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./distant */ "./src/modules/distant.js");
/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! crypto */ "crypto");
/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(crypto__WEBPACK_IMPORTED_MODULE_3__);
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); }
/* harmony default export */ __webpack_exports__["default"] = (new class Layers {
constructor() {
this.layers = [];
window.Lightcord.BetterDiscord.Layers = this;
}
get isInjected() {
return !!document.querySelector("div.Layers.injected");
}
inject() {
if (this.isInjected) return;
let [classNameLayers] = [_utils__WEBPACK_IMPORTED_MODULE_0__["default"].removeDa(_v2__WEBPACK_IMPORTED_MODULE_1__["default"].WebpackModules.find(e => e.layers && e.layer).layers)];
const layers = document.querySelector("." + classNameLayers);
if (!layers) return false;
const ReactInstance = Lightcord.Api.Utils.FindReact(layers, 1);
if (!ReactInstance) return layers;
this.ReactInstance = ReactInstance;
let render = ReactInstance.render;
ReactInstance.render = () => {
let returnValue = render.call(ReactInstance);
let classList = returnValue.props.children[1].props.className.split(" ");
classList.push("Layers");
classList.push("injected");
returnValue.props.children[1].props.className = classList.join(" ");
this.layers.forEach(layer => {
returnValue.props.children[1].props.children.push(layer[1]);
});
return returnValue;
};
ReactInstance.forceUpdate();
}
createLayer(children, props = {}) {
let id = Object(_distant__WEBPACK_IMPORTED_MODULE_2__["uuidv4"])();
let layer = null;
this.layers.push([id, /*#__PURE__*/React.createElement(Layer, _extends({}, props, {
getLayer: lay => {
layer = lay;
},
key: id,
id: id,
remove: () => {
let index = this.layers.findIndex(e => e[0] === id);
if (index === -1) return;
this.layers.splice(index, 1);
layer = null;
if (this.ReactInstance) this.ReactInstance.forceUpdate();
this.inject();
}
}), children)]);
if (this.ReactInstance) this.ReactInstance.forceUpdate();
this.inject();
return {
remove: () => {
if (!layer) {
let index = this.layers.findIndex(e => e[0] === id);
if (index === -1) return;
this.layers.splice(index, 1);
layer = null;
if (this.ReactInstance) this.ReactInstance.forceUpdate();
this.inject();
} else {
layer.remove();
}
}
};
}
}());
let LayerModules;
class Layer extends React.Component {
constructor() {
super(...arguments);
this.state = {
animation: new this.modules[0].default.Value(0)
};
this.props.getLayer(this);
this.keydown = this.keydown.bind(this);
}
keydown(e) {
if (e.which === 27) {
this.remove();
}
}
get modules() {
return LayerModules || (LayerModules = [_v2__WEBPACK_IMPORTED_MODULE_1__["default"].WebpackModules.find(e => e.default && e.default.Value && e.default.div)]);
}
componentWillUnmount() {
window.removeEventListener("keydown", this.keydown);
}
componentDidMount(ev) {
window.addEventListener("keydown", this.keydown);
}
remove() {
this.props.remove();
}
componentWillEnter(ev) {
this.modules[0].default.timing(this.state.animation, {
toValue: 1,
duration: 100
}).start(ev);
}
componentWillLeave(ev) {
this.modules[0].default.timing(this.state.animation, {
toValue: 0,
duration: 100
}).start(ev);
}
render() {
let interpolation = this.state.animation.interpolate({
inputRange: [0, 1],
outputRange: [1.07, 1]
});
let style = {
opacity: this.state.animation,
transform: [{
scale: interpolation
}]
};
let Div = this.modules[0].default.div;
return /*#__PURE__*/React.createElement(Div, {
className: [__SECRET_EMOTION__.css({
backgroundColor: "var(--background-primary)",
position: "absolute",
top: 0,
right: 0,
bottom: 0,
left: 0,
display: "flex",
overflow: "hidden",
WebkitBoxOrient: "vertical",
WebkitBoxDirection: "normal",
msFlexDirection: "column",
flexDirection: "column",
zIndex: 101
}), process.platform === "win32" ? __SECRET_EMOTION__.css({
top: "-22px",
paddingTop: "22px"
}) : null, ...(this.props.className ? this.props.className.split(" ") : [])].filter(e => e).join(" ") || null,
style: style
}, this.props.children(() => {
this.remove();
}));
}
}
Layer.defaultProps = {
id: null,
children: null
};
/***/ }),
/***/ "./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<string|ReactElement>)} 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"] + ").<br><br> Please download the latest version from <a href='https://github.com/rauenzi/BetterDiscordApp/releases/latest' target='_blank'>GitHub</a>");
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")();
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 = `<svg xmlns="http://www.w3.org/2000/svg" height="10" width="70" viewBox="0 0 72.54 10" style="margin-left: -5px, margin-top: 10px">
<path fill="currentColor" d="M44.81,9.67V6.33c0-1.21,2.13-1.49,2.78-.28l2-.81A3.53,3.53,0,0,0,46.2,3c-1.92,0-3.81,1.13-3.81,3.33V9.67c0,2.21,1.89,3.33,3.77,3.33a3.87,3.87,0,0,0,3.45-2.18l-2.12-1C47,11.17,44.81,10.85,44.81,9.67ZM10.68,12.89h2.41V3.17H10.68ZM71.76,3.14H68.19V7.23L70.57,9.4v-4h1.27c.81,0,1.21.41,1.21,1v3c0,.63-.38,1.05-1.21,1.05H68.18v2.31h3.57c1.92,0,3.72-1,3.72-3.2V6.39C75.48,4.13,73.68,3.14,71.76,3.14ZM54.22,3c-2,0-4,1.1-4,3.34V9.66c0,2.23,2,3.34,4,3.34s3.95-1.11,3.95-3.34V6.34C58.19,4.11,56.2,3,54.22,3Zm1.55,6.66c0,.7-.78,1.06-1.54,1.06s-1.55-.35-1.55-1.06V6.34c0-.72.75-1.1,1.5-1.1s1.59.35,1.59,1.1ZM66.84,6.34c0-2.29-1.58-3.2-3.55-3.2H59.46v9.73h2.45V9.77h.43l2.22,3.09h3L65,9.52C66.13,9.15,66.84,8.14,66.84,6.34ZM63.33,7.65H61.91V5.43h1.42A1.11,1.11,0,1,1,63.33,7.65ZM29.83,13h2.42V3.06H29.83V6.73l-3,0V3.09H24.7v9.78h2.14V8.68l3,0ZM17.16,9.76V6.42c0-1.21,2.13-1.49,2.78-.28l2-.81a3.55,3.55,0,0,0-3.36-2.24c-1.92,0-3.81,1.13-3.81,3.33V9.76c0,2.21,2,3.15,3.9,3.15s3.58-1,3.58-3V7.58H18.79l0,1.36H20.3v.77C20.3,10.92,17.16,10.94,17.16,9.76Z" transform="translate(-2.93 -3)"/>
<polygon fill="currentColor" points="35.91 0.06 38.43 0.06 38.43 1.84 35.92 1.81 35.97 10 33.55 10 33.49 1.75 30.98 1.74 30.98 0.06 33.49 0.06 35.91 0.06"/>
<polygon fill="currentColor" points="0 9.97 6.5 10 6.5 7.63 2.41 7.63 2.41 0.26 0 2.26 0 9.97"/>
</svg>`;
}
};
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(`<div class="${classLayer.layer}">`);
cm = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.menu} ${classItems.styleFlexible} ${classItems.accommodateScrollbar} bd-context-menu" style=""></div>`);
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(`<div class="${scrollerClasses.scrollerWrap} ${scrollerClasses.scrollerThemed} ${scrollerClasses.themeGhostHairline}"></div>`);
const scroller = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${BDModules.get(e => e.scroller)[0].scroller} ${classItems.scroller}"></div>`);
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(`<div role="group"></div>`);
/**
* @type {HTMLElement}
*/
const cmi = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.item} ${classItems.labelContainer} ${classItems.colorDefault}" role="menuitem" id="bd-copy-selector-item-cm"></div>`);
cmi.append(_domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.label}">Copy Selector</div>`));
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(`<div role="separator" class="${classItems.separator}"></div>`);
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<Constants["badges"]>}
*/
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(`<style id="${id}">${css}</style>`));
}
/**
* 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<Element>} - 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<Element>} - 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<Element>} - 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<Element>} - 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<Element>} - 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<Element>} - 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<Element>} - 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<Element>} - 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<HTMLElement>} elements - array of elements to put into a single parent
*/
static wrap(elements) {
const domWrapper = this.parseHTML(`<div class="dom-wrapper"></div>`);
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: /<a?\.(\w+)\.(\d+)>/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("<a"),
name: parsed[1],
id: parsed[2],
raw: parsed[0]
});
}
}
} while (parsed);
if (hasParsed) {
const words = node.split(" ").map((word, index, arr) => {
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/popoutWindow.js":
/*!*************************************!*\
!*** ./src/modules/popoutWindow.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 _bdEvents__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./bdEvents */ "./src/modules/bdEvents.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
/* harmony default export */ __webpack_exports__["default"] = (new class popoutWindow {
constructor() {
/**
* @type {Map<string, Window>}
*/
this.windows = new Map();
this.enabled = false;
this.init();
}
async init() {
let popoutModule = await window.Lightcord.Api.ensureExported(e => e.default && e.default.getWindow);
window.Lightcord.DiscordModules.dispatcher.subscribe("POPOUT_WINDOW_OPEN", ev => {
setImmediate(() => {
/**
* @type {Window}
*/
const window = popoutModule.default.getWindow(ev.key);
this.windows.set(ev.key, window);
let classList = window.document.body.classList;
classList.add("window-popout");
classList.add("lightcord");
classList.add("lightcord");
this.update(ev.key);
});
});
window.Lightcord.DiscordModules.dispatcher.subscribe("POPOUT_WINDOW_CLOSE", ev => {
setImmediate(() => {
this.windows.delete(ev.key);
});
});
_bdEvents__WEBPACK_IMPORTED_MODULE_1__["default"].on("theme-enabled", () => {
this.update();
});
_bdEvents__WEBPACK_IMPORTED_MODULE_1__["default"].on("theme-disabled", () => {
this.update();
});
_bdEvents__WEBPACK_IMPORTED_MODULE_1__["default"].on("theme-reloaded", () => {
this.update();
});
_bdEvents__WEBPACK_IMPORTED_MODULE_1__["default"].on("theme-unloaded", () => {
this.update();
});
_bdEvents__WEBPACK_IMPORTED_MODULE_1__["default"].on("theme-loaded", () => {
this.update();
});
}
enable() {
this.enabled = true;
this.update();
}
disable() {
this.enabled = false;
this.update();
}
update(key) {
if (!this.windows.size) return;
if (!this.enabled) {
return this.removeThemes(key);
} else {
return this.applyThemes(key);
}
}
removeThemes(key) {
if (this.enabled) return;
if (key) {
let window = this.windows.get(key);
if (!window) return;
let document = window.document;
for (let style of document.querySelectorAll("style[data-lightcord-theme=true]")) {
style.remove();
}
} else {
for (let key of this.windows.keys()) {
this.removeThemes(key);
}
}
}
applyThemes(key) {
if (!this.enabled) return;
if (key) {
let window = this.windows.get(key);
if (!window) return;
let document = window.document;
for (let style of document.querySelectorAll("style[data-lightcord-theme=true]")) {
style.setAttribute("will-remove", "true");
}
Object.keys(bdthemes).forEach(themeName => {
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][themeName]) return; // theme disabled
const theme = bdthemes[themeName];
if (!theme) return; //:shrug:
let existing = document.querySelector("style[data-lightcord-theme=true]#" + _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].escapeID(theme.id));
if (existing) {
existing.innerHTML = unescape(theme.css);
existing.removeAttribute("will-remove");
} else {
const style = document.createElement("style");
style.id = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].escapeID(theme.id);
style.innerHTML = unescape(theme.css);
style.setAttribute("data-lightcord-theme", "true");
document.head.append(style);
}
});
for (let style of document.querySelectorAll("style[will-remove=true]")) {
style.remove();
}
} else {
for (let key of this.windows.keys()) {
this.applyThemes(key);
}
}
}
}());
/***/ }),
/***/ "./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 _Layers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Layers */ "./src/modules/Layers.jsx");
/* harmony default export */ __webpack_exports__["default"] = (new class V2_PublicServers {
constructor() {
this._appendButton = this._appendButton.bind(this);
window.Lightcord.BetterDiscord.V2_PublicServers = this;
}
render() {
_Layers__WEBPACK_IMPORTED_MODULE_6__["default"].createLayer(close => {
return _v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_ui_publicservers_publicServers__WEBPACK_IMPORTED_MODULE_5__["default"], {
rootId: "pubslayerroot",
close
});
});
}
get button() {
const btn = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`<div id="bd-pub-li" class="${_v2__WEBPACK_IMPORTED_MODULE_1__["default"].guildClasses.listItem}">`);
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-1"]) btn.style.display = "none";
const label = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`<div id="bd-pub-button" class="${"wrapper-25eVIn " + _v2__WEBPACK_IMPORTED_MODULE_1__["default"].guildClasses.circleButtonMask}">public</div>`);
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");
/* harmony import */ var _popoutWindow__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./popoutWindow */ "./src/modules/popoutWindow.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 === "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-9") {
_popoutWindow__WEBPACK_IMPORTED_MODULE_30__["default"][enabled ? "enable" : "disable"]();
}
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"]["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"]["lightcord-9"]) _popoutWindow__WEBPACK_IMPORTED_MODULE_30__["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));
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("theme-enabled");
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));
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("theme-disabled");
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) {
return this.toggleTheme(name);
};
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(`<div class="bd-modal-wrapper theme-dark">
<div class="bd-backdrop ${BDModules.get(e => e.backdrop && e.backdropWithLayer)[0].backdrop}"></div>
<div class="bd-modal ${modalModule.modal}">
<div class="bd-modal-inner ${modalModule.inner}">
<div class="header ${headerModule.header}">
<div class="title">${title}</div>
</div>
<div class="bd-modal-body">
<div class="scroller-wrap fade">
<div class="scroller">
${content}
</div>
</div>
</div>
<div class="footer ${headerModule.footer} ${footer2Module.footer}">
<button type="button">Okay</button>
</div>
</div>
</div>
</div>`);
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(`<div class="bd-modal-wrapper theme-dark">
<div class="bd-backdrop ${BDModules.get(e => e.backdrop && e.backdropWithLayer)[0].backdrop}"></div>
<div class="bd-modal bd-content-modal ${modalModule.modal}">
<div class="bd-modal-inner ${modalModule.inner}">
<div class="header ${headerModule.header}"><div class="title">Content Errors</div></div>
<div class="bd-modal-body">
<div class="tab-bar-container">
<div class="tab-bar TOP">
<div class="tab-bar-item">Plugins</div>
<div class="tab-bar-item">Themes</div>
</div>
</div>
<div class="table-header">
<div class="table-column column-name">Name</div>
<div class="table-column column-message">Message</div>
<div class="table-column column-error">Error</div>
</div>
<div class="scroller-wrap fade">
<div class="scroller">
</div>
</div>
</div>
<div class="footer ${headerModule.footer} ${footer2Module.footer}">
<button type="button">Okay</button>
</div>
</div>
</div>
</div>`);
function generateTab(errors) {
const container = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`<div class="errors">`);
for (const err of errors) {
const error = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`<div class="error">
<div class="table-column column-name">${err.name ? err.name : err.file}</div>
<div class="table-column column-message">${err.message}</div>
<div class="table-column column-error"><a class="error-link" href="">${err.error ? err.error.message : ""}</a></div>
</div>`);
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<string|ReactElement>)} 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}
- Can See NSFW Channels: ${user.nsfwAllowed}`;
}
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.listLanguages)[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 `<div style={{
marginTop: "20px", marginBottom: "20px"
}}>
<div style={{
backgroundColor: "var(--background-secondary)",
padding: "30px 30px",
borderRadius: "8px"
}} className="lc-tab-box-shadow">
<Lightcord.Api.Components.general.Title>Preview tabs</Lightcord.Api.Components.general.Title>
</div>
</div>`;
}
}
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 = `</${compPath}>`;
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 <div className="bd-select-wrap">
// <label className="bd-label">{this.props.label}</label>
// <div className={`bd-select${style}${isOpen}`} onClick={this.showMenu} ref={this.dropdown}>
// <div className="bd-select-controls">
// <div className="bd-select-value">{this.selected.label}</div>
// <Arrow className="bd-select-arrow" />
// </div>
// </div>
// {this.state.open && this.options}
// </div>;
/***/ }),
/***/ "./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(`<div id="bd-customcss-detach-container">`), 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(`<div id="bd-customcss-detach-container">`), 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");
{
/* <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="white" width="18px" height="18px">
<path d="M0 0h24v24H0z" fill="none"/>
<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"/>
</svg> */
}
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(<DiscordButton title="Copy Current Timestamp" onClick={() => {
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 === "UserPopout"), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.find(e => e.default && e.default.getCurrentUser)]);
}
getComponent() {
let [UserPopout, userModule] = this.modules;
const user = userModule.default.getCurrentUser();
return React.createElement(() => {
let render1 = UserPopout.default({
userId: user.id,
guildId: null,
channelId: null,
disableUserProfileLink: true
});
UserPopoutComponent = render1.type;
PopoutProps = render1.props;
return this.render();
}, null);
}
render() {
if (!UserPopoutComponent) return this.getComponent();
let [_UserPopout, userModule] = this.modules;
const user = userModule.default.getCurrentUser();
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
});
const popout = new UserPopoutComponent(Object.assign({}, PopoutProps, {
activity: activity,
userId: user.id
})).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/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() {
this.props.close();
}
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(<ServerCard server={server} join={self.join}/>);
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: "30000+",
members: "70000+",
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: "100+",
members: "300+",
categories: ["community", "programming", "support"],
description: "Official Lightcord server for support etc",
identifier: "705908350218666117",
iconUrl: "https://github.com/lightcord.png",
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 text = await response.text();
if (!text) {
self.setState({
title: "Not connected to discordservers.com!",
loading: true,
selectedCategory: -1,
connection: {
state: 1,
user: null
}
});
return;
}
const data = JSON.parse(text);
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("div", {
id: "pubslayerroot"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
id: "pubslayer"
}, _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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvMGdsb2JhbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL2xvYWRpbmdJY29uLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbG9jYWxTdG9yYWdlRml4LmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy8yNGhvdXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL0FudGlBZERNLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9DdXN0b21SaWNoUHJlc2VuY2UuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL0xheWVycy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2JkQXBpLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9iZEV2ZW50cy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvYmx1clByaXZhdGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NsYXNzTm9ybWFsaXplci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvY29sb3JlZFRleHQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9jb3JlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9kYXRhU3RvcmUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rldk1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc2FibGVUeXBpbmcuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc3RhbnQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2RvbXRvb2xzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9lbW9qaU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvcGx1Z2luQ2VydGlmaWVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9wbHVnaW5Nb2R1bGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3BvcG91dFdpbmRvdy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvcHVibGljU2VydmVycy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvc2V0dGluZ3NQYW5lbC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvc2V0dGluZ3NQYW5lbFNpZGViYXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3RoZW1lTW9kdWxlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy91dGlscy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvdjIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3ZvaWNlTW9kZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvd2VicGFja01vZHVsZXMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9zdmcvYnVnX2h1bnRlci5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9zdmcvY2lyY3VzLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3N2Zy9saWdodGNvcmQuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvQWNjb3VudEluZm9zLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL0FwaVByZXZpZXcuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvYWRkb25jYXJkLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2FkZG9ubGlzdC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9iZExvZ28uanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jaGVja2JveC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbXBvbmVudHMvZHJvcGRvd24uanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY29tcG9uZW50cy9zZWFyY2guanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY29tcG9uZW50cy9zd2l0Y2guanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY29udGVudENvbHVtbi5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2Nzc0VkaXRvci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2Nzc0VkaXRvckRldGFjaGVkLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvZXJyb3JCb3VuZGFyeS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2ljb25zL2RlbGV0ZS5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9kb3duYXJyb3cuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvaWNvbnMvZWRpdC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9oaXN0b3J5LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2ljb25zL3NlYXJjaC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9tYXJnaW50b3AuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcHJlc2VuY2VTZXR0aW5ncy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9wdWJsaWNzZXJ2ZXJzL3B1YmxpY1NlcnZlcnMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9wdWJsaWNzZXJ2ZXJzL3NlcnZlckNhcmQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9wdWJsaWNzZXJ2ZXJzL3NpZGViYXJWaWV3LmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcmVsb2FkSWNvbi5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3Njcm9sbGVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2VjdGlvbmVkU2V0dGluZ3NQYW5lbC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3NldHRpbmdzR3JvdXAuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zZXR0aW5nc1RpdGxlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc3dpdGNoLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdGFiQmFySGVhZGVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdGFiQmFySXRlbS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3RhYkJhclNlcGFyYXRvci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3Rvb2xzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdG9vbHRpcC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3Rvb2x0aXBXcmFwLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkveFN2Zy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwiY3J5cHRvXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcImVsZWN0cm9uXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcImV2ZW50c1wiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJmc1wiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJtb2R1bGVcIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwibm9kZS1mZXRjaFwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJwYXRoXCIiXSwibmFtZXMiOlsibWluaW11bURpc2NvcmRWZXJzaW9uIiwiY3VycmVudERpc2NvcmRWZXJzaW9uIiwid2luZG93IiwiRGlzY29yZE5hdGl2ZSIsInJlbW90ZUFwcCIsImdldFZlcnNpb24iLCJtaW5TdXBwb3J0ZWRWZXJzaW9uIiwiYmJkVmVyc2lvbiIsImJiZENoYW5nZWxvZyIsImRlc2NyaXB0aW9uIiwiY2hhbmdlcyIsInRpdGxlIiwidHlwZSIsIml0ZW1zIiwic2V0dGluZ3MiLCJpZCIsImluZm8iLCJpbXBsZW1lbnRlZCIsImhpZGRlbiIsImNhdCIsImNhdGVnb3J5IiwiZXhwZXJpbWVudGFsIiwicHJvY2VzcyIsInBsYXRmb3JtIiwiZGVmYXVsdENvb2tpZSIsInNldHRpbmdzQ29va2llIiwic2V0dGluZ3NSUEMiLCJkZWZhdWx0UlBDIiwiRGF0ZSIsIm5vdyIsImJkcGx1Z2luRXJyb3JzIiwiYmR0aGVtZUVycm9ycyIsImJkQ29uZmlnIiwiT2JqZWN0IiwiY3JlYXRlIiwiQmV0dGVyRGlzY29yZENvbmZpZyIsImJkdGhlbWVzIiwiYmRwbHVnaW5zIiwicGx1Z2luQ29va2llIiwidGhlbWVDb29raWUiLCJsb2NhbFN0b3JhZ2VGaXgiLCJsb2FkaW5nSWNvbiIsImRlcHJlY2F0ZUdsb2JhbCIsImtleSIsInZhbHVlIiwiZGVmaW5lUHJvcGVydHkiLCJnZXQiLCJVdGlscyIsIndhcm4iLCJnbG9iYWxLZXlzIiwia2V5cyIsIkdsb2JhbHMiLCJCRFYyIiwicGx1Z2luTW9kdWxlIiwidGhlbWVNb2R1bGUiLCJCREV2ZW50cyIsInNldHRpbmdzUGFuZWwiLCJEYXRhU3RvcmUiLCJDb250ZW50TWFuYWdlciIsIkNsYXNzTm9ybWFsaXplciIsIkJkQXBpIiwiQ29yZSIsIkNvcmVXcmFwcGVyIiwiY29uc3RydWN0b3IiLCJtZXRob2RzIiwic2V0Q29uZmlnIiwic2V0TWV0aG9kcyIsImluaXQiLCJ2MkxvYWRlciIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImNvbnRlbnRXaW5kb3dHZXR0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJIVE1MSUZyYW1lRWxlbWVudCIsInByb3RvdHlwZSIsImNvbnRlbnRXaW5kb3ciLCJSZWZsZWN0IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJQcm94eSIsIm9iaiIsInByb3AiLCJ1bmRlZmluZWQiLCJ2YWwiLCJiaW5kIiwid3JpdGFibGUiLCJjb25maWd1cmFibGUiLCJGdW5jdGlvbiIsIm9PcGVuIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwidXJsIiwidG9Mb3dlckNhc2UiLCJpbmNsdWRlcyIsIlRGSG91ciIsImluamVjdDI0SG91ciIsImNhbmNlbDI0SG91ciIsInR3ZWx2ZUhvdXIiLCJSZWdFeHAiLCJjb252ZXJ0IiwiZGF0YSIsIm1hdGNoZWQiLCJyZXR1cm5WYWx1ZSIsIm1hdGNoIiwibGVuZ3RoIiwicmVwbGFjZSIsInBhZFN0YXJ0IiwicGFyc2VJbnQiLCJjYW5jZWxDb3p5IiwibW9ua2V5UGF0Y2giLCJUaW1lRm9ybWF0dGVyIiwiYWZ0ZXIiLCJjYW5jZWxDb21wYWN0IiwicmVtb3ZlMjRIb3VyIiwiZGlzcGF0Y2hlciIsIkxpZ2h0Y29yZCIsIkRpc2NvcmRNb2R1bGVzIiwiQ2hhbm5lbE1vZHVsZSIsIkJETW9kdWxlcyIsImUiLCJkZWZhdWx0IiwiZ2V0Q2hhbm5lbCIsImhhc0NoYW5uZWwiLCJyZWxhdGlvblNoaXBNb2R1bGUiLCJhZGRSZWxhdGlvbnNoaXAiLCJETU1vZHVsZSIsImNsb3NlUHJpdmF0ZUNoYW5uZWwiLCJibG9ja2VkIiwidXNlck1vZHVsZSIsImdldEN1cnJlbnRVc2VyIiwiQW50aUJvdERNIiwiYW50aURNIiwiZW5hYmxlZCIsImVuYWJsZSIsInN1YnNjcmliZSIsImRpc2FibGUiLCJ1bnN1YnNjcmliZSIsImV2IiwibWVzc2FnZSIsImF1dGhvciIsImJvdCIsImd1aWxkX2lkIiwiY2hhbm5lbCIsImNoYW5uZWxfaWQiLCJzY2FuTWVzc2FnZSIsInNob3dUb2FzdCIsInVzZXJuYW1lIiwiZGlzY3JpbWluYXRvciIsImxvY2F0aW9uIiwidGVzdCIsImNvbnRlbnQiLCJFbWJlZHNDb250YWlucyIsInNlYXJjaCIsImVtYmVkcyIsIm1hcCIsImVtYmVkIiwiZm9vdGVyIiwidGV4dCIsImZpZWxkcyIsIm5hbWUiLCJtIiwiRGlzcGF0Y2hlciIsImRpc3BhdGNoIiwiQWN0aW9uVHlwZXMiLCJzb2NrZXRJZCIsInBpZCIsIkN1c3RvbVJpY2hQcmVzZW5jZSIsImdhbWUiLCJmb3JtYXRlZEdhbWUiLCJhcHBsaWNhdGlvbl9pZCIsImRldGFpbHMiLCJzdGF0ZSIsInRpbWVzdGFtcHMiLCJzdGFydCIsImFzc2V0cyIsImxhcmdlX2ltYWdlIiwic21hbGxfaW1hZ2UiLCJzZW5kR2FtZSIsIkxPQ0FMX0FDVElWSVRZX1VQREFURSIsImFjdGl2aXR5IiwiY29uc29sZSIsImxvZyIsInNldCIsImZldGNoQXNzZXRzIiwiYXBwbGljYXRpb25JZCIsImdldEFzc2V0cyIsIkVycm9yIiwiTGF5ZXJzIiwibGF5ZXJzIiwiQmV0dGVyRGlzY29yZCIsImlzSW5qZWN0ZWQiLCJxdWVyeVNlbGVjdG9yIiwiaW5qZWN0IiwiY2xhc3NOYW1lTGF5ZXJzIiwicmVtb3ZlRGEiLCJ2MiIsIldlYnBhY2tNb2R1bGVzIiwiZmluZCIsImxheWVyIiwiUmVhY3RJbnN0YW5jZSIsIkFwaSIsIkZpbmRSZWFjdCIsInJlbmRlciIsImNhbGwiLCJjbGFzc0xpc3QiLCJwcm9wcyIsImNoaWxkcmVuIiwic3BsaXQiLCJwdXNoIiwiam9pbiIsImZvckVhY2giLCJmb3JjZVVwZGF0ZSIsImNyZWF0ZUxheWVyIiwidXVpZHY0IiwibGF5IiwiaW5kZXgiLCJmaW5kSW5kZXgiLCJzcGxpY2UiLCJyZW1vdmUiLCJMYXllck1vZHVsZXMiLCJMYXllciIsIlJlYWN0IiwiQ29tcG9uZW50IiwiYW5pbWF0aW9uIiwibW9kdWxlcyIsIlZhbHVlIiwiZ2V0TGF5ZXIiLCJrZXlkb3duIiwid2hpY2giLCJkaXYiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJjb21wb25lbnREaWRNb3VudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJjb21wb25lbnRXaWxsRW50ZXIiLCJ0aW1pbmciLCJ0b1ZhbHVlIiwiZHVyYXRpb24iLCJjb21wb25lbnRXaWxsTGVhdmUiLCJpbnRlcnBvbGF0aW9uIiwiaW50ZXJwb2xhdGUiLCJpbnB1dFJhbmdlIiwib3V0cHV0UmFuZ2UiLCJzdHlsZSIsIm9wYWNpdHkiLCJ0cmFuc2Zvcm0iLCJzY2FsZSIsIkRpdiIsIl9fU0VDUkVUX0VNT1RJT05fXyIsImNzcyIsImJhY2tncm91bmRDb2xvciIsInBvc2l0aW9uIiwidG9wIiwicmlnaHQiLCJib3R0b20iLCJsZWZ0IiwiZGlzcGxheSIsIm92ZXJmbG93IiwiV2Via2l0Qm94T3JpZW50IiwiV2Via2l0Qm94RGlyZWN0aW9uIiwibXNGbGV4RGlyZWN0aW9uIiwiZmxleERpcmVjdGlvbiIsInpJbmRleCIsInBhZGRpbmdUb3AiLCJmaWx0ZXIiLCJkZWZhdWx0UHJvcHMiLCJSZWFjdERPTSIsIlJlYWN0RG9tIiwiUmVhY3RDb21wb25lbnQiLCJXaW5kb3dDb25maWdGaWxlIiwiZW1vdGVzIiwic2NyZWVuV2lkdGgiLCJNYXRoIiwibWF4IiwiZG9jdW1lbnRFbGVtZW50IiwiY2xpZW50V2lkdGgiLCJpbm5lcldpZHRoIiwic2NyZWVuSGVpZ2h0IiwiY2xpZW50SGVpZ2h0IiwiaW5uZXJIZWlnaHQiLCJnZXRBbGxXaW5kb3dQcmVmZXJlbmNlcyIsImdldFdpbmRvd1ByZWZlcmVuY2UiLCJzZXRXaW5kb3dQcmVmZXJlbmNlIiwiaW5qZWN0Q1NTIiwiRE9NIiwiYWRkU3R5bGUiLCJlc2NhcGVJRCIsImNsZWFyQ1NTIiwicmVtb3ZlU3R5bGUiLCJsaW5rSlMiLCJhZGRTY3JpcHQiLCJ1bmxpbmtKUyIsInJlbW92ZVNjcmlwdCIsImdldFBsdWdpbiIsImhhc093blByb3BlcnR5IiwicGx1Z2luIiwiZ2V0Q29yZSIsIm1haW5Db3JlIiwiYWxlcnQiLCJzaG93Q29uZmlybWF0aW9uTW9kYWwiLCJjYW5jZWxUZXh0Iiwib3B0aW9ucyIsImZpbmRNb2R1bGUiLCJmaW5kQWxsTW9kdWxlcyIsImZpbmRBbGwiLCJmaW5kTW9kdWxlQnlQcm9wcyIsImZpbmRCeVVuaXF1ZVByb3BlcnRpZXMiLCJmaW5kTW9kdWxlQnlQcm90b3R5cGVzIiwicHJvdG9zIiwiZmluZEJ5UHJvdG90eXBlcyIsImZpbmRNb2R1bGVCeURpc3BsYXlOYW1lIiwiZmluZEJ5RGlzcGxheU5hbWUiLCJnZXRJbnRlcm5hbEluc3RhbmNlIiwibm9kZSIsImpRdWVyeSIsIkVsZW1lbnQiLCJsb2FkRGF0YSIsInBsdWdpbk5hbWUiLCJnZXRQbHVnaW5EYXRhIiwiZ2V0RGF0YSIsInNhdmVEYXRhIiwic2V0UGx1Z2luRGF0YSIsInNldERhdGEiLCJkZWxldGVEYXRhIiwiZGVsZXRlUGx1Z2luRGF0YSIsIndoYXQiLCJtZXRob2ROYW1lIiwib25SZW1vdmVkIiwiY2FsbGJhY2siLCJzdXBwcmVzc0Vycm9ycyIsIm1ldGhvZCIsInRlc3RKU09OIiwiaXNQbHVnaW5FbmFibGVkIiwiaXNUaGVtZUVuYWJsZWQiLCJpc1NldHRpbmdFbmFibGVkIiwiZW5hYmxlU2V0dGluZyIsIm9uQ2hhbmdlIiwiZGlzYWJsZVNldHRpbmciLCJ0b2dnbGVTZXR0aW5nIiwiZ2V0QkREYXRhIiwic2V0QkREYXRhIiwibWFrZUFkZG9uQVBJIiwiY29va2llIiwibGlzdCIsIm1hbmFnZXIiLCJBZGRvbkFQSSIsImZvbGRlciIsImlzRW5hYmxlZCIsInRvZ2dsZSIsInJlbG9hZCIsImdldEFsbCIsImsiLCJhIiwiUGx1Z2lucyIsIlRoZW1lcyIsIkV2ZW50RW1pdHRlciIsInJlcXVpcmUiLCJldmVudE5hbWUiLCJhcmdzIiwiZW1pdCIsIm9mZiIsImV2ZW50QWN0aW9uIiwicmVtb3ZlTGlzdGVuZXIiLCJzZWxlY3RvcnMiLCJnZXRTZWxlY3RvcnMiLCJzdGFuZGFyZFNpZGViYXJWaWV3IiwiZGVmYXVsdENsYXNzTmFtZSIsInNlbGVjdHMiLCJ1c2VyU2V0dGluZ3NBY2NvdW50IiwicGF5bWVudFNvdXJjZVJvdyIsInN1YlRleHQiLCJkZXNjcmlwdGlvbldyYXBwZXIiLCJ2aWV3Qm9keSIsInVzZXJTZXR0aW5nc1NlY3VyaXR5IiwiQmx1clByaXZhdGUiLCJlcnJvciIsIkRPTVRvb2xzIiwibm9ybWFsaXplZFByZWZpeCIsInJhbmRDbGFzcyIsInN0b3AiLCJoYXNQYXRjaGVkIiwidW5wYXRjaENsYXNzTW9kdWxlcyIsIm1vZHVsZUZpbHRlciIsInJldmVydEVsZW1lbnQiLCJwYXRjaENsYXNzTW9kdWxlcyIsIm5vcm1hbGl6ZUVsZW1lbnQiLCJwYXRjaERPTU1ldGhvZHMiLCJtb2R1bGUiLCJwYXRjaENsYXNzTW9kdWxlIiwidW5wYXRjaENsYXNzTW9kdWxlIiwic2hvdWxkSWdub3JlIiwiaXNOYU4iLCJlbmRzV2l0aCIsInN0YXJ0c1dpdGgiLCJBcnJheSIsImlzQXJyYXkiLCJfX2VzTW9kdWxlIiwiYmFzZUNsYXNzTmFtZSIsImNvbXBvbmVudE5hbWUiLCJjbGFzc05hbWVzIiwibm9ybWFsQ2xhc3MiLCJjYW1lbENhc2UiLCJzIiwiaSIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJuZXdTdHJpbmciLCJ0cmltIiwiZWxlbWVudCIsImNsYXNzZXMiLCJjIiwiY2xlbiIsIm5ld0NsYXNzIiwiYWRkIiwiY2hpbGQiLCJuZXh0RWxlbWVudFNpYmxpbmciLCJ0b1JlbW92ZSIsImNvbnRhaW5zIiwiRE9NVG9rZW5MaXN0IiwidG9rZW4iLCJ0b2tlbnMiLCJ0IiwiQ29sb3JlZFRleHQiLCJpbmplY3RDb2xvcmVkVGV4dCIsImNhbmNlbENvbG9yZWRUZXh0IiwiTWVzc2FnZUNvbXBvbmVudCIsImJlZm9yZSIsIm1ldGhvZEFyZ3VtZW50cyIsImNoaWxkcmVuTWVzc2FnZUNvbnRlbnQiLCJtZXNzYWdlQ29udGVudCIsImRpc3BsYXlOYW1lIiwib3JpZ2luYWxUeXBlIiwiX19vcmlnaW5hbE1ldGhvZCIsInJvbGVDb2xvciIsImNvbG9yU3RyaW5nIiwiY29sb3IiLCJhc3NpZ24iLCJyZW1vdmVDb2xvcmVkVGV4dCIsImNsYXNzTmFtZU1hcmt1cCIsIm1hcmt1cCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJlbGVtIiwic2V0UHJvcGVydHkiLCJwYXRoIiwiZnMiLCJNb2R1bGUiLCJnbG9iYWxQYXRocyIsInJlc29sdmUiLCJyZW1vdGUiLCJhcHAiLCJnZXRBcHBQYXRoIiwiTWV0YUVycm9yIiwib3JpZ2luYWxKU1JlcXVpcmUiLCJfZXh0ZW5zaW9ucyIsIm9yaWdpbmFsQ1NTUmVxdWlyZSIsInNwbGl0UmVnZXgiLCJlc2NhcGVkQXRSZWdleCIsImFkZG9uQ2FjaGUiLCJ0aW1lQ2FjaGUiLCJ3YXRjaGVycyIsInBhdGNoRXh0ZW5zaW9ucyIsImdldENvbnRlbnRSZXF1aXJlIiwicGx1Z2luc0ZvbGRlciIsIl9wbHVnaW5zRm9sZGVyIiwicmVhbHBhdGhTeW5jIiwiZGF0YVBhdGgiLCJ0aGVtZXNGb2xkZXIiLCJfdGhlbWVzRm9sZGVyIiwibG9hZEFkZG9uQ2VydGlmaWVyQ2FjaGUiLCJkYXRhU3RvcmUiLCJnZXRTZXR0aW5nR3JvdXAiLCJzZXRTZXR0aW5nR3JvdXAiLCJlbmNyeXB0U2V0dGluZ3NDYWNoZSIsIkpTT04iLCJwYXJzZSIsImRlY3J5cHRTZXR0aW5nc0NhY2hlIiwiaGFzaCIsInJlc3VsdCIsInN1c3BlY3QiLCJzYXZlQWRkb25DYWNoZSIsInN0cmluZ2lmeSIsIndhdGNoQ29udGVudCIsImNvbnRlbnRUeXBlIiwiaXNQbHVnaW4iLCJiYXNlRm9sZGVyIiwiZmlsZUVuZGluZyIsIndhdGNoIiwicGVyc2lzdGVudCIsImV2ZW50VHlwZSIsImZpbGVuYW1lIiwiUHJvbWlzZSIsInIiLCJzZXRUaW1lb3V0Iiwic3RhdFN5bmMiLCJlcnIiLCJjb2RlIiwidW5sb2FkUGx1Z2luIiwidW5sb2FkVGhlbWUiLCJpc0ZpbGUiLCJzdGF0cyIsIm10aW1lIiwiZ2V0VGltZSIsImxvYWRQbHVnaW4iLCJsb2FkVGhlbWUiLCJyZWxvYWRQbHVnaW4iLCJyZWxvYWRUaGVtZSIsInVud2F0Y2hDb250ZW50IiwiY2xvc2UiLCJleHRyYWN0TWV0YSIsImZpcnN0TGluZSIsImhhc09sZE1ldGEiLCJwYXJzZU9sZE1ldGEiLCJoYXNOZXdNZXRhIiwicGFyc2VOZXdNZXRhIiwibWV0YSIsInJhd01ldGEiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsImluZGV4T2YiLCJwYXJzZWQiLCJmb3JtYXQiLCJibG9jayIsIm91dCIsImZpZWxkIiwiYWNjdW0iLCJsaW5lIiwiY2hhckF0IiwibCIsInN1YnN0ciIsInNlbGYiLCJvcmlnaW5hbFJlcXVpcmUiLCJwb3NzaWJsZVBhdGgiLCJiYXNlbmFtZSIsImV4aXN0c1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJzdHJpcEJPTSIsImFkZGVkIiwiYXRpbWVNcyIsIm1vZGlmaWVkIiwibXRpbWVNcyIsInNpemUiLCJfY29tcGlsZSIsImRpZEV4cG9ydCIsImlzRW1wdHkiLCJleHBvcnRzIiwibWFrZVBsYWNlaG9sZGVyUGx1Z2luIiwiZ2V0TmFtZSIsImdldEF1dGhvciIsImdldERlc2NyaXB0aW9uIiwic291cmNlIiwid2Vic2l0ZSIsImxvYWRDb250ZW50IiwicHJvY2Vzc0ZpbGUiLCJ0aW1lc3RhbXAiLCJmaWxlIiwiaGFybSIsInN0YWNrIiwidW5sb2FkQ29udGVudCIsImNhY2hlIiwiaXNMb2FkZWQiLCJyZWxvYWRDb250ZW50IiwiY2FudFVubG9hZCIsImxvYWROZXdDb250ZW50IiwiYmFzZWRpciIsImZpbGVzIiwicmVhZGRpclN5bmMiLCJjb250ZW50TGlzdCIsInZhbHVlcyIsInJlbW92ZWQiLCJmIiwibG9hZEFsbENvbnRlbnQiLCJlcnJvcnMiLCJsb2FkUGx1Z2lucyIsImxvYWRUaGVtZXMiLCJjb25maWciLCJoYXNTdGFydGVkIiwiZmxhdCIsInZlcnNpb24iLCJFRCIsIldlYlNvY2tldCIsInBhdGNoQXR0cmlidXRlcyIsImluaXRTZXR0aW5ncyIsImNoZWNrRm9yR3VpbGRzIiwiaW5pdGlhbGl6ZSIsImluaXRpYWxpemVTZXR0aW5ncyIsImNvbnRlbnRNYW5hZ2VyIiwiQnVmZmVyIiwiZnJvbSIsInRvU3RyaW5nIiwiY2xpY2siLCJQbHVnaW5DZXJ0aWZpZXIiLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwiaW5pdE9ic2VydmVyIiwic2hvd0NvbnRlbnRFcnJvcnMiLCJwbHVnaW5zIiwidGhlbWVzIiwicHJldmlvdXNWZXJzaW9uIiwic2hvd0NoYW5nZWxvZ01vZGFsIiwiRW1vamlNb2R1bGUiLCJwYXRjaFNvY2lhbCIsInBhdGNoR3VpbGRQaWxscyIsInBhdGNoR3VpbGRMaXN0SXRlbXMiLCJwYXRjaEd1aWxkU2VwYXJhdG9yIiwicGF0Y2hNZXNzYWdlSGVhZGVyIiwicGF0Y2hNZW1iZXJMaXN0IiwicGF0Y2hBdHRhY2htZW50IiwiaGF2ZUluc3RhbGxlZERlZmF1bHQiLCJvbkNsb3NlIiwibG9nbyIsImlubmVySFRNTCIsImF0dHJpYnNQYXRjaHMiLCJjYW5jZWxQYXRjaEF0dHJpYnV0ZXMiLCJBbmNob3IiLCJlbnN1cmVFeHBvcnRlZCIsInRoZW4iLCJEaXNjb3JkVGFnIiwiRGlzY29yZFRhZ0NvbXAiLCJiYWRnZURpdiIsIm1hcmdpblRvcCIsInVzZXIiLCJUb29sdGlwV3JhcCIsInNpZGUiLCJocmVmIiwidGFyZ2V0IiwiQkRMb2dvIiwiTGlnaHRjb3JkTG9nbyIsImFwcGx5QmFkZ2VzIiwidGltZXNDaGVja2VkIiwid3JhcHBlciIsImd1aWxkQ2xhc3NlcyIsImd1aWxkIiwibGlzdEl0ZW0iLCJibG9iIiwiYmxvYkNvbnRhaW5lciIsImRlZmVyTG9hZGVkIiwicmVhZHlTdGF0ZSIsImluamVjdEV4dGVybmFscyIsInNhdmVTZXR0aW5ncyIsImxvYWRTZXR0aW5ncyIsInNldHRpbmciLCJnZXRQcmVkaWNhdGVTZWN0aW9ucyIsInNldHRpbmdNb2R1bGUiLCJzZWN0aW9uIiwicG9wZWQiLCJwb3AiLCJyZW5kZXJTaWRlYmFyIiwiY2xhc3NOYW1lTGF5ZXIiLCJjbGFzc05hbWVTb2NpYWxMaW5rcyIsImNsYXNzTmFtZU1vZGFsIiwibWFpbk9ic2VydmVyIiwiTXV0YXRpb25PYnNlcnZlciIsIm11dGF0aW9ucyIsIm1sZW4iLCJtdXRhdGlvbiIsInJhd09ic2VydmVyIiwiYWRkZWROb2RlcyIsImFuaW1hdGluZyIsInNvY2lhbExpbmtzIiwibW9kYWwiLCJpbm5lciIsInJlc3BvbnNpdmVXaWR0aE1vYmlsZSIsImdldEF0dHJpYnV0ZSIsInNldEF0dHJpYnV0ZSIsInBhcmVudEVsZW1lbnQiLCJvYnNlcnZlIiwiY2hpbGRMaXN0Iiwic3VidHJlZSIsInNvY2lhbFBhdGNoIiwiVGFiQmFyIiwic29jaWFsTW9kdWxlMSIsIm9yaWdpbmFsIiwibmV3T25lIiwicmV0dXJuVmFsIiwibGluayIsImNsYXNzTmFtZUNvbG9yTXV0ZWQiLCJzaXplcyIsImNsYXNzTmFtZVZlcnNpb25IYXNoIiwiY29sb3JNdXRlZCIsInNpemUzMiIsInZlcnNpb25IYXNoIiwiYnJhbmNoIiwiYWRkaXRpb25hbCIsInJlYWN0Iiwic2l6ZTEyIiwiZWxlY3Ryb24iLCJnZXRHbG9iYWwiLCJjb21taXQiLCJvcmlnaW5hbFZlcnNpb25zIiwiZ2V0R3VpbGRDbGFzc2VzIiwiZ3VpbGRzV3JhcHBlciIsImZpbmRCeVByb3BzIiwiZ3VpbGRzIiwicGlsbCIsImd1aWxkTGlzdEl0ZW1zUGF0Y2giLCJHdWlsZENsYXNzZXMiLCJsaXN0SXRlbUNsYXNzIiwiYmxvYkNsYXNzIiwicmVhY3RJbnN0YW5jZSIsIkd1aWxkQ29tcG9uZW50IiwicmV0dXJuIiwidGhpc09iamVjdCIsImd1aWxkRGF0YSIsInVucmVhZCIsInNlbGVjdGVkIiwiYXVkaW8iLCJ2aWRlbyIsImJhZGdlIiwiYW5pbWF0YWJsZSIsImd1aWxkUGlsbFBhdGNoIiwiZ3VpbGRQaWxsIiwiaG92ZXJlZCIsImd1aWxkU2VwYXJhdG9yUGF0Y2giLCJHdWlsZHMiLCJndWlsZENvbXBvbmVudHMiLCJHdWlsZFNlcGFyYXRvciIsIlNlcGFyYXRvciIsIkF0dGFjaG1lbnRQYXRjaCIsIkF0dGFjaG1lbnQiLCJhdHRhY2htZW50IiwiZ2V0TmVzdGVkUHJvcCIsInBhdGNoIiwibWVzc2FnZUhlYWRlclBhdGNoIiwiTWVzc2FnZUhlYWRlciIsImNoYXQiLCJuZXh0VGljayIsImdldEVsZW1lbnRCeUlkIiwiY2hpbGROb2RlcyIsImJsb2NrRGl2IiwiZGlzdGFudCIsImdldEJhZGdlcyIsImJhZGdlcyIsInN2ZyIsIndpZHRoIiwic2NvcGVzIiwic2NvcGUiLCJjb21wb25lbnQiLCJkaXYyIiwicmVhY3REb20iLCJtZW1iZXJMaXN0UGF0Y2giLCJNZW1iZXJMaXN0SXRlbSIsInJlbmRlckRlY29yYXRvcnMiLCJ1cGRhdGVJbmplY3RvciIsImluamVjdGlvblBhdGgiLCJfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyIsInJlbGVhc2VDaGFubmVsIiwiZ2xvYmFscyIsImdldFJlbGVhc2VDaGFubmVsIiwiZW52IiwiQVBQREFUQSIsIkhPTUUiLCJYREdfQ09ORklHX0hPTUUiLCJzdGFibGUiLCJjYW5hcnkiLCJwdGIiLCJwbHVnaW5EYXRhIiwiQkRGaWxlIiwid3JpdGVGaWxlU3luYyIsInNldHRpbmdzRmlsZSIsInVubGlua1N5bmMiLCJfaW5qZWN0aW9uUGF0aCIsImJhc2UiLCJyb2FtaW5nQmFzZSIsImdldFBhdGgiLCJyb2FtaW5nTG9jYXRpb24iLCJyZWFsTG9jYXRpb24iLCJjb25maWdGaWxlIiwiX2NvbmZpZ0ZpbGUiLCJfQkRGaWxlIiwiX3NldHRpbmdzRmlsZSIsImdldFBsdWdpbkZpbGUiLCJEZXZNb2RlIiwiZGVidWdMaXN0ZW5lciIsImNvcHlTZWxlY3Rvckxpc3RlbmVyIiwic3RhcnREZWJ1Z0xpc3RlbmVyIiwic3RhcnRDb3B5U2VsZWN0b3IiLCJzdG9wRGVidWdMaXN0ZW5lciIsInN0b3BDb3B5U2VsZWN0b3IiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsInN0b3BQcm9wYWdhdGlvbiIsInNlbGVjdG9yIiwiZ2V0U2VsZWN0b3IiLCJjbGFzc0xheWVyIiwiY2xhc3NJdGVtcyIsImRpc2FibGVkUG9pbnRlckV2ZW50cyIsIm1lbnUiLCJhdHRhY2giLCJjbSIsInF1ZXJ5IiwiY29udGFpbmVyIiwibGF5ZXJDb250YWluZXIiLCJjbVdyYXAiLCJzdHlsZUZsZXhpYmxlIiwiYWNjb21tb2RhdGVTY3JvbGxiYXIiLCJhcHBlbmQiLCJjbGllbnRZIiwiY2xpZW50WCIsInNjcm9sbGVyQ2xhc3NlcyIsInNjcm9sbGVyV3JhcCIsInNjcm9sbGVyVGhlbWVkIiwidGhlbWVHaG9zdEhhaXJsaW5lIiwic2Nyb2xsZXIiLCJyZW1vdmVDTSIsImtleUNvZGUiLCJjbWciLCJjbWkiLCJpdGVtIiwibGFiZWxDb250YWluZXIiLCJjb2xvckRlZmF1bHQiLCJsYWJlbCIsIk5hdGl2ZU1vZHVsZSIsImNvcHkiLCJlbGVtZW50cyIsInF1ZXJ5QWxsIiwiZm9jdXNlZCIsInNlcGFyYXRvciIsInNjcm9sbEhlaWdodCIsImZ1bGxQYXRoIiwiZWwiLCJuYW1lcyIsInBhcmVudE5vZGUiLCJ1bnNoaWZ0Iiwib3duZXJEb2N1bWVudCIsInRhZ05hbWUiLCJlbnRyaWVzIiwicHJldmlvdXNFbGVtZW50U2libGluZyIsIkRpc2FibGVUeXBpbmciLCJzdGFydFR5cGluZyIsInR5cGluZ01vZHVsZSIsImRpc2FibGVkIiwic3RvcFR5cGluZyIsInJhbmRvbSIsInYiLCJhd2FpdGluZ0JhZGdlc1Byb21pc2VzIiwiYmFkZ2VzVG9GZXRjaCIsIkRpc3RhbnRTZXJ2ZXIiLCJfY2FjaGUiLCJuZXdQcm9taXNlIiwicmVzIiwiQ29uc3RhbnRzIiwiZGVmYXVsdFVzZXJzIiwiZmV0Y2hlZEJhZGdlcyIsInVzZXJzIiwiaGFuZGxlUmVxdWVzdCIsIlJvdXRlcyIsInN0YXR1cyIsInJlc3BvbnNlQm9keSIsImpzb24iLCJwcm9taXNlIiwidXNlcl9pZCIsImNhdGNoIiwiTGlnaHRjb3JkRXJyb3IiLCJyb3V0ZSIsInJlamVjdCIsIm5vZGVGZXRjaCIsIlNFUlZFUl9VUkwiLCJoZWFkZXJzIiwiQXV0aG9yaXphdGlvbiIsIkJ1Z0h1bnRlckJhZGdlIiwiQ2lyY3VzIiwiaGVhZCIsInNjcmlwdCIsInNyYyIsIm9ubG9hZCIsImFuaW1hdGUiLCJfIiwidXBkYXRlIiwicGVyZm9ybWFuY2UiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJ0aW1lIiwidGltZUZyYWN0aW9uIiwicHJvZ3Jlc3MiLCJRIiwicGFyc2VIVE1MIiwiaXNIVE1MIiwiTm9kZUxpc3QiLCJzb21lIiwibiIsIm5vZGVUeXBlIiwiYmFzZUVsZW1lbnQiLCJodG1sIiwiZnJhZ21lbnQiLCJ0ZW1wbGF0ZSIsImNsb25lTm9kZSIsImVzY2FwZUhUTUwiLCJ0ZXh0Tm9kZSIsImNyZWF0ZVRleHROb2RlIiwic3BhbkVsZW1lbnQiLCJub2RlVmFsdWUiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwidG9nZ2xlQ2xhc3MiLCJjbGFzc25hbWUiLCJpbmRpY2F0b3IiLCJoYXNDbGFzcyIsImV2ZXJ5IiwicmVwbGFjZUNsYXNzIiwib2xkTmFtZSIsIm5ld05hbWUiLCJhcHBlbmRUbyIsInRoaXNOb2RlIiwidGhhdE5vZGUiLCJwcmVwZW5kVG8iLCJwcmVwZW5kIiwiaW5zZXJ0QWZ0ZXIiLCJ0YXJnZXROb2RlIiwiaW5zZXJ0QmVmb3JlIiwibmV4dFNpYmxpbmciLCJuZXdOb2RlIiwibmV4dCIsIm5leHRBbGwiLCJuZXh0VW50aWwiLCJtYXRjaGVzIiwicHJldmlvdXMiLCJwcmV2aW91c0FsbCIsInByZXZpb3VzVW50aWwiLCJpbmRleEluUGFyZW50IiwibnVtIiwicGFyZW50IiwiZmluZENoaWxkIiwiZmluZENoaWxkcmVuIiwicGFyZW50cyIsImNsb3Nlc3QiLCJwYXJlbnRzVW50aWwiLCJzaWJsaW5ncyIsImF0dHJpYnV0ZSIsImdsb2JhbCIsImdldENvbXB1dGVkU3R5bGUiLCJoZWlnaHQiLCJ0ZXh0Q29udGVudCIsIm91dGVyV2lkdGgiLCJvZmZzZXRXaWR0aCIsIm91dGVySGVpZ2h0Iiwib2Zmc2V0SGVpZ2h0Iiwib2Zmc2V0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwibGlzdGVuZXJzIiwiX2xpc3RlbmVycyIsIm9uIiwiZXZlbnQiLCJkZWxlZ2F0ZSIsIm5hbWVzcGFjZSIsImhhc0RlbGVnYXRlIiwiZXZlbnRGdW5jIiwiY2FuY2VsIiwibmV3Q2FuY2VsIiwib25jZSIsIl9fb2ZmQWxsIiwibWF0Y2hGaWx0ZXIiLCJsaXN0ZW5lciIsImRlZmF1bHRGaWx0ZXIiLCJvbk1vdW50Q2hhbmdlIiwib25Nb3VudCIsIndyYXBwZWRDYWxsYmFjayIsIm9ic2VydmVyIiwibm9kZXMiLCJyZW1vdmVkTm9kZXMiLCJkaXJlY3RNYXRjaCIsInBhcmVudE1hdGNoIiwib25Vbm1vdW50Iiwib25BZGRlZCIsIndyYXAiLCJkb21XcmFwcGVyIiwicmVzb2x2ZUVsZW1lbnQiLCJFbW9qaVJlZ2V4IiwiQ3VzdG9tRW1vamlNb2R1bGUiLCJDdXN0b21FbW9qaSIsIkVtb2ppTW9kdWxlQXBpIiwiZ2V0Q3VzdG9tRW1vamlCeUlkIiwiQXV0b2NvbXBsZXRlTW9kdWxlIiwiQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMiLCJnZXRBdXRvY29tcGxldGVPcHRpb25zIiwiRW1vamlNb2R1bGVRdWVyeSIsInF1ZXJ5RW1vamlSZXN1bHRzIiwiTWVzc2FnZXMiLCJFTU9KSV9NQVRDSElORyIsImd1aWxkTW9kdWxlIiwiZ2V0R3VpbGQiLCJnZXRHdWlsZHMiLCJpc0ZldGNoaW5nIiwiZW1vamlTZWFyY2giLCJnZXREaXNhbWJpZ3VhdGVkRW1vamlDb250ZXh0IiwiTElHSFRDT1JEX0VNT0pJUyIsImFyZzEiLCJhcmcyIiwiY29uZGl0aW9uIiwic2V0RW1vamlVc2FibGUiLCJxdWVyeVJlc3VsdHMiLCJyZXN1bHRzIiwicmVuZGVyUmVzdWx0cyIsIkQiLCJlbW9qaXMiLCJFTU9KSSIsIkVtb2ppIiwiZW1vamkiLCJ1bmlxdWVOYW1lIiwic2VudGluZWwiLCJndWlsZElkIiwiZ2V0UGxhaW5UZXh0IiwiaXNBbmltYXRlZCIsImFuaW1hdGVkIiwibWFuYWdlZCIsIm9yaWdpbmFsTmFtZSIsImdldFJhd1RleHQiLCJjYW5jZWxFbW9qaVJlbmRlciIsImNhbmNlbEVtb3RlUmVuZGVyIiwibmV3Q29udGVudCIsImhhc1BhcnNlZCIsImV4ZWMiLCJyYXciLCJ3b3JkcyIsIndvcmQiLCJhcnIiLCJlbW9qaUlkIiwianVtYm9hYmxlIiwicmVkdWNlIiwiY3VycmVudCIsInNoaWZ0IiwibyIsInUiLCJkIiwib25DbGljayIsIm9uSG92ZXIiLCJSIiwicHJlZml4IiwiVGl0bGUiLCJFbW9qaUZpbHRlck1vZHVsZSIsImlzRW1vamlEaXNhYmxlZCIsImlzVXNhYmxlIiwidXNhYmxlIiwic3Vycm9nYXRlcyIsImRpdmVyc2l0eSIsImNhY2hlMiIsInByb2Nlc3NBdHRhY2htZW50IiwiaXNUcnVzdGVkIiwiY2hlY2tWaXJ1c2VzIiwicmVzdWx0Q2FsbGJhY2siLCJyZW1vdmVDYWxsYmFjayIsImlzSGFybWZ1bCIsImtleXdvcmQiLCJvb2YiLCJub19jb21tZW50cyIsInJlZ2V4cHMiLCJyZWdleCIsImhhc2hUb1VybCIsImNoZWNrSGFzaCIsImdldEN1cnJlbnRXZWJDb250ZW50cyIsInVzZXJBZ2VudCIsIl9fcGF0aCIsImlzRnJvbUxvYWRlciIsImNyeXB0byIsImFsbG9jIiwiY3JlYXRlUmVhZFN0cmVhbSIsImNodW5rIiwiY29uY2F0IiwiaGFzaFJlc3VsdCIsImRpZ2VzdCIsInJlbmRlclRvRWxlbWVudHMiLCJmbG93ZXJTdGFyTW9kdWxlIiwiZmxvd2VyU3RhckNvbnRhaW5lciIsImNoaWxkTW9kdWxlIiwiY2hpbGRDb250YWluZXIiLCJib3JkZXJDb2xvciIsIm5leHROb2RlIiwiY29uZmlybVRleHQiLCJkYW5nZXIiLCJvbkNhbmNlbCIsIm9uQ29uZmlybSIsInNoZWxsIiwib3BlbkV4dGVybmFsIiwidG9vbHRpcFdyYXAiLCJ2aWV3Qm94IiwieCIsInkiLCJtYXNrIiwiZmlsbCIsInBvaW50ZXJFdmVudHMiLCJvZmZpY2lhbCIsInNwYW4iLCJmbG9hdCIsImZsb3dlclN0YXIiLCJnZXRLZXllZEFycmF5IiwiYnVmZmVyIiwiaW5zdGFsbFBhdGgiLCJjdXJzb3IiLCJzdHJva2UiLCJzYXZlIiwiT2JqZWN0U3RvcmFnZSIsImxvY2FsU3RvcmFnZU1vZHVsZSIsImxvY2FsU3RvcmFnZSIsImltcGwiLCJidG9hIiwic2V0SW50ZXJ2YWwiLCJzYWZlSlNPTlBhcnNlIiwiYXRvYiIsImdlbmVyYXRlS2V5IiwiZGVjaXBoZXIiLCJkZWNyeXB0ZWQiLCJmaW5hbCIsImNpcGhlciIsImVuY3J5cHRlZCIsIlBsdWdpbk1vZHVsZSIsImxvYWRQbHVnaW5EYXRhIiwibG9hZCIsInNhdmVQbHVnaW5EYXRhIiwiY2hhbm5lbFN3aXRjaCIsInN0YXJ0UGx1Z2luIiwic3RvcFBsdWdpbiIsImVuYWJsZVBsdWdpbiIsImRpc2FibGVQbHVnaW4iLCJ0b2dnbGVQbHVnaW4iLCJwIiwiZmlsZW5hbWVPck5hbWUiLCJiZHBsdWdpbiIsImRlbGV0ZSIsImVkaXQiLCJvcGVuSXRlbSIsInVwZGF0ZVBsdWdpbkxpc3QiLCJzYXZlZCIsIm5ld01lc3NhZ2UiLCJvbk1lc3NhZ2UiLCJvblN3aXRjaCIsInBvcG91dFdpbmRvdyIsIndpbmRvd3MiLCJNYXAiLCJwb3BvdXRNb2R1bGUiLCJnZXRXaW5kb3ciLCJzZXRJbW1lZGlhdGUiLCJiZEV2ZW50cyIsInJlbW92ZVRoZW1lcyIsImFwcGx5VGhlbWVzIiwidGhlbWVOYW1lIiwidGhlbWUiLCJleGlzdGluZyIsInVuZXNjYXBlIiwicmVtb3ZlQXR0cmlidXRlIiwiVjJfUHVibGljU2VydmVycyIsIl9hcHBlbmRCdXR0b24iLCJWMkNfUHVibGljU2VydmVycyIsInJvb3RJZCIsImJ1dHRvbiIsImJ0biIsImNpcmNsZUJ1dHRvbk1hc2siLCJjbGFzc05hbWV0dXRvcmlhbENvbnRhaW5lciIsImRvd25sb2FkUHJvZ3Jlc3MiLCJ0dXRvcmlhbENvbnRhaW5lciIsImFkZEJ1dHRvbiIsImd1aWxkUGF0Y2giLCJHdWlsZExpc3QiLCJ3ZWJwYWNrTW9kdWxlcyIsIkd1aWxkTGlzdE9sZCIsInJlbW92ZUJ1dHRvbiIsIkJEU2lkZWJhckhlYWRlciIsIlB1cmVDb21wb25lbnQiLCJzaWRlYmFyQ29tcG9uZW50cyIsIkhlYWRlciIsIkl0ZW0iLCJjaGFuZ2Vsb2dCdXR0b24iLCJIaXN0b3J5IiwicmVuZGVyZWQiLCJpc0NsZWFyaW5nQ2FjaGUiLCJWMl9TZXR0aW5nc1BhbmVsIiwidXBkYXRlU2V0dGluZ3MiLCJzaWRlYmFyIiwiVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyIiwicmVnaXN0ZXJDb21wb25lbnRzIiwicmVnaXN0ZXIiLCJtYWtlQ29tcG9uZW50IiwibGlnaHRjb3JkQ29tcG9uZW50IiwiUHJlc2VuY2VDb21wb25lbnQiLCJBY2NvdW50SW5mb3NDb21wb25lbnQiLCJBcGlQcmV2aWV3Q29tcG9uZW50IiwiY29yZUNvbXBvbmVudCIsImN1c3RvbUNzc0NvbXBvbmVudCIsInJlbmRlckFkZG9uUGFuZSIsImNvcmVTZXR0aW5ncyIsImdldFNldHRpbmdzIiwiY2F0ZWdvcmllcyIsIlNldCIsInNlY3Rpb25zIiwibGlnaHRjb3JkU2V0dGluZ3MiLCJQcmVzZW5jZVNldHRpbmdzIiwiY2hlY2tlZCIsInB1YmxpY1NlcnZlcnNNb2R1bGUiLCJ2b2ljZU1vZGUiLCJ0ZkhvdXIiLCJjb2xvcmVkVGV4dCIsImRNb2RlIiwiU2V0dGluZ3MiLCJkZXZNb2RlIiwiY2FsbFJpbmdpbmdCZWF0Iiwic2V0dGluZ3NTdG9yZSIsInNob3dDdXJyZW50R2FtZSIsInVwZGF0ZVJlbW90ZVNldHRpbmdzIiwiZ2V0Q3VycmVudFdpbmRvdyIsInNldEFsd2F5c09uVG9wIiwiQW50aUFkRE0iLCJibHVyUHJpdmF0ZSIsImRpc2FibGVUeXBpbmciLCJhcHBTZXR0aW5ncyIsInJlbGF1bmNoIiwiZXhpdCIsImNvcmUiLCJOb3RpZmljYXRpb25zVXNlU2hpbSIsIlNlY3Rpb25lZFNldHRpbmdzUGFuZWwiLCJNYXJnaW5Ub3AiLCJpc0NoZWNrZWQiLCJTd2l0Y2giLCJDb21wb25lbnRzIiwiaW5wdXRzIiwiQnV0dG9uIiwibG9vayIsImhvdmVyQ29sb3IiLCJpcGMiLCJzZW5kIiwiYXJndiIsInF1aXQiLCJzZXNzaW9uIiwiY2xlYXJDYWNoZSIsIlYyQ19QcmVzZW5jZVNldHRpbmdzIiwiVjJDX0FjY291bnRJbmZvcyIsIkFwaVByZXZpZXciLCJDc3NFZGl0b3IiLCJDb250ZW50TGlzdCIsIm9yaWdpbmFsUmVuZGVyIiwiZW51bWVyYWJsZSIsIkNhcmRMaXN0IiwiU2V0dGluZ0NvbXBvbmVudCIsInBhbmVscyIsInBhbmVsIiwiZ2V0Q29tcG9uZW50IiwiTENpdGVtcyIsIkxDRGV2SXRlbXMiLCJUaGVtZU1vZHVsZSIsImxvYWRUaGVtZURhdGEiLCJzYXZlVGhlbWVEYXRhIiwiZW5hYmxlVGhlbWUiLCJkaXNhYmxlVGhlbWUiLCJ0b2dnbGVUaGVtZSIsImJkdGhlbWUiLCJ1cGRhdGVUaGVtZUxpc3QiLCJfd2luZG93Q29uZmlnRmlsZSIsInRyYW5zcGFyZW50IiwiZnJhbWUiLCJjaGFyQ29kZUF0IiwiZ2V0VGV4dEFyZWEiLCJjaGFubmVsVGV4dEFyZWEiLCJ0aXRsZVdyYXBwZXIiLCJpbnNlcnRUZXh0IiwidGV4dGFyZWEiLCJmb2N1cyIsInNlbGVjdGlvblN0YXJ0Iiwic2VsZWN0aW9uRW5kIiwiZXhlY0NvbW1hbmQiLCJtb2R1bGVOYW1lIiwiZ3JvdXBDb2xsYXBzZWQiLCJncm91cEVuZCIsImZvcm1hdFN0cmluZyIsInN0cmluZyIsInJlcGxhY2VtZW50IiwiZXNjYXBlIiwicGFyYW1zIiwiaW5zdGVhZCIsInNpbGVudCIsImZvcmNlIiwib3JpZ01ldGhvZCIsImNhbmNlbGVkIiwiY2FuY2VsUGF0Y2giLCJvcmlnaW5hbE1ldGhvZCIsImNhbGxPcmlnaW5hbE1ldGhvZCIsInRlbXBSZXQiLCJfX21vbmtleVBhdGNoZWQiLCJkaXNjb25uZWN0IiwiaGFzTm90aWNlIiwiZm9ybSIsInRvYXN0V3JhcHBlciIsImljb24iLCJ0aW1lb3V0IiwidG9hc3RFbGVtIiwiaW5uZXJUZXh0IiwibW9kYWxNb2R1bGUiLCJoaWRlT25GdWxsc2NyZWVuIiwiaGVhZGVyTW9kdWxlIiwiaGVhZGVyIiwiZm9vdGVyMk1vZHVsZSIsImZvY3VzTG9jayIsImJhY2tkcm9wIiwiYmFja2Ryb3BXaXRoTGF5ZXIiLCJjbG9zaW5nTGlzdGVuZXJzIiwicGx1Z2luRXJyb3JzIiwidGhlbWVFcnJvcnMiLCJnZW5lcmF0ZVRhYiIsInRhYnMiLCJNb2RhbFN0YWNrIiwiQ2hhbmdlbG9nQ2xhc3NlcyIsIlRleHRFbGVtZW50IiwiRmxleENoaWxkIiwiVGl0bGVzIiwiQ2hhbmdlbG9nIiwic2VsZWN0YWJsZSIsIk1hcmtkb3duUGFyc2VyIiwiaW1hZ2UiLCJzdWJ0aXRsZSIsImNlIiwiY2hhbmdlbG9nSXRlbXMiLCJlbnRyeSIsIm1hcmdpbiIsInJlbmRlckhlYWRlciIsIkNoaWxkIiwiZ3JvdyIsInNocmluayIsInRhZyIsIlRhZ3MiLCJINCIsIlNpemVzIiwiU01BTEwiLCJDb2xvcnMiLCJTVEFOREFSRCIsImRhdGUiLCJyZW5kZXJGb290ZXIiLCJBbmNob3JDbGFzc2VzIiwiYW5jaG9yIiwiYW5jaG9yVW5kZXJsaW5lT25Ib3ZlciIsImpvaW5TdXBwb3J0U2VydmVyIiwiam9pbkJEMiIsInN1cHBvcnRMaW5rIiwiZGVmYXVsdEZvb3RlciIsIm9uU2Nyb2xsIiwiTW9kYWxBY3Rpb25zIiwiTWFya2Rvd24iLCJDb25maXJtYXRpb25Nb2RhbCIsImVtcHR5RnVuY3Rpb24iLCJvcGVuTW9kYWwiLCJyZWQiLCJtb2RhbEtleSIsIlYyIiwiZWRpdG9yRGV0YWNoZWQiLCJyZXEiLCJ3ZWJwYWNrSnNvbnAiLCJfX2V4dHJhX2lkX18iLCJzaG91bGRQcm90ZWN0IiwidGhlTW9kdWxlIiwiY2xlYXIiLCJzb3J0IiwiZ2V0VG9rZW4iLCJnZXRFbWFpbCIsInNob3dUb2tlbiIsInByb3RlY3QiLCJpc0RlZmF1bHQiLCJtb2QiLCJwcm94eSIsImZ1bmMiLCJfX3Byb3RvX18iLCJwcm9wTmFtZXMiLCJwcm90b05hbWVzIiwicHJvdG9Qcm9wIiwiaW50ZXJuYWwiLCJqb2luQkQxIiwiSW52aXRlQWN0aW9ucyIsImFjY2VwdEludml0ZUFuZFRyYW5zaXRpb25Ub0ludml0ZUNoYW5uZWwiLCJsZWF2ZUJEMSIsIkd1aWxkQWN0aW9ucyIsImxlYXZlR3VpbGQiLCJsZWF2ZUJEMiIsImpvaW5MQyIsImxlYXZlTEMiLCJyZWFjdENvbXBvbmVudCIsImFuY2hvckNsYXNzZXMiLCJzbGF0ZUVkaXRvckNsYXNzZXMiLCJtZXNzYWdlQ2xhc3NlcyIsInVucmVhZE1lbnRpb25zQmFyIiwiZ3VpbGRzRXJyb3IiLCJNZXNzYWdlQ29udGVudENvbXBvbmVudCIsIlRvb2x0aXBXcmFwcGVyIiwiVG9vbHRpcHMiLCJoaWRlIiwic2hvdyIsInN1Ym1pdCIsImFjdGl2YXRlUmFnaW5nRGVtb24iLCJkaXNtaXNzIiwiS2V5R2VuZXJhdG9yIiwiTGF5ZXJTdGFjayIsIlVzZXJTdG9yZSIsIkNoYW5uZWxTdG9yZSIsIkNoYW5uZWxBY3Rpb25zIiwiUHJpdmF0ZUNoYW5uZWxBY3Rpb25zIiwib3BlbkRNIiwidXNlcklkIiwic2VsZklkIiwicHJpdmF0ZUNoYW5uZWxJZCIsImdldERNRnJvbVVzZXJJZCIsInNlbGVjdFByaXZhdGVDaGFubmVsIiwib3BlblByaXZhdGVDaGFubmVsIiwicGFyc2VTZXR0aW5ncyIsIlZvaWNlTW9kZSIsIm1hcmdpbk1vZHVsZTIiLCJkZWZhdWx0TWFyZ2luaDUiLCJjb2xvck1vZHVsZSIsImNvbG9yU3RhbmRhcmQiLCJzaXplTW9kdWxlIiwic2Nyb2xsYmFyTW9kdWxlMSIsInNjcm9sbGJhckdob3N0SGFpcmxpbmUiLCJHdWlsZE1vZHVsZSIsImdldFJlbGF0aW9uc2hpcHMiLCJzZXNzaW9uTW9kdWxlIiwiZ2V0U2Vzc2lvbnMiLCJzaXplMTQiLCJoNSIsImdldFByb2ZpbGVWYWx1ZSIsImdldFN0YXRpc3RpY3MiLCJnZXRTZXNzaW9uVmFsdWUiLCJtYXJnaW5Cb3R0b20yMCIsInNlc3Npb25zUmF3Iiwic2Vzc2lvbnMiLCJzZXNzaW9uSWQiLCJjbGllbnRJbmZvIiwib3MiLCJjbGllbnQiLCJhY3Rpdml0aWVzIiwicmVwZWF0IiwiY3JlYXRlZEF0IiwiYXZhdGFyVVJMIiwiYXZhdGFyIiwiZ2V0QXZhdGFyVVJMIiwiZ2V0RGF0ZSIsImdldE1vbnRoIiwiZ2V0RnVsbFllYXIiLCJnZXRIb3VycyIsImdldE1pbnV0ZXMiLCJnZXRTZWNvbmRzIiwiZmxhZ3MiLCJoYXNQcmVtaXVtU3Vic2NyaXB0aW9uIiwiZW1haWwiLCJtZmFFbmFibGVkIiwibW9iaWxlIiwicGhvbmUiLCJ2ZXJpZmllZCIsIm5zZndBbGxvd2VkIiwicmVsYXRpb25zIiwiZnJpZW5kcyIsImlzRnJpZW5kIiwiaXNCbG9ja2VkIiwiaGlnaHRsaWdodEpTIiwiaGlnaGxpZ2h0IiwibWVzc2FnZU1vZHVsZTEiLCJtZXNzYWdlTW9kdWxlMiIsIkNvZGVDb250ZW50IiwibGlzdExhbmd1YWdlcyIsIl9faHRtbCIsImxhbmd1YWdlIiwibWFyZ2luQm90dG9tOCIsImZvcm1Nb2R1bGUiLCJzdGF0ZXMiLCJGb3JtU2VjdGlvbiIsImFsbENvbXBvbmVudHMiLCJjb21wIiwiY29tcE5hbWUiLCJjb21wUGF0aCIsInJlbmRlcnMiLCJDb21wb25lbnRQcmV2aWV3IiwidGFiIiwiQWxsUHJldmlld3MiLCJnZXRQcm9wcyIsInJlbmRlclByZXZpZXciLCJwYWRkaW5nIiwiYm9yZGVyUmFkaXVzIiwicmVuZGVyQ29kZSIsImdlbmVyYXRlQ29kZSIsImdldFN0ckZvclByb3AiLCJsYW5nIiwiU3RyaW5nIiwiJCR0eXBlb2YiLCJTeW1ib2wiLCJmb3IiLCJjb21wQ2F0ZWdvcnkiLCJwcm9wU3RyaW5ncyIsImNoaWxkcmVuUHJvcCIsInN0ciIsIm9wZW5UYWciLCJjbG9zZVRhZyIsInZpc2libGVLZXkiLCJwcm9wT2JqZWN0IiwiaXNMYXN0IiwiaXNGaXJzdCIsImNoaWxkcmVuRGF0YSIsImhlbHAiLCJzdWNjZXNzIiwic2V0U3RhdGUiLCJtYXJnaW5Cb3R0b20iLCJWMkNfUGx1Z2luQ2FyZCIsInNob3dTZXR0aW5ncyIsInNldEluaXRpYWxTdGF0ZSIsImhhc1NldHRpbmdzIiwiYWRkb24iLCJnZXRTZXR0aW5nc1BhbmVsIiwicmVsb2FkcyIsInRydXN0ZWQiLCJjbG9zZVNldHRpbmdzIiwicGFuZWxSZWYiLCJzZXR0aW5nc09wZW4iLCJjb21wb25lbnREaWRVcGRhdGUiLCJyZWZzIiwic2V0dGluZ3NwYW5lbCIsImlzSGlkZGVuIiwiY1RvcCIsInNjcm9sbFRvcCIsImNCb3R0b20iLCJlVG9wIiwib2Zmc2V0VG9wIiwiZUJvdHRvbSIsImNhcmROb2RlIiwidGhpc05vZGVPZmZzZXQiLCJjb250YWluZXJPZmZzZXQiLCJlbmRQb2ludCIsImdldFN0cmluZyIsInNldHRpbmdzQ29tcG9uZW50IiwicmVmIiwiWFN2ZyIsImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiwiYnVpbGRUaXRsZSIsIm5hbWVJbmRleCIsInZlcnNpb25JbmRleCIsImF1dGhvckluZGV4IiwicG9wTGF5ZXIiLCJtYWtlTGluayIsIm1ha2VCdXR0b24iLCJhY3Rpb24iLCJ1bm1vdW50ZWQiLCJsaW5rcyIsImludml0ZSIsInRlc3RlciIsImRvbmF0ZSIsInBhdHJlb24iLCJhdXRob3JJZCIsImF1dGhvckxpbmsiLCJpc1NjYW5uaW5nIiwiVG9vbHRpcCIsImFzY2VuZGluZyIsImlzUGx1Z2lucyIsInJldmVyc2UiLCJvbkFkZG9uQ2hhbmdlcyIsIm9wZW5Gb2xkZXIiLCJvcGVuUGF0aCIsInNob3VsZERlbGV0ZSIsImNvbmZpcm1EZWxldGUiLCJzb3J0T3B0aW9ucyIsImRpcmVjdGlvbnMiLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsImdldEFkZG9ucyIsInNvcnRlZEFkZG9ucyIsImIiLCJjYXAiLCJmaXJzdCIsInNlY29uZCIsImxvY2FsZUNvbXBhcmUiLCJyZW5kZXJDaGVja1VwZGF0ZXMiLCJaZXJlc1BsdWdpbkxpYnJhcnkiLCJQbHVnaW5VcGRhdGVzIiwiY2hlY2tBbGwiLCJ0b29sdGlwSXNTaG93aW5nIiwidG9vbHRpcCIsIm1hcmdpbkxlZnQiLCJjaGVja1VwZGF0ZUJ1dHRvbiIsIkVtdWxhdGVkVG9vbHRpcCIsImF0dGFjaEV2ZW50cyIsInJlZnJlc2hJY29uIiwiYWRkb25DYXJkcyIsImZpbGxSdWxlIiwiY2xpcFJ1bGUiLCJzdHJva2VMaW5lY2FwIiwic3Ryb2tlTGluZWpvaW4iLCJWMkNfQ2hlY2tib3giLCJjaGVja2JveEVsZW1lbnQiLCJjaGVja2JveCIsImNoZWNrYm94SW5uZXIiLCJTZWxlY3QiLCJkcm9wZG93biIsImNyZWF0ZVJlZiIsInNob3dNZW51IiwiaGlkZU1lbnUiLCJvcHQiLCJpc09wZW4iLCJTZWFyY2giLCJvbktleURvd24iLCJwbGFjZWhvbGRlciIsInN3aXRjaCIsIlYyQ19Db250ZW50Q29sdW1uIiwiY29udGVudE1vZHVsZSIsImNvbnRlbnRDb2x1bW4iLCJjb250ZW50Q29sdW1uRGVmYXVsdCIsIlYyQ19Dc3NFZGl0b3IiLCJsaW5lcyIsImRldGFjaGVkRWRpdG9yIiwiVjJDX0Nzc0VkaXRvckRldGFjaGVkIiwidXBkYXRlQ3NzIiwic2F2ZUNzcyIsImRldGFjaCIsImRldGFjaGVkIiwiZWRpdG9yIiwiYWNlIiwic2V0VGhlbWUiLCJzZXRNb2RlIiwic2V0U2hvd1ByaW50TWFyZ2luIiwic2V0Rm9udFNpemUiLCJkZXN0cm95IiwicHJldlByb3BzIiwicHJldlN0YXRlIiwidW5tb3VudENvbXBvbmVudEF0Tm9kZSIsImRldGFjaGVkUm9vdCIsImNvZGVNaXJyb3IiLCJsaW5lTnVtYmVycyIsIm1vZGUiLCJpbmRlbnRVbml0Iiwic2Nyb2xsYmFyU3R5bGUiLCJfY2NzcyIsImNjc3MiLCJ1cGRhdGVMaW5lQ291bnQiLCJsaW5lQ291bnQiLCJTZXR0aW5nc1RpdGxlIiwiQ2hlY2tib3giLCJib3JkZXJSaWdodCIsImJvcmRlckxlZnQiLCJmb250U2l6ZSIsImFyZyIsImdldFZhbHVlIiwiZHJvb3QiLCJfcm9vdCIsImluamVjdERldGFjaGVkUm9vdCIsInJvb3QiLCJpbmplY3RSb290IiwiQkRFcnJvckJvdW5kYXJ5IiwiaGFzRXJyb3IiLCJjb21wb25lbnREaWRDYXRjaCIsIkRlbGV0ZSIsIkRvd25BcnJvdyIsIkVkaXQiLCJtYXJnaW5Nb2R1bGUiLCJtYXJnaW5Ub3A2MCIsIlYyQ19QcmVzZW5jZVNldHRpbmdzTW9kdWxlcyIsInByZXZpZXciLCJpc2ZldGNoaW5nIiwiYXNzZXRDb21wb25lbnRzIiwidXBkYXRlV2hlbkZldGNoZWQiLCJkZWZhdWx0U2V0dGluZyIsIlJQQ1Byb3BzIiwiYXNzZXQiLCJ1cGRhdGVQcmV2aWV3Iiwib3B0aW9uc0NvbXBvbmVudHMiLCJvaGdvZG9oZnVjayIsIl9vcHRpb25zQ29tcG9uZW50cyIsImFycmF5IiwiaW5wdXRUZXh0TW9kdWxlcyIsIklucHV0VGV4dCIsInJlbW92ZUtleWJpbmQiLCJfaG9yaXpvbnRhbCIsImlucHV0TWluaSIsInNpemUxNiIsInNpemUyMCIsImlucHV0IiwibGFzdEVkaXRlZCIsImlzVGltaW5nIiwicm93TW9kdWxlIiwiZmxleE1vZHVsZSIsImlucHV0TW9kdWxlIiwic2l6ZU1vZHVsZTIiLCJyb3ciLCJmbGV4Q2hpbGQiLCJJbnB1dE51bWJlck1vZHVsZXMiLCJJbnB1dE51bWJlciIsImNvbG9yVHJhbnNwYXJlbnQiLCJzZXRWYWx1ZSIsImNsaXBib2FyZCIsIklucHV0Q2hvaWNlTW9kdWxlcyIsIklucHV0Q2hvaWNlIiwiRGl2aWRlck1vZHVsZXMiLCJEaXZpZGVyIiwiZGl2aWRlciIsImRpdmlkZXJEZWZhdWx0IiwiRGlzY29yZEJ1dHRvbiIsIlJwY1ByZXZpZXciLCJhY3RpdmUiLCJjaGFuZ2VUYWIiLCJhbmNpZW50VGFiIiwic2V0QWN0aXZlIiwiZmxleCIsInJwYyIsImlzQWN0aXZlIiwiUHJvZmlsZSIsIlBvcG91dCIsIlRhYiIsImVtcHR5Q2xhc3NlcyIsIlByZXNlbmNlRXJyb3JDYXRjaGVyIiwiZXJySW5mbyIsImVtcHR5U3RhdGVJbWFnZSIsImVtcHR5U3RhdGUiLCJlbXB0eVN0YXRlSGVhZGVyIiwiZW1wdHlTdGF0ZVN1YnRleHQiLCJwb3BvdXRNb2R1bGVzIiwiVXNlclBvcG91dENvbXBvbmVudCIsIlBvcG91dFByb3BzIiwiVXNlclBvcG91dCIsInJlbmRlcjEiLCJjaGFubmVsSWQiLCJkaXNhYmxlVXNlclByb2ZpbGVMaW5rIiwiX1VzZXJQb3BvdXQiLCJwb3BvdXQiLCJleGNsdWRlUHJvcGVydGllcyIsInByb2ZpbGVNb2R1bGVzIiwiVXNlclByb2ZpbGVDb21wb25lbnQiLCJQcm9maWxlUHJvcHMiLCJjb25uZWN0ZWRQcm9maWxlU3RvcmUiLCJVc2VyUHJvZmlsZSIsInJlbmRlcjIiLCJyZW5kZXIzIiwicmVuZGVyNCIsInByb2ZpbGUiLCJjaGFuZ2VDYXRlZ29yeSIsInNlYXJjaEtleURvd24iLCJjaGVja0Nvbm5lY3Rpb24iLCJjb25uZWN0IiwiR3VpbGRTdG9yZSIsIkF2YXRhckRlZmF1bHRzIiwiU29ydGVkR3VpbGRTdG9yZSIsInNlbGVjdGVkQ2F0ZWdvcnkiLCJsb2FkaW5nIiwic2VydmVycyIsImNvbm5lY3Rpb24iLCJmZXRjaCIsInNlcnZlciIsImpvaW5lZCIsImVuZCIsInRlcm0iLCJjYXRlZ29yeUJ1dHRvbnMiLCJ0b3RhbCIsInNidiIsImNvbnRlbnRTY3JvbGxlciIsInNlcnZlckNhcmQiLCJwaW5uZWQiLCJhY2NlcHRJbnZpdGUiLCJpbnZpdGVfY29kZSIsImpvaW5FbmRQb2ludCIsImlkZW50aWZpZXIiLCJjcmVkZW50aWFscyIsIndpbmRvd09wdGlvbnMiLCJyb3VuZCIsInNjcmVlblgiLCJzY3JlZW5ZIiwiam9pbldpbmRvdyIsIkJyb3dzZXJXaW5kb3ciLCJ3ZWJDb250ZW50cyIsImxvYWRVUkwiLCJyZXNpemFibGUiLCJtYXhpbWl6YWJsZSIsIm1pbmltaXphYmxlIiwiYWx3YXlzT25Ub3AiLCJjZW50ZXIiLCJ3ZWJQcmVmZXJlbmNlcyIsIm5vZGVJbnRlZ3JhdGlvbiIsImJkU2VydmVyIiwib25saW5lIiwibWVtYmVycyIsImljb25VcmwiLCJuYXRpdmVqb2luIiwic2VydmVyMiIsImd1aWxkTGlzdCIsImdldEZsYXR0ZW5lZEd1aWxkSWRzIiwiZGVmYXVsdExpc3QiLCJERUZBVUxUX0FWQVRBUlMiLCJTZXJ2ZXJDYXJkIiwiZmFsbGJhY2siLCJmbG9vciIsImNvbm5lY3RFbmRQb2ludCIsInJlc3BvbnNlIiwiU2lkZWJhclZpZXciLCJ0b29scyIsIlRvb2xzIiwiVGFiQmFyU2VwYXJhdG9yIiwic2VhcmNoSW5wdXQiLCJUYWJCYXJIZWFkZXIiLCJUYWJCYXJJdGVtIiwibWF4TGVuZ3RoIiwic2VhcmNoaW5wdXQiLCJub3RDb25uZWN0ZWQiLCJjb2x1bW5Nb2R1bGUiLCJtaW5IZWlnaHQiLCJsaW5lSGVpZ2h0IiwiVjJDX1NlcnZlckNhcmQiLCJpbWFnZUVycm9yIiwiY2FyZE1vZHVsZSIsImNhcmQiLCJjYXJkUHJpbWFyeSIsIl9ob3Jpem9udGFsUmV2ZXJzZSIsIndyYXBNb2R1bGUiLCJub1dyYXAiLCJzdHJlYW1lck1vZGVFbmFibGVkIiwib25FcnJvciIsImhhbmRsZUVycm9yIiwiZHJhZ2dhYmxlIiwiaG9yaXpvbnRhbCIsIlYyQ19TaWRlYmFyVmlldyIsIlNjcm9sbGVyIiwiZmFkZSIsImRhcmsiLCJWMkNfUmVsb2FkSWNvbiIsInhtbG5zIiwiVjJDX1Njcm9sbGVyIiwic2Nyb2xsZXJNb2R1bGUxIiwic2Nyb2xsZXJIb3Jpem9udGFsIiwic2Nyb2xsZXJNb2R1bGUyIiwic2lkZWJhclJlZ2lvblNjcm9sbGVyIiwid3JhcHBlckNsYXNzIiwic2Nyb2xsZXJGYWRlIiwic2Nyb2xsZXJDbGFzcyIsImNvbnRlbnRSZWdpb25TY3JvbGxlciIsImNvbnRlbnRSZWdpb25TY3JvbGxlcldyYXAiLCJ0aGVtZUdob3N0Iiwic2Nyb2xsZXJUcmFjayIsIlYyQ19TZWN0aW9uZWRTZXR0aW5nc1BhbmVsIiwiU2V0dGluZ3NHcm91cCIsIlYyQ19TZXR0aW5nc0dyb3VwIiwiYnV0dG9uQ29tcG9uZW50IiwiVjJDX1NldHRpbmdzVGl0bGUiLCJjbGFzc25hbWVzIiwiZ2V0Q2xhc3NOYW1lIiwiU3dpdGNoSXRlbSIsImJldGEiLCJ1c2VyU2V0dGluZ3NWb2ljZSIsIlYyQ19UYWJCYXJIZWFkZXIiLCJWMkNfVGFiQmFySXRlbSIsIlYyQ19UYWJCYXJTZXBhcmF0b3IiLCJWMkNfVG9vbHMiLCJ0b29sc01vZHVsZSIsInRvb2xzQ29udGFpbmVyIiwiY29udGFpbmVyTW9kdWxlIiwiY2xvc2VCdXR0b24iLCJjbG9zZUJ1dHRvbkJvbGQiLCJrZXliaW5kIiwia2V5YmluZEJvbGQiLCJUb29sdGlwQ2xhc3NlcyIsImdldFRvb2x0aXBDbGFzc2VzIiwiVG9vbHRpcExheWVycyIsImdldFRvb2x0aXBMYXllcnMiLCJnZXRDbGFzcyIsInNpZGVPckNvbG9yIiwidXBwZXJDYXNlIiwidG9vbHRpcENsYXNzIiwiY2xhc3NFeGlzdHMiLCJ0b1B4IiwicHJldmVudEZsaXAiLCJ0b29sdGlwRWxlbWVudCIsImxhYmVsRWxlbWVudCIsInRvb2x0aXBDb250ZW50IiwicG9pbnRlckVsZW1lbnQiLCJ0b29sdGlwUG9pbnRlciIsInBvcG91dHMiLCJjYW5TaG93QWJvdmUiLCJjYW5TaG93QmVsb3ciLCJjYW5TaG93TGVmdCIsImNhblNob3dSaWdodCIsIl9jbGFzc05hbWUiLCJzaG93QWJvdmUiLCJzaG93QmVsb3ciLCJzaG93TGVmdCIsInNob3dSaWdodCIsImNlbnRlckhvcml6b250YWxseSIsImNlbnRlclZlcnRpY2FsbHkiLCJub2RlY2VudGVyIiwiZmluZERPTU5vZGUiLCJWMkNfWFN2ZyJdLCJtYXBwaW5ncyI6Ijs7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7OztRQUdBO1FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNsRkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQU8sTUFBTUEscUJBQXFCLEdBQUcsU0FB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QUFFO0FBQUN5ZSxhQUFLLEVBQUUsTUFBUjtBQUFnQm9NLGNBQU0sRUFBRTtBQUF4QjtBQUFuRSxLQUZHLEVBR0gvMkIsbURBQUksQ0FBQ3luQixLQUFMLENBQVd2bUIsYUFBWCxDQUNJLEdBREosRUFFSTtBQUFDQyxlQUFTLEVBQUUsWUFBWjtBQUEwQisrQixVQUFJLEVBQUUsTUFBaEM7QUFBd0M0ZSxjQUFRLEVBQUU7QUFBbEQsS0FGSixFQUdJOStDLG1EQUFJLENBQUN5bkIsS0FBTCxDQUFXdm1CLGFBQVgsQ0FBeUIsTUFBekIsRUFBaUM7QUFBQ3k3QixPQUFDLEVBQUU7QUFBSixLQUFqQyxDQUhKLEVBSUkzOEIsbURBQUksQ0FBQ3luQixLQUFMLENBQVd2bUIsYUFBWCxDQUF5QixNQUF6QixFQUFpQztBQUFDQyxlQUFTLEVBQUUsTUFBWjtBQUFvQisrQixVQUFJLEVBQUUsU0FBMUI7QUFBcUN2RCxPQUFDLEVBQUU7QUFBeEMsS0FBakMsQ0FKSixDQUhHLENBQVA7QUFVSDs7QUFoQnFELEM7Ozs7Ozs7Ozs7O0FDRjFELG1DOzs7Ozs7Ozs7OztBQ0FBLHFDOzs7Ozs7Ozs7OztBQ0FBLG1DOzs7Ozs7Ozs7OztBQ0FBLCtCOzs7Ozs7Ozs7OztBQ0FBLG1DOzs7Ozs7Ozs7OztBQ0FBLHVDOzs7Ozs7Ozs7OztBQ0FBLGlDIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvaW5kZXguanNcIik7XG4iLCJleHBvcnQgY29uc3QgbWluaW11bURpc2NvcmRWZXJzaW9uID0gXCIwLjAuMzA3XCI7XHJcbmV4cG9ydCBjb25zdCBjdXJyZW50RGlzY29yZFZlcnNpb24gPSAod2luZG93LkRpc2NvcmROYXRpdmUgJiYgd2luZG93LkRpc2NvcmROYXRpdmUucmVtb3RlQXBwICYmIHdpbmRvdy5EaXNjb3JkTmF0aXZlLnJlbW90ZUFwcC5nZXRWZXJzaW9uICYmIHdpbmRvdy5EaXNjb3JkTmF0aXZlLnJlbW90ZUFwcC5nZXRWZXJzaW9uKCkpIHx8IFwiMC4wLjMwN1wiO1xyXG5leHBvcnQgY29uc3QgbWluU3VwcG9ydGVkVmVyc2lvbiA9IFwiMC4zLjBcIjtcclxuZXhwb3J0IGNvbnN0IGJiZFZlcnNpb24gPSBcIjAuMy41XCI7XHJcbmV4cG9ydCBjb25zdCBiYmRDaGFuZ2Vsb2cgPSB7XHJcbiAgICBkZXNjcmlwdGlvbjogXCJCaWcgdGhpbmdzIGFyZSBjb21pbmcuXCIsXHJcbiAgICBjaGFuZ2VzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aXRsZTogXCJCdWcgRml4ZXNcIixcclxuICAgICAgICAgICAgdHlwZTogXCJmaXhlZFwiLFxyXG4gICAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICAgICAgXCJTb21lIGZpeGVzIHJlbGF0ZWQgdG8gc2hvd2luZyBtb2RhbHMgaW4gdGhlIGBCZEFwaWAuXCIsXHJcbiAgICAgICAgICAgICAgICBcIkZpeGVkIHRoZSBvcGVuIGZvbGRlciBidXR0b25zIGZvciBwbHVnaW5zIGFuZCB0aGVtZXNcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgXVxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHNldHRpbmdzID0ge1xyXG4gICAgXCJDdXN0b20gY3NzIGxpdmUgdXBkYXRlXCI6ICAgICB7aWQ6IFwiYmRhLWNzcy0wXCIsIGluZm86IFwiXCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogdHJ1ZSwgIGNhdDogXCJjb3JlXCJ9LFxyXG4gICAgXCJDdXN0b20gY3NzIGF1dG8gdWRwYXRlXCI6ICAgICB7aWQ6IFwiYmRhLWNzcy0xXCIsIGluZm86IFwiXCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogdHJ1ZSwgIGNhdDogXCJjb3JlXCJ9LFxyXG4gICAgXCJCZXR0ZXJEaXNjb3JkIEJsdWVcIjogICAgICAgICB7aWQ6IFwiYmRhLWdzLWJcIiwgIGluZm86IFwiUmVwbGFjZSBEaXNjb3JkIGJsdWUgd2l0aCBCRCBCbHVlXCIsICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogZmFsc2UsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwifSxcclxuXHJcbiAgICAvKiBDb3JlICovXHJcbiAgICAvKiA9PT09PT0gKi9cclxuICAgIFwiUHVibGljIFNlcnZlcnNcIjogICAgICAgICAgICAge2lkOiBcImJkYS1ncy0xXCIsICBpbmZvOiBcIkRpc3BsYXkgcHVibGljIHNlcnZlcnMgYnV0dG9uXCIsICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJNaW5pbWFsIE1vZGVcIjogICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTJcIiwgIGluZm86IFwiSGlkZSBlbGVtZW50cyBhbmQgcmVkdWNlIHRoZSBzaXplIG9mIGVsZW1lbnRzLlwiLCAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIlZvaWNlIE1vZGVcIjogICAgICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtNFwiLCAgaW5mbzogXCJPbmx5IHNob3cgdm9pY2UgY2hhdFwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiSGlkZSBDaGFubmVsc1wiOiAgICAgICAgICAgICAge2lkOiBcImJkYS1ncy0zXCIsICBpbmZvOiBcIkhpZGUgY2hhbm5lbHMgaW4gbWluaW1hbCBtb2RlXCIsICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJEYXJrIE1vZGVcIjogICAgICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTVcIiwgIGluZm86IFwiTWFrZSBjZXJ0YWluIGVsZW1lbnRzIGRhcmsgYnkgZGVmYXVsdCh3aXApXCIsICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIlZvaWNlIERpc2Nvbm5lY3RcIjogICAgICAgICAgIHtpZDogXCJiZGEtZGMtMFwiLCAgaW5mbzogXCJEaXNjb25uZWN0IGZyb20gdm9pY2Ugc2VydmVyIHdoZW4gY2xvc2luZyBEaXNjb3JkXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiMjQgSG91ciBUaW1lc3RhbXBzXCI6ICAgICAgICAge2lkOiBcImJkYS1ncy02XCIsICBpbmZvOiBcIlJlcGxhY2UgMTJociB0aW1lc3RhbXBzIHdpdGggcHJvcGVyIG9uZXNcIiwgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJDb2xvcmVkIFRleHRcIjogICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTdcIiwgIGluZm86IFwiTWFrZSB0ZXh0IGNvbG9yIHRoZSBzYW1lIGFzIHJvbGUgY29sb3JcIiwgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIk5vcm1hbGl6ZSBDbGFzc2VzXCI6ICAgICAgICAgIHtpZDogXCJmb3JrLXBzLTRcIiwgaW5mbzogXCJBZGRzIHN0YWJsZSBjbGFzc2VzIHRvIGVsZW1lbnRzIHRvIGhlbHAgdGhlbWVzLiAoZS5nLiBhZGRzIC5kYS1jaGFubmVscyB0byAuY2hhbm5lbHMtSWUybDZBKVwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcblxyXG4gICAgLyogQ29udGVudCAqL1xyXG4gICAgXCJDb250ZW50IEVycm9yIE1vZGFsXCI6ICAgICAgICB7aWQ6IFwiZm9yay1wcy0xXCIsIGluZm86IFwiU2hvd3MgYSBtb2RhbCB3aXRoIHBsdWdpbi90aGVtZSBlcnJvcnNcIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwifSxcclxuICAgIFwiU2NhbiBQbHVnaW5zXCI6ICAgICAgICAgICAgICAge2lkOiBcImZvcmstcHMtNlwiLCBpbmZvOiBcIlNjYW4gcGx1Z2lucyBmb3IgYW55IHRocmVhdCB0aGF0IGNhbiBiZSBoaWRkZW4gaW5zaWRlLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxyXG4gICAgXCJTaG93IFRvYXN0c1wiOiAgICAgICAgICAgICAgICB7aWQ6IFwiZm9yay1wcy0yXCIsIGluZm86IFwiU2hvd3MgYSBzbWFsbCBub3RpZmljYXRpb24gZm9yIGltcG9ydGFudCBpbmZvcm1hdGlvblwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxyXG4gICAgXCJTY3JvbGwgVG8gU2V0dGluZ3NcIjogICAgICAgICB7aWQ6IFwiZm9yay1wcy0zXCIsIGluZm86IFwiQXV0by1zY3JvbGxzIHRvIGEgcGx1Z2luJ3Mgc2V0dGluZ3Mgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQgKG9ubHkgaWYgb3V0IG9mIHZpZXcpXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcbiAgICBcIkF1dG9tYXRpYyBMb2FkaW5nXCI6ICAgICAgICAgIHtpZDogXCJmb3JrLXBzLTVcIiwgaW5mbzogXCJBdXRvbWF0aWNhbGx5IGxvYWRzLCByZWxvYWRzLCBhbmQgdW5sb2FkcyBwbHVnaW5zIGFuZCB0aGVtZXNcIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwifSxcclxuICAgIFwiRW5hYmxlIEVkaXQgQnV0dG9uXCI6ICAgICAgICAge2lkOiBcImZvcmstcHMtN1wiLCBpbmZvOiBcIkVuYWJsZSBhbiBFZGl0IEJ1dHRvbiBvbiB0aGUgcGx1Z2luIGFuZCB0aGVtZSBwYW5lbC5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwifSxcclxuICAgIFwiVGhlbWVzIGluIFBvcG91dCBXaW5kb3dcIjogICAge2lkOiBcImxpZ2h0Y29yZC05XCIsIGluZm86IFwiRW5hYmxlIHRoZW1lcyBpbiBQb3BvdXQgV2luZG93LiAoRm9yIGV4YW1wbGUsIHdoZW4gZGV0YWNoaW5nIHNjcmVlbnNoYXJlLilcIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwiLCBleHBlcmltZW50YWw6IHRydWV9LFxyXG5cclxuICAgIC8qIERldmVsb3BlciAqL1xyXG4gICAgXCJEZXZlbG9wZXIgTW9kZVwiOiAgICAgICAgIFx0ICB7aWQ6IFwiYmRhLWdzLThcIiwgaW5mbzogXCJEZXZlbG9wZXIgTW9kZSBUb2dnbGVcIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImRldmVsb3BlciBzZXR0aW5nc1wifSxcclxuICAgIFwiQ29weSBTZWxlY3RvclwiOlx0XHRcdCAge2lkOiBcImZvcmstZG0tMVwiLCBpbmZvOiBcIkFkZHMgYSBcXFwiQ29weSBTZWxlY3RvclxcXCIgb3B0aW9uIHRvIGNvbnRleHQgbWVudXMgd2hlbiBkZXZlbG9wZXIgbW9kZSBpcyBhY3RpdmVcIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImRldmVsb3BlciBzZXR0aW5nc1wifSxcclxuXHJcbiAgICAvKiogTGlnaHRjb3JkICovXHJcbiAgICBcIkRpc2FibGUgQmV0dGVyRGlzY29yZFwiOiAgICAgIHtpZDogXCJiZC1kaXNhYmxlXCIsICBpbmZvOiBcIkRpc2FibGUgQmV0dGVyZGlzY29yZCAocGx1Z2lucywgdGhlbWVzLCBldGMpIChOb3QgaW1wbGVtZW50ZWQpLlwiLCBpbXBsZW1lbnRlZDogZmFsc2UsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJCbHVyIFBlcnNvbmFsIEluZm9ybWF0aW9uXCI6ICB7aWQ6IFwibGlnaHRjb3JkLTZcIiwgaW5mbzogXCJCbHVyIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbnMgbGlrZSBlbWFpbCwgcGF5bWVudCBpbmZvcyBhbmQgbW9yZS5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJDYWxsaW5nIFJpbmcgQmVhdFwiOiAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTJcIiwgaW5mbzogXCJFbmFibGUgRGlzY29yZCdzIHNwZWNpYWwgY2FsbGluZyBiZWF0LlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcbiAgICBcIkRldmVsb3BlciBPcHRpb25zXCI6ICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtMVwiLCBpbmZvOiBcIkVuYWJsZSBEaXNjb3JkJ3MgJiBMaWdodGNvcmQncyBJbnRlcm5hbCBEZXZlbG9wZXIgT3B0aW9ucy4gVGhpcyBhbGxvdyB0aGUgXFxcIkV4cGVyaW1lbnRzXFxcIiB0YWIsIHRoZSBcXFwiRGV2ZWxvcGVyIE9wdGlvbnNcXFwiIHRhYiBhbmQgdGhlIFxcXCJMaWdodGNvcmQgQXBpXFxcIiBzZWN0aW9uLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcbiAgICBcIkFkIEJsb2NrXCI6ICAgICAgICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtNFwiLCBpbmZvOiBcIkJsb2NrIGFueSBCT1QgdGhhdCBkbXMgeW91IHdpdGggYW4gaW52aXRlIGxpbmsuIEV2ZW4gaW4gYW4gZW1iZWQuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiRW5hYmxlIExpZ2h0Y29yZCBTZXJ2ZXJzXCI6ICAge2lkOiBcImxpZ2h0Y29yZC01XCIsIGluZm86IFwiRW5hYmxlIExpZ2h0Y29yZCdzIHNlcnZlcnMuIERpc2FibGluZyB0aGlzIHdpbGwgZGlzYWJsZSBjdXN0b20gYmFkZ2VzLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcbiAgICBcIkRpc2FibGUgdHlwaW5nXCI6ICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtN1wiLCBpbmZvOiBcIkRvbid0IGxldCBvdGhlciBzZWUgeW91J3JlIHR5cGluZy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJMaWdodGNvcmQgVGFic1wiOiAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLThcIiwgaW5mbzogXCJBbGxvd3MgeW91IHRvIGxhdW5jaCBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgTGlnaHRjb3JkIGluIHRoZSBzYW1lIHdpbmRvdy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCIsIGV4cGVyaW1lbnRhbDogdHJ1ZX0sXHJcbiAgICBcIlVzZSBOb3RpZmljYXRpb24gU2hpbVwiOiAgICAgIHtpZDogXCJsaWdodGNvcmQtMTBcIiwgaW5mbzogXCJCYXNpY2FsbHkgZG9uJ3QgdXNlIFdpbmRvd3MncyBOb3RpZmljYXRpb25zLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBwcm9jZXNzLnBsYXRmb3JtICE9PSBcIndpbjMyXCIsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCIsIGV4cGVyaW1lbnRhbDogZmFsc2V9LFxyXG5cclxuICAgIC8qKiBMaWdodGNvcmQgV2luZG93ICovXHJcbiAgICBcIkFsd2F5cy1vbi1Ub3BcIjogICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtM1wiLCBpbmZvOiBcIkVuYWJsZSB0aGUgd2luZG93J3MgQWx3YXlzLW9uLVRvcCBtb2RlLCB3aGVyZSBMaWdodGNvcmQgc3RheXMgb24gdG9wIG9mIG90aGVyIGFwcGxpY2F0aW9ucy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiV2luZG93XCJ9LFxyXG4gICAgXCJObyBXaW5kb3cgQm91bmRzXCI6ICAgICAgICAgICB7aWQ6IFwibm9fd2luZG93X2JvdW5kXCIsIGluZm86IFwiRGlzYWJsZSBXaW5kb3cgQm91bmRzLiBDYW4gYmUgdXNlZnVsIGlmIHlvdSB1c2UgYSB3aW5kb3cgbWFuYWdlci5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogcHJvY2Vzcy5wbGF0Zm9ybSAhPT0gXCJsaW51eFwiLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIldpbmRvd1wifSxcclxuICAgIFwiRW5hYmxlIEdsYXNzdHJvblwiOiAgICAgICAgICAge2lkOiBcImVuYWJsZV9nbGFzc3Ryb25cIiwgaW5mbzogXCJFbmFibGUgR2xhc3N0cm9uLiBJZiB5b3UncmUgbm90IHVzaW5nIHRyYW5zcGFyZW50IHRoZW1lcywgdGhpcyBjYW4gcmVkdWNlIGxhZy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiV2luZG93XCJ9LFxyXG4gICAgXHJcbiAgICAvKiogUmljaFByZXNlbmNlICovXHJcbiAgICBcIkVuYWJsZVwiOiAgICAgICAgICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiLCBpbmZvOiBcIkVuYWJsZSBSaWNoUHJlc2VuY2UgYmVsb3cuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwic3RhdHVzXCJ9XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZGVmYXVsdENvb2tpZSA9IHtcclxuICAgIFwiYmRhLWdzLTFcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWdzLTJcIjogZmFsc2UsXHJcbiAgICBcImJkYS1ncy0zXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZ3MtNFwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWdzLTVcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWdzLTZcIjogZmFsc2UsXHJcbiAgICBcImJkYS1ncy03XCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZ3MtOFwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWVzLTBcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWVzLTFcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWVzLTJcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWVzLTRcIjogZmFsc2UsXHJcbiAgICBcImJkYS1lcy02XCI6IHRydWUsXHJcbiAgICBcImJkYS1lcy03XCI6IHRydWUsXHJcbiAgICBcImJkYS1ncy1iXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZXMtOFwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZGMtMFwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWNzcy0wXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtY3NzLTFcIjogZmFsc2UsXHJcbiAgICBcImJkYS1lcy05XCI6IHRydWUsXHJcbiAgICBcImZvcmstZG0tMVwiOiBmYWxzZSxcclxuICAgIFwiZm9yay1wcy0xXCI6IHRydWUsXHJcbiAgICBcImZvcmstcHMtMlwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXBzLTNcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1wcy00XCI6IHRydWUsXHJcbiAgICBcImZvcmstcHMtNVwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXBzLTZcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1wcy03XCI6IGZhbHNlLFxyXG4gICAgXCJmb3JrLWVzLTJcIjogZmFsc2UsXHJcbiAgICBcImZvcmstZXMtM1wiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXdwLTFcIjogZmFsc2UsXHJcbiAgICBcImZvcmstd3AtMlwiOiBmYWxzZSxcclxuICAgIFwiZm9yay1iZXRhXCI6IHRydWUsXHJcbiAgICBcImxpZ2h0Y29yZC0xXCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtMlwiOiB0cnVlLFxyXG4gICAgXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiOiBmYWxzZSxcclxuICAgIFwibGlnaHRjb3JkLTNcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC00XCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtNVwiOiB0cnVlLFxyXG4gICAgXCJsaWdodGNvcmQtNlwiOiB0cnVlLFxyXG4gICAgXCJsaWdodGNvcmQtN1wiOiBmYWxzZSxcclxuICAgIFwibGlnaHRjb3JkLThcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC05XCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtMTBcIjogZmFsc2UsXHJcbiAgICBcIm5vX3dpbmRvd19ib3VuZFwiOiBmYWxzZSxcclxufTtcclxuXHJcblxyXG5leHBvcnQgY29uc3Qgc2V0dGluZ3NDb29raWUgPSB7fTtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXR0aW5nc1JQQyA9IHt9O1xyXG5leHBvcnQgY29uc3QgZGVmYXVsdFJQQyA9IHtcclxuICAgIFwibmFtZVwiOiBcIkxpZ2h0Y29yZFwiLFxyXG4gICAgXCJhcHBsaWNhdGlvbl9pZFwiOiBcIjcxMTQxNjk1NzcxODc1NzQxOFwiLFxyXG4gICAgXCJzdGF0ZVwiOiBcIkxpZ2h0Y29yZCBDbGllbnRcIixcclxuICAgIFwiZGV0YWlsc1wiOiBcIkJyb3dzaW5nIERpc2NvcmRcIixcclxuICAgIFwidGltZXN0YW1wcy5zdGFydFwiOiBEYXRlLm5vdygpLFxyXG4gICAgXCJhc3NldHMuc21hbGxcIjogbnVsbCxcclxuICAgIFwiYXNzZXRzLmxhcmdlXCI6IFwiNzEyMzIzODIxMDM3NjgyNzkxXCJcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGJkcGx1Z2luRXJyb3JzID0gW107XHJcbmV4cG9ydCBjb25zdCBiZHRoZW1lRXJyb3JzID0gW107IC8vIGRlZmluZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcclxuXHJcbmV4cG9ydCBjb25zdCBiZENvbmZpZyA9IE9iamVjdC5jcmVhdGUoQmV0dGVyRGlzY29yZENvbmZpZyk7XHJcblxyXG5leHBvcnQgY29uc3QgYmR0aGVtZXMgPSB7fTtcclxuZXhwb3J0IGNvbnN0IGJkcGx1Z2lucyA9IHt9O1xyXG5cclxuZXhwb3J0IGNvbnN0IHBsdWdpbkNvb2tpZSA9IHt9O1xyXG5leHBvcnQgY29uc3QgdGhlbWVDb29raWUgPSB7fTsiLCJpbXBvcnQgbG9jYWxTdG9yYWdlRml4IGZyb20gXCIuL2xvY2FsU3RvcmFnZUZpeFwiO1xyXG5pbXBvcnQgbG9hZGluZ0ljb24gZnJvbSBcIi4vbG9hZGluZ0ljb25cIjtcclxubG9jYWxTdG9yYWdlRml4KCk7XHJcbmxvYWRpbmdJY29uKCk7XHJcblxyXG5jb25zdCBkZXByZWNhdGVHbG9iYWwgPSAoa2V5LCB2YWx1ZSkgPT4ge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywga2V5LCB7XHJcbiAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICBVdGlscy53YXJuKFwiRGVwcmVjYXRlZCBHbG9iYWxcIiwgYFwiJHtrZXl9XCIgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy4gUGxlYXNlIG9ubHkgdXNlIEJkQXBpLmApO1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7ICBcclxufTtcclxuXHJcblxyXG5pbXBvcnQgKiBhcyBHbG9iYWxzIGZyb20gXCIuLzBnbG9iYWxzXCI7XHJcblxyXG5jb25zdCBnbG9iYWxLZXlzID0gT2JqZWN0LmtleXMoR2xvYmFscyk7XHJcbmZvciAoY29uc3Qga2V5IG9mIGdsb2JhbEtleXMpIGRlcHJlY2F0ZUdsb2JhbChrZXksIEdsb2JhbHNba2V5XSk7XHJcblxyXG5cclxuaW1wb3J0IEJkQXBpIGZyb20gXCIuL21vZHVsZXMvYmRBcGlcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgcGx1Z2luTW9kdWxlIGZyb20gXCIuL21vZHVsZXMvcGx1Z2luTW9kdWxlXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi9tb2R1bGVzL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi9tb2R1bGVzL3V0aWxzXCI7XHJcbmltcG9ydCBCREV2ZW50cyBmcm9tIFwiLi9tb2R1bGVzL2JkRXZlbnRzXCI7XHJcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL21vZHVsZXMvc2V0dGluZ3NQYW5lbFwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL21vZHVsZXMvZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCBDbGFzc05vcm1hbGl6ZXIgZnJvbSBcIi4vbW9kdWxlcy9jbGFzc05vcm1hbGl6ZXJcIjtcclxuXHJcbmRlcHJlY2F0ZUdsb2JhbChcIkJEVjJcIiwgQkRWMik7XHJcbmRlcHJlY2F0ZUdsb2JhbChcInBsdWdpbk1vZHVsZVwiLCBwbHVnaW5Nb2R1bGUpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJ0aGVtZU1vZHVsZVwiLCB0aGVtZU1vZHVsZSk7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIlV0aWxzXCIsIFV0aWxzKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwiQkRFdmVudHNcIiwgQkRFdmVudHMpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJzZXR0aW5nc1BhbmVsXCIsIHNldHRpbmdzUGFuZWwpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJEYXRhU3RvcmVcIiwgRGF0YVN0b3JlKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwiQ29udGVudE1hbmFnZXJcIiwgQ29udGVudE1hbmFnZXIpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJDbGFzc05vcm1hbGl6ZXJcIiwgQ2xhc3NOb3JtYWxpemVyKTtcclxuXHJcbndpbmRvdy5CZEFwaSA9IEJkQXBpO1xyXG5cclxuaW1wb3J0IENvcmUgZnJvbSBcIi4vbW9kdWxlcy9jb3JlXCI7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIm1haW5Db3JlXCIsIENvcmUpO1xyXG5cclxuLy8gVE9ETzogQ2hhbmdlIEluaXQgbW9kZSBhbmQgc3RvcCB1c2luZyBDb3JlV3JhcHBlci5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29yZVdyYXBwZXIge1xyXG4gICAgY29uc3RydWN0b3IoYmRDb25maWcsIG1ldGhvZHMpIHtcclxuICAgICAgICBDb3JlLnNldENvbmZpZyhiZENvbmZpZyk7XHJcbiAgICAgICAgQ29yZS5zZXRNZXRob2RzKG1ldGhvZHMpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKSB7XHJcbiAgICAgICAgLy8gZGVwcmVjYXRlR2xvYmFsKFwibWFpbkNvcmVcIiwgdGhpcy5tYWluQ29yZSk7XHJcbiAgICAgICAgQ29yZS5pbml0KCk7XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgZGVmYXVsdCAoKSA9PiB7XHJcbiAgICBjb25zdCB2MkxvYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICB2MkxvYWRlci5jbGFzc05hbWUgPSBcImJkLWxvYWRlcnYyXCI7XHJcbiAgICB2MkxvYWRlci50aXRsZSA9IFwiQmFuZGFnZWRCRCBpcyBsb2FkaW5nLi4uXCI7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHYyTG9hZGVyKTtcclxufTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IGNvbnRlbnRXaW5kb3dHZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEhUTUxJRnJhbWVFbGVtZW50LnByb3RvdHlwZSwgXCJjb250ZW50V2luZG93XCIpLmdldDtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShIVE1MSUZyYW1lRWxlbWVudC5wcm90b3R5cGUsIFwiY29udGVudFdpbmRvd1wiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRXaW5kb3cgPSBSZWZsZWN0LmFwcGx5KGNvbnRlbnRXaW5kb3dHZXR0ZXIsIHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJveHkoY29udGVudFdpbmRvdywge1xyXG4gICAgICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbihvYmosIHByb3ApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJsb2NhbFN0b3JhZ2VcIikgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24ob2JqLCBwcm9wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT09IFwibG9jYWxTdG9yYWdlXCIpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IG9ialtwcm9wXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdmFsLmJpbmQob2JqKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBQcmV2ZW50IGludGVyY2VwdGlvbiBieSBwYXRjaGluZyBSZWZsZWN0LmFwcGx5IGFuZCBGdW5jdGlvbi5wcm90b3R5cGUuYmluZFxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlZmxlY3QsIFwiYXBwbHlcIiwge3ZhbHVlOiBSZWZsZWN0LmFwcGx5LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2V9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdW5jdGlvbi5wcm90b3R5cGUsIFwiYmluZFwiLCB7dmFsdWU6IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2V9KTtcclxuXHJcbiAgICBjb25zdCBvT3BlbiA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuO1xyXG4gICAgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBjb25zdCB1cmwgPSBhcmd1bWVudHNbMV07XHJcbiAgICAgICAgaWYgKHVybC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiYXBpL3dlYmhvb2tzXCIpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShvT3BlbiwgdGhpcywgYXJndW1lbnRzKTtcclxuICAgIH07XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVEZIb3VyIHtcclxuICAgIGluamVjdDI0SG91cigpIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5jZWwyNEhvdXIpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgdHdlbHZlSG91ciA9IG5ldyBSZWdFeHAoYChbMC05XXsxLDJ9KTooWzAtOV17MSwyfSlcXFxccyhBTXxQTSlgKTtcclxuICAgICAgICBjb25zdCBjb252ZXJ0ID0gKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy02XCJdKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSBkYXRhLnJldHVyblZhbHVlLm1hdGNoKHR3ZWx2ZUhvdXIpO1xyXG4gICAgICAgICAgICBpZiAoIW1hdGNoZWQgfHwgbWF0Y2hlZC5sZW5ndGggIT09IDQpIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKG1hdGNoZWRbM10gPT09IFwiQU1cIikgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWUgPSBkYXRhLnJldHVyblZhbHVlLnJlcGxhY2UobWF0Y2hlZFswXSwgYCR7bWF0Y2hlZFsxXSA9PT0gXCIxMlwiID8gXCIwMFwiIDogbWF0Y2hlZFsxXS5wYWRTdGFydCgyLCBcIjBcIil9OiR7bWF0Y2hlZFsyXX1gKTtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWUgPSBkYXRhLnJldHVyblZhbHVlLnJlcGxhY2UobWF0Y2hlZFswXSwgYCR7bWF0Y2hlZFsxXSA9PT0gXCIxMlwiID8gXCIxMlwiIDogcGFyc2VJbnQobWF0Y2hlZFsxXSkgKyAxMn06JHttYXRjaGVkWzJdfWApO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbmNlbENvenkgPSBVdGlscy5tb25rZXlQYXRjaChCRFYyLlRpbWVGb3JtYXR0ZXIsIFwiY2FsZW5kYXJGb3JtYXRcIiwge2FmdGVyOiBjb252ZXJ0fSk7IC8vIENhbGxlZCBpbiBDb3p5IG1vZGVcclxuICAgICAgICBjb25zdCBjYW5jZWxDb21wYWN0ID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5UaW1lRm9ybWF0dGVyLCBcImRhdGVGb3JtYXRcIiwge2FmdGVyOiBjb252ZXJ0fSk7IC8vIENhbGxlZCBpbiBDb21wYWN0IG1vZGVcclxuICAgICAgICB0aGlzLmNhbmNlbDI0SG91ciA9ICgpID0+IHtjYW5jZWxDb3p5KCk7IGNhbmNlbENvbXBhY3QoKTt9OyAvLyBDYW5jZWwgYm90aFxyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZTI0SG91cigpIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5jZWwyNEhvdXIpIHRoaXMuY2FuY2VsMjRIb3VyKCk7XHJcbiAgICB9XHJcbn07IiwiaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCJcclxuXHJcbmNvbnN0IGRpc3BhdGNoZXIgPSB3aW5kb3cuTGlnaHRjb3JkLkRpc2NvcmRNb2R1bGVzLmRpc3BhdGNoZXJcclxuY29uc3QgQ2hhbm5lbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldENoYW5uZWwgJiYgZS5kZWZhdWx0Lmhhc0NoYW5uZWwpWzBdLmRlZmF1bHRcclxubGV0IHJlbGF0aW9uU2hpcE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmFkZFJlbGF0aW9uc2hpcClbMF1cclxubGV0IERNTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbClbMF1cclxuXHJcbmNvbnN0IGJsb2NrZWQgPSB7fVxyXG5cclxubGV0IHVzZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilbMF1cclxuZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXIoKXtcclxuICAgIGlmKHVzZXJNb2R1bGUpcmV0dXJuIHVzZXJNb2R1bGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXHJcbiAgICByZXR1cm4gbnVsbFxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQW50aUJvdERNIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5hbnRpRE0gPSB0aGlzLmFudGlETS5iaW5kKHRoaXMpXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGUoKXtcclxuICAgICAgICBpZih0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxyXG5cclxuICAgICAgICBkaXNwYXRjaGVyLnN1YnNjcmliZShcIk1FU1NBR0VfQ1JFQVRFXCIsIHRoaXMuYW50aURNKVxyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUoKXtcclxuICAgICAgICBpZighdGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcblxyXG4gICAgICAgIGRpc3BhdGNoZXIudW5zdWJzY3JpYmUoXCJNRVNTQUdFX0NSRUFURVwiLCB0aGlzLmFudGlETSlcclxuICAgIH1cclxuXHJcbiAgICBhbnRpRE0oZXYpe1xyXG4gICAgICAgIGlmKCFldi5tZXNzYWdlLmF1dGhvci5ib3QpcmV0dXJuXHJcbiAgICAgICAgaWYoZXYubWVzc2FnZS5hdXRob3IuaWQgPT09IGdldEN1cnJlbnRVc2VyKCkuaWQpXHJcbiAgICAgICAgaWYoZXYubWVzc2FnZS5ndWlsZF9pZClyZXR1cm5cclxuXHJcbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IENoYW5uZWxNb2R1bGUuZ2V0Q2hhbm5lbChldi5tZXNzYWdlLmNoYW5uZWxfaWQpXHJcbiAgICAgICAgaWYoIWNoYW5uZWwpcmV0dXJuIC8vIG1pZ2h0IGJlIGJyb2tlblxyXG5cclxuICAgICAgICBpZihjaGFubmVsLnR5cGUgIT09IDEpcmV0dXJuXHJcblxyXG4gICAgICAgIGlmKGJsb2NrZWRbZXYubWVzc2FnZS5hdXRob3IuaWRdKXJldHVybiAvLyBJZiB0aGUgdXNlciB1bmJsb2NrIHRoZSBib3QsIERvbid0IGJsb2NrIGl0IGFnYWluLlxyXG5cclxuICAgICAgICBpZihzY2FuTWVzc2FnZShldi5tZXNzYWdlKSl7XHJcbiAgICAgICAgICAgIGJsb2NrZWRbZXYubWVzc2FnZS5hdXRob3IuaWRdID0gdHJ1ZVxyXG4gICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoYFtBZEJsb2NrXTogQmxvY2tlZCAke2V2Lm1lc3NhZ2UuYXV0aG9yLnVzZXJuYW1lfSMke2V2Lm1lc3NhZ2UuYXV0aG9yLmRpc2NyaW1pbmF0b3J9YCwge1xyXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwid2FybmluZ1wiXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGlmKCFyZWxhdGlvblNoaXBNb2R1bGUpcmVsYXRpb25TaGlwTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuYWRkUmVsYXRpb25zaGlwKVswXVxyXG4gICAgICAgICAgICByZWxhdGlvblNoaXBNb2R1bGUuZGVmYXVsdC5hZGRSZWxhdGlvbnNoaXAoZXYubWVzc2FnZS5hdXRob3IuaWQsIHtcclxuICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBcIkNvbnRleHRNZW51XCJcclxuICAgICAgICAgICAgfSwgMilcclxuICAgICAgICAgICAgaWYoIURNTW9kdWxlKURNTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbClbMF1cclxuICAgICAgICAgICAgRE1Nb2R1bGUuZGVmYXVsdC5jbG9zZVByaXZhdGVDaGFubmVsKGNoYW5uZWwuaWQsIGZhbHNlKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2Nhbk1lc3NhZ2UobWVzc2FnZSl7XHJcbiAgICBpZigvKGRpc2NvcmRcXC5nZ3xkaXNjb3JkXFwuY29tXFwvaW52aXRlXFwvfGRpc2NvcmRhcHBcXC5jb21cXC9pbnZpdGVcXC8pL2cudGVzdChtZXNzYWdlLmNvbnRlbnQpKXJldHVybiB0cnVlXHJcbiAgICBpZihFbWJlZHNDb250YWlucyhtZXNzYWdlLCBcImRpc2NvcmQuZ2cvXCIpIHx8IEVtYmVkc0NvbnRhaW5zKG1lc3NhZ2UsIFwiZGlzY29yZC5jb20vaW52aXRlL1wiKSB8fCBFbWJlZHNDb250YWlucyhtZXNzYWdlLCBcImRpc2NvcmRhcHAuY29tL2ludml0ZS9cIikpcmV0dXJuIHRydWVcclxuXHJcbiAgICByZXR1cm4gZmFsc2VcclxufVxyXG5mdW5jdGlvbiBFbWJlZHNDb250YWlucyhtZXNzYWdlLCBzZWFyY2gpe1xyXG4gICAgbGV0IGVtYmVkcyA9IG1lc3NhZ2UuZW1iZWRzIHx8IFtdXHJcbiAgICBpZihlbWJlZHMubGVuZ3RoID09PSAwKXJldHVybiBmYWxzZVxyXG4gICAgcmV0dXJuIGVtYmVkcy5tYXAoZW1iZWQgPT4ge1xyXG4gICAgICAgIGlmKGVtYmVkLnR5cGUgIT09IFwicmljaFwiKXJldHVybiBmYWxzZVxyXG4gICAgICAgIGlmKChlbWJlZC50aXRsZSB8fCBcIlwiKS5pbmNsdWRlcyhzZWFyY2gpKXJldHVybiB0cnVlXHJcbiAgICAgICAgaWYoKGVtYmVkLmRlc2NyaXB0aW9uIHx8IFwiXCIpLmluY2x1ZGVzKHNlYXJjaCkpcmV0dXJuIHRydWVcclxuICAgICAgICBpZigoKGVtYmVkLmZvb3RlciB8fCBcIlwiKSAmJiBlbWJlZC5mb290ZXIudGV4dCB8fCBcIlwiKS5pbmNsdWRlcyhzZWFyY2gpKXJldHVybiB0cnVlXHJcbiAgICAgICAgaWYoKGVtYmVkLmZpZWxkcyB8fCBbXSkubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gZS52YWx1ZS5pbmNsdWRlcyhzZWFyY2gpIHx8IGUubmFtZS5pbmNsdWRlcyhzZWFyY2gpXHJcbiAgICAgICAgfSkuaW5jbHVkZXModHJ1ZSkpcmV0dXJuIHRydWVcclxuICAgICAgICByZXR1cm4gZmFsc2VcclxuXHJcbiAgICB9KS5pbmNsdWRlcyh0cnVlKVxyXG59IiwiaW1wb3J0IHtzZXR0aW5nc1JQQywgZGVmYXVsdFJQQ30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcblxyXG5jb25zdCBkaXNwYXRjaGVyID0gQkRNb2R1bGVzLmdldChtPT5tLkRpc3BhdGNoZXImJm0uZGVmYXVsdCYmbS5kZWZhdWx0LmRpc3BhdGNoKVswXS5kZWZhdWx0XHJcbmNvbnN0IEFjdGlvblR5cGVzID0gQkRNb2R1bGVzLmdldChtPT5tLkFjdGlvblR5cGVzKVswXS5BY3Rpb25UeXBlc1xyXG5cclxuY29uc3Qgc29ja2V0SWQgPSBcImxpZ2h0Y29yZC1zcG9vZi1zb2NrZXRcIlxyXG5jb25zdCBwaWQgPSBwcm9jZXNzLnBpZFxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEN1c3RvbVJpY2hQcmVzZW5jZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcblxyXG4gICAgICAgIHRoaXMuZ2FtZSA9IHNldHRpbmdzUlBDXHJcbiAgICB9XHJcbiAgICBcclxuICAgIGdldCBmb3JtYXRlZEdhbWUoKXtcclxuICAgICAgICBpZighdGhpcy5nYW1lKXJldHVybiBudWxsXHJcbiAgICAgICAgaWYodGhpcy5lbmFibGVkID09PSBmYWxzZSlyZXR1cm4gbnVsbFxyXG4gICAgICAgIGxldCBnYW1lID0ge1xyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLmdhbWUubmFtZSB8fCBkZWZhdWx0UlBDLm5hbWUsXHJcbiAgICAgICAgICAgIGFwcGxpY2F0aW9uX2lkOiB0aGlzLmdhbWUuYXBwbGljYXRpb25faWQgfHwgZGVmYXVsdFJQQy5hcHBsaWNhdGlvbl9pZCxcclxuICAgICAgICAgICAgZGV0YWlsczogdGhpcy5nYW1lLmRldGFpbHMgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBzdGF0ZTogdGhpcy5nYW1lLnN0YXRlIHx8IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgdGltZXN0YW1wczogdGhpcy5nYW1lW1widGltZXN0YW1wcy5zdGFydFwiXSA/IHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmdhbWVbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdXHJcbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIGFzc2V0czogdGhpcy5nYW1lW1wiYXNzZXRzLmxhcmdlXCJdID8ge1xyXG4gICAgICAgICAgICAgICAgbGFyZ2VfaW1hZ2U6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSxcclxuICAgICAgICAgICAgICAgIHNtYWxsX2ltYWdlOiB0aGlzLmdhbWVbXCJhc3NldHMuc21hbGxcIl0gfHwgdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWRcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGdhbWVcclxuICAgIH1cclxuXHJcbiAgICBzZW5kR2FtZSgpe1xyXG4gICAgICAgIGRpc3BhdGNoZXIuZGlzcGF0Y2goe1xyXG4gICAgICAgICAgICB0eXBlOiBBY3Rpb25UeXBlcy5MT0NBTF9BQ1RJVklUWV9VUERBVEUsXHJcbiAgICAgICAgICAgIHNvY2tldElkLFxyXG4gICAgICAgICAgICBwaWQsXHJcbiAgICAgICAgICAgIGFjdGl2aXR5OiB0aGlzLmZvcm1hdGVkR2FtZVxyXG4gICAgICAgIH0pICAgXHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKCkge1xyXG4gICAgICAgIGlmKHRoaXMuZW5hYmxlZClyZXR1cm5cclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJFbmFibGluZyBjdXN0b20gUmljaFByZXNlbmNlXCIpXHJcblxyXG4gICAgICAgIHRoaXMuc2V0KHNldHRpbmdzUlBDIHx8IE9iamVjdC5jcmVhdGUoZGVmYXVsdFJQQykpXHJcblxyXG4gICAgICAgIHRoaXMuc2VuZEdhbWUoKVxyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUoKSB7XHJcbiAgICAgICAgaWYoIXRoaXMuZW5hYmxlZClyZXR1cm5cclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiRGlzYWJsaW5nIGN1c3RvbSBSaWNoUHJlc2VuY2VcIilcclxuXHJcbiAgICAgICAgdGhpcy5zZW5kR2FtZSgpXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZmV0Y2hBc3NldHMoYXBwbGljYXRpb25JZCl7XHJcbiAgICAgICAgbGV0IGFzc2V0cyA9IGF3YWl0IEJETW9kdWxlcy5nZXQoZSA9PiBlLmdldEFzc2V0cylbMF0uZ2V0QXNzZXRzKGFwcGxpY2F0aW9uSWQpXHJcbiAgICAgICAgaWYoYXNzZXRzLnVuZGVmaW5lZCAmJiB0eXBlb2YgYXNzZXRzLnVuZGVmaW5lZCA9PT0gXCJudW1iZXJcIil7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gQXBwbGljYXRpb25cIilcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFzc2V0c1xyXG4gICAgfVxyXG5cclxuICAgIHNldChhY3Rpdml0eSl7XHJcbiAgICAgICAgdGhpcy5nYW1lID0gYWN0aXZpdHlcclxuXHJcbiAgICAgICAgdGhpcy5zZW5kR2FtZSgpXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IHYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gXCIuL2Rpc3RhbnRcIjtcclxuaW1wb3J0IHsgdGltaW5nU2FmZUVxdWFsIH0gZnJvbSBcImNyeXB0b1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIExheWVycyB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMubGF5ZXJzID0gW11cclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuTGF5ZXJzID0gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc0luamVjdGVkKCl7XHJcbiAgICAgICAgcmV0dXJuICEhZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcImRpdi5MYXllcnMuaW5qZWN0ZWRcIilcclxuICAgIH1cclxuXHJcbiAgICBpbmplY3QoKXtcclxuICAgICAgICBpZih0aGlzLmlzSW5qZWN0ZWQpcmV0dXJuXHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgY2xhc3NOYW1lTGF5ZXJzXHJcbiAgICAgICAgXSA9IFtcclxuICAgICAgICAgICAgVXRpbHMucmVtb3ZlRGEodjIuV2VicGFja01vZHVsZXMuZmluZChlID0+IGUubGF5ZXJzICYmIGUubGF5ZXIpLmxheWVycylcclxuICAgICAgICBdXHJcbiAgICAgICAgY29uc3QgbGF5ZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5cIitjbGFzc05hbWVMYXllcnMpO1xyXG4gICAgICAgIGlmICghbGF5ZXJzKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgUmVhY3RJbnN0YW5jZSA9IExpZ2h0Y29yZC5BcGkuVXRpbHMuRmluZFJlYWN0KGxheWVycywgMSlcclxuICAgICAgICBpZighUmVhY3RJbnN0YW5jZSlyZXR1cm4gbGF5ZXJzXHJcbiAgICAgICAgdGhpcy5SZWFjdEluc3RhbmNlID0gUmVhY3RJbnN0YW5jZVxyXG4gICAgICAgIGxldCByZW5kZXIgPSBSZWFjdEluc3RhbmNlLnJlbmRlclxyXG4gICAgICAgIFJlYWN0SW5zdGFuY2UucmVuZGVyID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcmV0dXJuVmFsdWUgPSByZW5kZXIuY2FsbChSZWFjdEluc3RhbmNlKVxyXG4gICAgICAgICAgICBsZXQgY2xhc3NMaXN0ID0gcmV0dXJuVmFsdWUucHJvcHMuY2hpbGRyZW5bMV0ucHJvcHMuY2xhc3NOYW1lLnNwbGl0KFwiIFwiKVxyXG4gICAgICAgICAgICBjbGFzc0xpc3QucHVzaChcIkxheWVyc1wiKVxyXG4gICAgICAgICAgICBjbGFzc0xpc3QucHVzaChcImluamVjdGVkXCIpXHJcbiAgICAgICAgICAgIHJldHVyblZhbHVlLnByb3BzLmNoaWxkcmVuWzFdLnByb3BzLmNsYXNzTmFtZSA9IGNsYXNzTGlzdC5qb2luKFwiIFwiKVxyXG5cclxuICAgICAgICAgICAgdGhpcy5sYXllcnMuZm9yRWFjaChsYXllciA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5wcm9wcy5jaGlsZHJlblsxXS5wcm9wcy5jaGlsZHJlbi5wdXNoKGxheWVyWzFdKVxyXG4gICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIFJlYWN0SW5zdGFuY2UuZm9yY2VVcGRhdGUoKVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUxheWVyKGNoaWxkcmVuLCBwcm9wcyA9IHt9KXtcclxuICAgICAgICBsZXQgaWQgPSB1dWlkdjQoKVxyXG4gICAgICAgIGxldCBsYXllciA9IG51bGxcclxuICAgICAgICB0aGlzLmxheWVycy5wdXNoKFtpZCwgPExheWVyIHsuLi5wcm9wc30gZ2V0TGF5ZXI9e2xheSA9PiB7XHJcbiAgICAgICAgICAgIGxheWVyID0gbGF5XHJcbiAgICAgICAgfX0ga2V5PXtpZH0gaWQ9e2lkfSByZW1vdmU9eygpID0+IHtcclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5sYXllcnMuZmluZEluZGV4KGUgPT4gZVswXSA9PT0gaWQpXHJcbiAgICAgICAgICAgIGlmKGluZGV4ID09PSAtMSlyZXR1cm5cclxuICAgICAgICAgICAgdGhpcy5sYXllcnMuc3BsaWNlKGluZGV4LCAxKVxyXG4gICAgICAgICAgICBsYXllciA9IG51bGxcclxuICAgICAgICAgICAgaWYodGhpcy5SZWFjdEluc3RhbmNlKXRoaXMuUmVhY3RJbnN0YW5jZS5mb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgICAgIHRoaXMuaW5qZWN0KClcclxuICAgICAgICB9fT57Y2hpbGRyZW59PC9MYXllcj5dKVxyXG4gICAgICAgIGlmKHRoaXMuUmVhY3RJbnN0YW5jZSl0aGlzLlJlYWN0SW5zdGFuY2UuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgIHRoaXMuaW5qZWN0KClcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByZW1vdmU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKCFsYXllcil7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5sYXllcnMuZmluZEluZGV4KGUgPT4gZVswXSA9PT0gaWQpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoaW5kZXggPT09IC0xKXJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF5ZXJzLnNwbGljZShpbmRleCwgMSlcclxuICAgICAgICAgICAgICAgICAgICBsYXllciA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLlJlYWN0SW5zdGFuY2UpdGhpcy5SZWFjdEluc3RhbmNlLmZvcmNlVXBkYXRlKClcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluamVjdCgpXHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBsYXllci5yZW1vdmUoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5cclxubGV0IExheWVyTW9kdWxlc1xyXG5leHBvcnQgY2xhc3MgTGF5ZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgYW5pbWF0aW9uOiBuZXcgdGhpcy5tb2R1bGVzWzBdLmRlZmF1bHQuVmFsdWUoMClcclxuICAgICAgICB9IFxyXG4gICAgICAgIHRoaXMucHJvcHMuZ2V0TGF5ZXIodGhpcylcclxuICAgICAgICB0aGlzLmtleWRvd24gPSB0aGlzLmtleWRvd24uYmluZCh0aGlzKVxyXG4gICAgfVxyXG5cclxuICAgIGtleWRvd24oZSl7XHJcbiAgICAgICAgaWYgKGUud2hpY2ggPT09IDI3KSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gTGF5ZXJNb2R1bGVzIHx8IChMYXllck1vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIHYyLldlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LlZhbHVlICYmIGUuZGVmYXVsdC5kaXYpXHJcbiAgICAgICAgXSlcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpe1xyXG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLmtleWRvd24pXHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoZXYpe1xyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLmtleWRvd24pXHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlKCl7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5yZW1vdmUoKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxFbnRlcihldil7XHJcbiAgICAgICAgdGhpcy5tb2R1bGVzWzBdLmRlZmF1bHQudGltaW5nKHRoaXMuc3RhdGUuYW5pbWF0aW9uLCB7XHJcbiAgICAgICAgICAgIHRvVmFsdWU6IDEsXHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAxMDBcclxuICAgICAgICB9KS5zdGFydChldilcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsTGVhdmUoZXYpe1xyXG4gICAgICAgIHRoaXMubW9kdWxlc1swXS5kZWZhdWx0LnRpbWluZyh0aGlzLnN0YXRlLmFuaW1hdGlvbiwge1xyXG4gICAgICAgICAgICB0b1ZhbHVlOiAwLFxyXG4gICAgICAgICAgICBkdXJhdGlvbjogMTAwXHJcbiAgICAgICAgfSkuc3RhcnQoZXYpXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IGludGVycG9sYXRpb24gPSB0aGlzLnN0YXRlLmFuaW1hdGlvbi5pbnRlcnBvbGF0ZSh7XHJcbiAgICAgICAgICAgIGlucHV0UmFuZ2U6IFswLCAxXSxcclxuICAgICAgICAgICAgb3V0cHV0UmFuZ2U6IFsxLjA3LCAxXVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgbGV0IHN0eWxlID0ge1xyXG4gICAgICAgICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmFuaW1hdGlvbixcclxuICAgICAgICAgICAgdHJhbnNmb3JtOiBbe1xyXG4gICAgICAgICAgICAgICAgc2NhbGU6IGludGVycG9sYXRpb25cclxuICAgICAgICAgICAgfV1cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IERpdiA9IHRoaXMubW9kdWxlc1swXS5kZWZhdWx0LmRpdlxyXG4gICAgICAgIHJldHVybiA8RGl2IGNsYXNzTmFtZT17W19fU0VDUkVUX0VNT1RJT05fXy5jc3Moe1xyXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6XCJ2YXIoLS1iYWNrZ3JvdW5kLXByaW1hcnkpXCIsXHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXHJcbiAgICAgICAgICAgIHRvcDogMCxcclxuICAgICAgICAgICAgcmlnaHQ6IDAsXHJcbiAgICAgICAgICAgIGJvdHRvbTogMCxcclxuICAgICAgICAgICAgbGVmdDogMCxcclxuICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXHJcbiAgICAgICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxyXG4gICAgICAgICAgICBXZWJraXRCb3hPcmllbnQ6IFwidmVydGljYWxcIixcclxuICAgICAgICAgICAgV2Via2l0Qm94RGlyZWN0aW9uOiBcIm5vcm1hbFwiLFxyXG4gICAgICAgICAgICBtc0ZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXHJcbiAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXHJcbiAgICAgICAgICAgIHpJbmRleDogMTAxXHJcbiAgICAgICAgfSkscHJvY2Vzcy5wbGF0Zm9ybT09PVwid2luMzJcIj9fX1NFQ1JFVF9FTU9USU9OX18uY3NzKHtcclxuICAgICAgICAgICAgdG9wOiBcIi0yMnB4XCIsXHJcbiAgICAgICAgICAgIHBhZGRpbmdUb3A6IFwiMjJweFwiXHJcbiAgICAgICAgfSk6bnVsbCwuLi4odGhpcy5wcm9wcy5jbGFzc05hbWU/dGhpcy5wcm9wcy5jbGFzc05hbWUuc3BsaXQoXCIgXCIpOltdKV0uZmlsdGVyKGU9PmUpLmpvaW4oXCIgXCIpIHx8IG51bGx9IHN0eWxlPXtzdHlsZX0+XHJcbiAgICAgICAgICAgIHt0aGlzLnByb3BzLmNoaWxkcmVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKClcclxuICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgPC9EaXY+XHJcbiAgICB9XHJcbn1cclxuTGF5ZXIuZGVmYXVsdFByb3BzID0ge1xyXG4gICAgaWQ6IG51bGwsXHJcbiAgICBjaGlsZHJlbjogbnVsbFxyXG59IiwiaW1wb3J0IHtwbHVnaW5Db29raWUsIHRoZW1lQ29va2llLCBiZHBsdWdpbnMsIGJkdGhlbWVzLCBzZXR0aW5nc0Nvb2tpZSwgc2V0dGluZ3N9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgbWFpbkNvcmUgZnJvbSBcIi4vY29yZVwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9wbHVnaW5Nb2R1bGVcIjtcclxuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuY29uc3QgQmRBcGkgPSB7XHJcbiAgICBnZXQgUmVhY3QoKSB7IHJldHVybiBCRFYyLlJlYWN0OyB9LFxyXG4gICAgZ2V0IFJlYWN0RE9NKCkgeyByZXR1cm4gQkRWMi5SZWFjdERvbTsgfSxcclxuICAgIGdldCBSZWFjdENvbXBvbmVudCgpIHtyZXR1cm4gQkRWMi5SZWFjdENvbXBvbmVudDt9LFxyXG4gICAgZ2V0IFdpbmRvd0NvbmZpZ0ZpbGUoKSB7cmV0dXJuIFV0aWxzLldpbmRvd0NvbmZpZ0ZpbGU7fSxcclxuICAgIGdldCBzZXR0aW5ncygpIHtyZXR1cm4gc2V0dGluZ3M7fSxcclxuICAgIGdldCBlbW90ZXMoKSB7cmV0dXJuIG51bGx9LCAvLyBkZXByZWNhdGVkLCBkZWxldGVkIGFsbCBlbW90ZXMgZnJvbSBiZXR0ZXJkaXNjb3JkLlxyXG4gICAgZ2V0IHNjcmVlbldpZHRoKCkgeyByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTsgfSxcclxuICAgIGdldCBzY3JlZW5IZWlnaHQoKSB7IHJldHVybiBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7IH1cclxufTtcclxuXHJcbkJkQXBpLmdldEFsbFdpbmRvd1ByZWZlcmVuY2VzID0gZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gVXRpbHMuZ2V0QWxsV2luZG93UHJlZmVyZW5jZXMoKTtcclxufTtcclxuXHJcbkJkQXBpLmdldFdpbmRvd1ByZWZlcmVuY2UgPSBmdW5jdGlvbihrZXkpIHtcclxuICAgIHJldHVybiBVdGlscy5nZXRXaW5kb3dQcmVmZXJlbmNlKGtleSk7XHJcbn07XHJcblxyXG5CZEFwaS5zZXRXaW5kb3dQcmVmZXJlbmNlID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xyXG4gICAgcmV0dXJuIFV0aWxzLnNldFdpbmRvd1ByZWZlcmVuY2Uoa2V5LCB2YWx1ZSk7XHJcbn07XHJcblxyXG4vL0luamVjdCBDU1MgdG8gZG9jdW1lbnQgaGVhZFxyXG4vL2lkID0gaWQgb2YgZWxlbWVudFxyXG4vL2NzcyA9IGN1c3RvbSBjc3NcclxuQmRBcGkuaW5qZWN0Q1NTID0gZnVuY3Rpb24gKGlkLCBjc3MpIHtcclxuICAgIERPTS5hZGRTdHlsZShET00uZXNjYXBlSUQoaWQpLCBjc3MpO1xyXG59O1xyXG5cclxuLy9DbGVhciBjc3MvcmVtb3ZlIGFueSBlbGVtZW50XHJcbi8vaWQgPSBpZCBvZiBlbGVtZW50XHJcbkJkQXBpLmNsZWFyQ1NTID0gZnVuY3Rpb24gKGlkKSB7XHJcbiAgICBET00ucmVtb3ZlU3R5bGUoRE9NLmVzY2FwZUlEKGlkKSk7XHJcbn07XHJcblxyXG4vL0luamVjdCBDU1MgdG8gZG9jdW1lbnQgaGVhZFxyXG4vL2lkID0gaWQgb2YgZWxlbWVudFxyXG4vL2NzcyA9IGN1c3RvbSBjc3NcclxuQmRBcGkubGlua0pTID0gZnVuY3Rpb24gKGlkLCB1cmwpIHtcclxuICAgIERPTS5hZGRTY3JpcHQoRE9NLmVzY2FwZUlEKGlkKSwgdXJsKTtcclxufTtcclxuXHJcbi8vQ2xlYXIgY3NzL3JlbW92ZSBhbnkgZWxlbWVudFxyXG4vL2lkID0gaWQgb2YgZWxlbWVudFxyXG5CZEFwaS51bmxpbmtKUyA9IGZ1bmN0aW9uIChpZCkge1xyXG4gICAgRE9NLnJlbW92ZVNjcmlwdChET00uZXNjYXBlSUQoaWQpKTtcclxufTtcclxuXHJcbi8vR2V0IGFub3RoZXIgcGx1Z2luXHJcbi8vbmFtZSA9IG5hbWUgb2YgcGx1Z2luXHJcbkJkQXBpLmdldFBsdWdpbiA9IGZ1bmN0aW9uIChuYW1lKSB7XHJcbiAgICBpZiAoYmRwbHVnaW5zLmhhc093blByb3BlcnR5KG5hbWUpKSB7XHJcbiAgICAgICAgcmV0dXJuIGJkcGx1Z2luc1tuYW1lXS5wbHVnaW47XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuXHJcbi8vR2V0IEJldHRlckRpc2NvcmQgQ29yZVxyXG5CZEFwaS5nZXRDb3JlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgVXRpbHMud2FybihcIkRlcHJlY2F0aW9uIE5vdGljZVwiLCBgQmRBcGkuZ2V0Q29yZSgpIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuYCk7XHJcbiAgICByZXR1cm4gbWFpbkNvcmU7XHJcbn07XHJcblxyXG4vKipcclxuICogU2hvd3MgYSBnZW5lcmljIGJ1dCB2ZXJ5IGN1c3RvbWl6YWJsZSBtb2RhbC5cclxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gdGl0bGUgb2YgdGhlIG1vZGFsXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gYSBzdHJpbmcgb2YgdGV4dCB0byBkaXNwbGF5IGluIHRoZSBtb2RhbFxyXG4gKi9cclxuQmRBcGkuYWxlcnQgPSBmdW5jdGlvbiAodGl0bGUsIGNvbnRlbnQpIHtcclxuICAgIHJldHVybiBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwodGl0bGUsIGNvbnRlbnQsIHtjYW5jZWxUZXh0OiBudWxsfSk7XHJcbn07XHJcblxyXG4vKipcclxuICogU2hvd3MgYSBnZW5lcmljIGJ1dCB2ZXJ5IGN1c3RvbWl6YWJsZSBjb25maXJtYXRpb24gbW9kYWwgd2l0aCBvcHRpb25hbCBjb25maXJtIGFuZCBjYW5jZWwgY2FsbGJhY2tzLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSB0aXRsZSBvZiB0aGUgbW9kYWxcclxuICogQHBhcmFtIHsoc3RyaW5nfFJlYWN0RWxlbWVudHxBcnJheTxzdHJpbmd8UmVhY3RFbGVtZW50Pil9IGNoaWxkcmVuIC0gYSBzaW5nbGUgb3IgbWl4ZWQgYXJyYXkgb2YgcmVhY3QgZWxlbWVudHMgYW5kIHN0cmluZ3MuIEV2ZXJ5IHN0cmluZyBpcyB3cmFwcGVkIGluIERpc2NvcmQncyBgTWFya2Rvd25gIGNvbXBvbmVudCBzbyBzdHJpbmdzIHdpbGwgc2hvdyBhbmQgcmVuZGVyIHByb3Blcmx5LlxyXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gb3B0aW9ucyB0byBtb2RpZnkgdGhlIG1vZGFsXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGFuZ2VyPWZhbHNlXSAtIHdoZXRoZXIgdGhlIG1haW4gYnV0dG9uIHNob3VsZCBiZSByZWQgb3Igbm90XHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jb25maXJtVGV4dD1Pa2F5XSAtIHRleHQgZm9yIHRoZSBjb25maXJtYXRpb24vc3VibWl0IGJ1dHRvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY2FuY2VsVGV4dD1DYW5jZWxdIC0gdGV4dCBmb3IgdGhlIGNhbmNlbCBidXR0b25cclxuICogQHBhcmFtIHtjYWxsYWJsZX0gW29wdGlvbnMub25Db25maXJtPU5PT1BdIC0gY2FsbGJhY2sgdG8gb2NjdXIgd2hlbiBjbGlja2luZyB0aGUgc3VibWl0IGJ1dHRvblxyXG4gKiBAcGFyYW0ge2NhbGxhYmxlfSBbb3B0aW9ucy5vbkNhbmNlbD1OT09QXSAtIGNhbGxiYWNrIHRvIG9jY3VyIHdoZW4gY2xpY2tpbmcgdGhlIGNhbmNlbCBidXR0b25cclxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmtleV0gLSBrZXkgdXNlZCB0byBpZGVudGlmeSB0aGUgbW9kYWwuIElmIG5vdCBwcm92aWRlZCwgb25lIGlzIGdlbmVyYXRlZCBhbmQgcmV0dXJuZWRcclxuICogQHJldHVybnMge3N0cmluZ30gLSB0aGUga2V5IHVzZWQgZm9yIHRoaXMgbW9kYWxcclxuICovXHJcbkJkQXBpLnNob3dDb25maXJtYXRpb25Nb2RhbCA9IGZ1bmN0aW9uICh0aXRsZSwgY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICByZXR1cm4gVXRpbHMuc2hvd0NvbmZpcm1hdGlvbk1vZGFsKHRpdGxlLCBjb250ZW50LCBvcHRpb25zKTtcclxufTtcclxuXHJcbi8vU2hvdyB0b2FzdCBhbGVydFxyXG5CZEFwaS5zaG93VG9hc3QgPSBmdW5jdGlvbihjb250ZW50LCBvcHRpb25zID0ge30pIHtcclxuICAgIFV0aWxzLnNob3dUb2FzdChjb250ZW50LCBvcHRpb25zKTtcclxufTtcclxuXHJcbi8vIEZpbmRzIG1vZHVsZVxyXG5CZEFwaS5maW5kTW9kdWxlID0gZnVuY3Rpb24oZmlsdGVyKSB7XHJcbiAgICByZXR1cm4gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGZpbHRlcik7XHJcbn07XHJcblxyXG4vLyBGaW5kcyBtb2R1bGVcclxuQmRBcGkuZmluZEFsbE1vZHVsZXMgPSBmdW5jdGlvbihmaWx0ZXIpIHtcclxuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRBbGwoZmlsdGVyKTtcclxufTtcclxuXHJcbi8vIEZpbmRzIG1vZHVsZVxyXG5CZEFwaS5maW5kTW9kdWxlQnlQcm9wcyA9IGZ1bmN0aW9uKC4uLnByb3BzKSB7XHJcbiAgICByZXR1cm4gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKHByb3BzKTtcclxufTtcclxuXHJcbkJkQXBpLmZpbmRNb2R1bGVCeVByb3RvdHlwZXMgPSBmdW5jdGlvbiguLi5wcm90b3MpIHtcclxuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3RvdHlwZXMocHJvdG9zKTtcclxufTtcclxuXHJcbkJkQXBpLmZpbmRNb2R1bGVCeURpc3BsYXlOYW1lID0gZnVuY3Rpb24obmFtZSkge1xyXG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUobmFtZSk7XHJcbn07XHJcblxyXG4vLyBHZXRzIHJlYWN0IGluc3RhbmNlXHJcbkJkQXBpLmdldEludGVybmFsSW5zdGFuY2UgPSBmdW5jdGlvbihub2RlKSB7XHJcbiAgICBpZiAoIShub2RlIGluc3RhbmNlb2Ygd2luZG93LmpRdWVyeSkgJiYgIShub2RlIGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIGpRdWVyeSkgbm9kZSA9IG5vZGVbMF07XHJcbiAgICByZXR1cm4gQkRWMi5nZXRJbnRlcm5hbEluc3RhbmNlKG5vZGUpO1xyXG59O1xyXG5cclxuLy8gR2V0cyBkYXRhXHJcbkJkQXBpLmxvYWREYXRhID0gZnVuY3Rpb24ocGx1Z2luTmFtZSwga2V5KSB7XHJcbiAgICByZXR1cm4gRGF0YVN0b3JlLmdldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KTtcclxufTtcclxuXHJcbkJkQXBpLmdldERhdGEgPSBCZEFwaS5sb2FkRGF0YTtcclxuXHJcbi8vIFNldHMgZGF0YVxyXG5CZEFwaS5zYXZlRGF0YSA9IGZ1bmN0aW9uKHBsdWdpbk5hbWUsIGtleSwgZGF0YSkge1xyXG4gICAgcmV0dXJuIERhdGFTdG9yZS5zZXRQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSwgZGF0YSk7XHJcbn07XHJcblxyXG5CZEFwaS5zZXREYXRhID0gQmRBcGkuc2F2ZURhdGE7XHJcblxyXG4vLyBEZWxldGVzIGRhdGFcclxuQmRBcGkuZGVsZXRlRGF0YSA9IGZ1bmN0aW9uKHBsdWdpbk5hbWUsIGtleSkge1xyXG4gICAgcmV0dXJuIERhdGFTdG9yZS5kZWxldGVQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSk7XHJcbn07XHJcblxyXG4vLyBQYXRjaGVzIG90aGVyIGZ1bmN0aW9uc1xyXG5CZEFwaS5tb25rZXlQYXRjaCA9IGZ1bmN0aW9uKHdoYXQsIG1ldGhvZE5hbWUsIG9wdGlvbnMpIHtcclxuICAgIHJldHVybiBVdGlscy5tb25rZXlQYXRjaCh3aGF0LCBtZXRob2ROYW1lLCBvcHRpb25zKTtcclxufTtcclxuXHJcbi8vIEV2ZW50IHdoZW4gZWxlbWVudCBpcyByZW1vdmVkXHJcbkJkQXBpLm9uUmVtb3ZlZCA9IGZ1bmN0aW9uKG5vZGUsIGNhbGxiYWNrKSB7XHJcbiAgICByZXR1cm4gVXRpbHMub25SZW1vdmVkKG5vZGUsIGNhbGxiYWNrKTtcclxufTtcclxuXHJcbi8vIFdyYXBzIGZ1bmN0aW9uIGluIHRyeS4uY2F0Y2hcclxuQmRBcGkuc3VwcHJlc3NFcnJvcnMgPSBmdW5jdGlvbihtZXRob2QsIG1lc3NhZ2UpIHtcclxuICAgIHJldHVybiBVdGlscy5zdXBwcmVzc0Vycm9ycyhtZXRob2QsIG1lc3NhZ2UpO1xyXG59O1xyXG5cclxuLy8gVGVzdHMgZm9yIHZhbGlkIEpTT05cclxuQmRBcGkudGVzdEpTT04gPSBmdW5jdGlvbihkYXRhKSB7XHJcbiAgICByZXR1cm4gVXRpbHMudGVzdEpTT04oZGF0YSk7XHJcbn07XHJcblxyXG5CZEFwaS5pc1BsdWdpbkVuYWJsZWQgPSBmdW5jdGlvbihuYW1lKSB7XHJcbiAgICByZXR1cm4gISFwbHVnaW5Db29raWVbbmFtZV07XHJcbn07XHJcblxyXG5CZEFwaS5pc1RoZW1lRW5hYmxlZCA9IGZ1bmN0aW9uKG5hbWUpIHtcclxuICAgIHJldHVybiAhIXRoZW1lQ29va2llW25hbWVdO1xyXG59O1xyXG5cclxuQmRBcGkuaXNTZXR0aW5nRW5hYmxlZCA9IGZ1bmN0aW9uKGlkKSB7XHJcbiAgICByZXR1cm4gISFzZXR0aW5nc0Nvb2tpZVtpZF07XHJcbn07XHJcblxyXG5CZEFwaS5lbmFibGVTZXR0aW5nID0gZnVuY3Rpb24oaWQpIHtcclxuICAgIHJldHVybiBzZXR0aW5nc1BhbmVsLm9uQ2hhbmdlKGlkLCB0cnVlKTtcclxufTtcclxuXHJcbkJkQXBpLmRpc2FibGVTZXR0aW5nID0gZnVuY3Rpb24oaWQpIHtcclxuICAgIHJldHVybiBzZXR0aW5nc1BhbmVsLm9uQ2hhbmdlKGlkLCBmYWxzZSk7XHJcbn07XHJcblxyXG5CZEFwaS50b2dnbGVTZXR0aW5nID0gZnVuY3Rpb24oaWQpIHtcclxuICAgIHJldHVybiBzZXR0aW5nc1BhbmVsLm9uQ2hhbmdlKGlkLCAhc2V0dGluZ3NDb29raWVbaWRdKTtcclxufTtcclxuXHJcbi8vIEdldHMgZGF0YVxyXG5CZEFwaS5nZXRCRERhdGEgPSBmdW5jdGlvbihrZXkpIHtcclxuICAgIHJldHVybiBEYXRhU3RvcmUuZ2V0QkREYXRhKGtleSk7XHJcbn07XHJcblxyXG4vLyBTZXRzIGRhdGFcclxuQmRBcGkuc2V0QkREYXRhID0gZnVuY3Rpb24oa2V5LCBkYXRhKSB7XHJcbiAgICByZXR1cm4gRGF0YVN0b3JlLnNldEJERGF0YShrZXksIGRhdGEpO1xyXG59O1xyXG5cclxuXHJcblxyXG5jb25zdCBtYWtlQWRkb25BUEkgPSAoY29va2llLCBsaXN0LCBtYW5hZ2VyKSA9PiBuZXcgY2xhc3MgQWRkb25BUEkge1xyXG5cclxuICAgIGdldCBmb2xkZXIoKSB7cmV0dXJuIG1hbmFnZXIuZm9sZGVyO31cclxuXHJcbiAgICBpc0VuYWJsZWQobmFtZSkge1xyXG4gICAgICAgIHJldHVybiAhIWNvb2tpZVtuYW1lXTtcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGUobmFtZSkge1xyXG4gICAgICAgIHJldHVybiBtYW5hZ2VyLmVuYWJsZShuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gbWFuYWdlci5kaXNhYmxlKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHRvZ2dsZShuYW1lKSB7XHJcbiAgICAgICAgaWYgKGNvb2tpZVtuYW1lXSkgdGhpcy5kaXNhYmxlKG5hbWUpO1xyXG4gICAgICAgIGVsc2UgdGhpcy5lbmFibGUobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVsb2FkKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gbWFuYWdlci5yZWxvYWQobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0KG5hbWUpIHtcclxuICAgICAgICBpZiAobGlzdC5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xyXG4gICAgICAgICAgICBpZiAobGlzdFtuYW1lXS5wbHVnaW4pIHJldHVybiBsaXN0W25hbWVdLnBsdWdpbjtcclxuICAgICAgICAgICAgcmV0dXJuIGxpc3RbbmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEFsbCgpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMobGlzdCkubWFwKGsgPT4gdGhpcy5nZXQoaykpLmZpbHRlcihhID0+IGEpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuQmRBcGkuUGx1Z2lucyA9IG1ha2VBZGRvbkFQSShwbHVnaW5Db29raWUsIGJkcGx1Z2lucywgcGx1Z2luTW9kdWxlKTtcclxuQmRBcGkuVGhlbWVzID0gbWFrZUFkZG9uQVBJKHRoZW1lQ29va2llLCBiZHRoZW1lcywgdGhlbWVNb2R1bGUpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgQmRBcGk7XHJcblxyXG53aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuQmRBcGkgPSBCZEFwaSIsIi8qIEJERXZlbnRzICovXHJcbmNvbnN0IEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoXCJldmVudHNcIik7XHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBCREV2ZW50cyBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKClcclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuQkRFdmVudHMgPSB0aGlzXHJcbiAgICB9XHJcbiAgICBkaXNwYXRjaChldmVudE5hbWUsIC4uLmFyZ3MpIHt0aGlzLmVtaXQoZXZlbnROYW1lLCAuLi5hcmdzKTt9XHJcbiAgICBvZmYoZXZlbnROYW1lLCBldmVudEFjdGlvbikge3RoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnROYW1lLCBldmVudEFjdGlvbik7fVxyXG59OyIsIi8qKlxyXG4gKiBDcmVkaXRzIHRvIEBoZWxsYm91bmQxMzM3IG9uIGdpdGh1YiBmb3IgdGhlIGNzc1xyXG4gKi9cclxuXHJcbmltcG9ydCBET01Ub29scyBmcm9tIFwiLi9kb210b29sc1wiXHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiXHJcblxyXG5sZXQgc2VsZWN0b3JzXHJcbmNvbnN0IHJlbW92ZURhID0gVXRpbHMucmVtb3ZlRGFcclxuZnVuY3Rpb24gZ2V0U2VsZWN0b3JzKCl7XHJcbiAgICBsZXQgc3RhbmRhcmRTaWRlYmFyVmlldyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnN0YW5kYXJkU2lkZWJhclZpZXcpWzBdXHJcbiAgICBpZighc3RhbmRhcmRTaWRlYmFyVmlldylyZXR1cm4gbnVsbFxyXG4gICAgbGV0IGRlZmF1bHRDbGFzc05hbWUgPSByZW1vdmVEYShzdGFuZGFyZFNpZGViYXJWaWV3LnN0YW5kYXJkU2lkZWJhclZpZXcpXHJcbiAgICBsZXQgc2VsZWN0cyA9IFtdXHJcbiAgICBsZXQgdXNlclNldHRpbmdzQWNjb3VudCA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnVzZXJTZXR0aW5nc0FjY291bnQpWzBdXHJcbiAgICBjb25zdCBjaGlsZHJlbiA9IEJETW9kdWxlcy5nZXQoZSA9PiB0eXBlb2YgZS5jaGlsZHJlbiA9PT0gXCJzdHJpbmdcIilbMF1cclxuICAgIHNlbGVjdHMucHVzaChgI2FwcC1tb3VudCAuJHtkZWZhdWx0Q2xhc3NOYW1lfSAucGF5bWVudC1pbmZvIC4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlc2NyaXB0aW9uICYmIHR5cGVvZiBlLmRlc2NyaXB0aW9uID09PSBcInN0cmluZ1wiICYmIGUuZGVzY3JpcHRpb24uaW5jbHVkZXMoXCJmb3JtVGV4dFwiKSlbMF0uZGVzY3JpcHRpb24pfWApXHJcbiAgICBzZWxlY3RzLnB1c2goYCNhcHAtbW91bnQgLiR7ZGVmYXVsdENsYXNzTmFtZX0gLiR7cmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUucGF5bWVudFNvdXJjZVJvdylbMF0ucGF5bWVudFNvdXJjZVJvdyl9IC4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLnN1YlRleHQgJiYgZS5kZXNjcmlwdGlvbldyYXBwZXIpWzBdLnN1YlRleHQpfWApXHJcbiAgICBpZih1c2VyU2V0dGluZ3NBY2NvdW50KXtcclxuICAgICAgICBzZWxlY3RzLnB1c2goYCNhcHAtbW91bnQgLiR7ZGVmYXVsdENsYXNzTmFtZX0gLiR7cmVtb3ZlRGEodXNlclNldHRpbmdzQWNjb3VudC51c2VyU2V0dGluZ3NBY2NvdW50KX0gZGl2Om50aC1jaGlsZCgyKT5kaXY6bnRoLWNoaWxkKDIpPi4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLnZpZXdCb2R5KVswXS52aWV3Qm9keSl9YClcclxuICAgICAgICBzZWxlY3RzLnB1c2goYC4ke3JlbW92ZURhKHVzZXJTZXR0aW5nc0FjY291bnQudXNlclNldHRpbmdzU2VjdXJpdHkpfSAuJHtyZW1vdmVEYShjaGlsZHJlbi5jaGlsZHJlbil9ID4gZGl2Om50aC1jaGlsZCgyKWApXHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhzZWxlY3RzKVxyXG4gICAgcmV0dXJuIHNlbGVjdHNcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEJsdXJQcml2YXRlIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGUoKXtcclxuICAgICAgICBpZih0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxyXG4gICAgICAgIHNlbGVjdG9ycyA9IHNlbGVjdG9ycyB8fCBnZXRTZWxlY3RvcnMoKVxyXG5cclxuICAgICAgICBpZighc2VsZWN0b3JzKWNvbnNvbGUuZXJyb3IobmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBzZWxlY3RvcnMgdG8gYmx1ciBwZXJzb25uYWwgaW5mb3JtYXRpb25zLlwiKSlcclxuICAgICAgICBET01Ub29scy5hZGRTdHlsZShcImJsdXJQcml2YXRlXCIsIGBcclxuJHtzZWxlY3RvcnMuam9pbihcIiwgXCIpfSB7XHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgMTUwbXMgY3ViaWMtYmV6aWVyKC41NSwuMDg1LC42OCwuNTMpO1xyXG4gICAgZmlsdGVyOiBibHVyKDRweCk7XHJcbiAgICBvcGFjaXR5OiAuODtcclxufVxyXG5cclxuJHtzZWxlY3RvcnMubWFwKGUgPT4gZStcIjpob3ZlclwiKS5qb2luKFwiLCBcIil9ICB7XHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgMTUwbXMgY3ViaWMtYmV6aWVyKC41NSwuMDksLjY4LC41Myk7XHJcbiAgICBmaWx0ZXI6IG5vbmU7XHJcbiAgICBvcGFjaXR5OiAxO1xyXG59YClcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKCl7XHJcbiAgICAgICAgaWYoIXRoaXMuZW5hYmxlZClyZXR1cm5cclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxyXG4gICAgICAgIERPTVRvb2xzLnJlbW92ZVN0eWxlKFwiYmx1clByaXZhdGVcIilcclxuICAgIH1cclxufSIsImltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi93ZWJwYWNrTW9kdWxlc1wiO1xyXG5cclxuY29uc3Qgbm9ybWFsaXplZFByZWZpeCA9IFwiZGFcIjtcclxuY29uc3QgcmFuZENsYXNzID0gbmV3IFJlZ0V4cChgXig/ISR7bm9ybWFsaXplZFByZWZpeH0tKSgoPzpbQS1aYS16XXxbMC05XXwtKSspLSg/OltBLVphLXpdfFswLTldfC18Xyl7Nn0kYCk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQ2xhc3NOb3JtYWxpemVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkNsYXNzTm9ybWFsaXplciA9IHRoaXNcclxuICAgIH1cclxuICAgIHN0b3AoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc1BhdGNoZWQpIHJldHVybjtcclxuICAgICAgICB0aGlzLnVucGF0Y2hDbGFzc01vZHVsZXMoV2VicGFja01vZHVsZXMuZmluZEFsbCh0aGlzLm1vZHVsZUZpbHRlci5iaW5kKHRoaXMpKSk7XHJcbiAgICAgICAgdGhpcy5yZXZlcnRFbGVtZW50KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwLW1vdW50XCIpKTtcclxuICAgICAgICB0aGlzLmhhc1BhdGNoZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydCgpIHtcclxuICAgICAgICBpZiAodGhpcy5oYXNQYXRjaGVkKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5wYXRjaENsYXNzTW9kdWxlcyhXZWJwYWNrTW9kdWxlcy5maW5kQWxsKHRoaXMubW9kdWxlRmlsdGVyLmJpbmQodGhpcykpKTtcclxuICAgICAgICB0aGlzLm5vcm1hbGl6ZUVsZW1lbnQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhcHAtbW91bnRcIikpO1xyXG4gICAgICAgIHRoaXMuaGFzUGF0Y2hlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5wYXRjaERPTU1ldGhvZHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXRjaENsYXNzTW9kdWxlcyhtb2R1bGVzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xyXG4gICAgICAgICAgICB0aGlzLnBhdGNoQ2xhc3NNb2R1bGUobm9ybWFsaXplZFByZWZpeCwgbW9kdWxlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdW5wYXRjaENsYXNzTW9kdWxlcyhtb2R1bGVzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xyXG4gICAgICAgICAgICB0aGlzLnVucGF0Y2hDbGFzc01vZHVsZShub3JtYWxpemVkUHJlZml4LCBtb2R1bGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzaG91bGRJZ25vcmUodmFsdWUpIHtcclxuICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKHZhbHVlLmVuZHNXaXRoKFwicHhcIikgfHwgdmFsdWUuZW5kc1dpdGgoXCJjaFwiKSB8fCB2YWx1ZS5lbmRzV2l0aChcImVtXCIpIHx8IHZhbHVlLmVuZHNXaXRoKFwibXNcIikpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKFwibGF5ZXJDb250YWluZXItXCIpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aChcIiNcIikgJiYgKHZhbHVlLmxlbmd0aCA9PSA3IHx8IHZhbHVlLmxlbmd0aCA9PSA0KSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKHZhbHVlLmluY2x1ZGVzKFwiY2FsYyhcIikgfHwgdmFsdWUuaW5jbHVkZXMoXCJyZ2JhXCIpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbW9kdWxlRmlsdGVyKG1vZHVsZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobW9kdWxlKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmIChtb2R1bGUuX19lc01vZHVsZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmICghT2JqZWN0LmtleXMobW9kdWxlKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBmb3IgKGNvbnN0IGJhc2VDbGFzc05hbWUgaW4gbW9kdWxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbW9kdWxlW2Jhc2VDbGFzc05hbWVdO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZElnbm9yZSh2YWx1ZSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUuc3BsaXQoXCItXCIpLmxlbmd0aCA9PT0gMSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoIXJhbmRDbGFzcy50ZXN0KHZhbHVlLnNwbGl0KFwiIFwiKVswXSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHBhdGNoQ2xhc3NNb2R1bGUoY29tcG9uZW50TmFtZSwgY2xhc3NOYW1lcykge1xyXG4gICAgICAgIGZvciAoY29uc3QgYmFzZUNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlKHZhbHVlKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHZhbHVlLnNwbGl0KFwiIFwiKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBub3JtYWxDbGFzcyBvZiBjbGFzc0xpc3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gbm9ybWFsQ2xhc3MubWF0Y2gocmFuZENsYXNzKTtcclxuICAgICAgICAgICAgICAgIGlmICghbWF0Y2ggfHwgIW1hdGNoLmxlbmd0aCB8fCBtYXRjaC5sZW5ndGggPCAyKSBjb250aW51ZTsgLy8gU2hvdWxkbid0IGV2ZXIgaGFwcGVuIHNpbmNlIHRoZXkgcGFzc2VkIHRoZSBtb2R1bGVGaWx0ZXIsIGJ1dCB5b3UgbmV2ZXIga25vd1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2FtZWxDYXNlID0gbWF0Y2hbMV0uc3BsaXQoXCItXCIpLm1hcCgocywgaSkgPT4gaSA/IHNbMF0udG9VcHBlckNhc2UoKSArIHMuc2xpY2UoMSkgOiBzKS5qb2luKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXSArPSBgICR7Y29tcG9uZW50TmFtZX0tJHtjYW1lbENhc2V9YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1bnBhdGNoQ2xhc3NNb2R1bGUoY29tcG9uZW50TmFtZSwgY2xhc3NOYW1lcykge1xyXG4gICAgICAgIGZvciAoY29uc3QgYmFzZUNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlKHZhbHVlKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGxldCBuZXdTdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgICAgICBjb25zdCBjbGFzc0xpc3QgPSB2YWx1ZS5zcGxpdChcIiBcIik7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgbm9ybWFsQ2xhc3Mgb2YgY2xhc3NMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobm9ybWFsQ2xhc3Muc3RhcnRzV2l0aChgJHtjb21wb25lbnROYW1lfS1gKSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBuZXdTdHJpbmcgKz0gYCAke25vcm1hbENsYXNzfWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXSA9IG5ld1N0cmluZy50cmltKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5vcm1hbGl6ZUVsZW1lbnQoZWxlbWVudCkge1xyXG4gICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBlbGVtZW50LmNsYXNzTGlzdDtcclxuICAgICAgICBmb3IgKGxldCBjID0gMCwgY2xlbiA9IGNsYXNzZXMubGVuZ3RoOyBjIDwgY2xlbjsgYysrKSB7XHJcbiAgICAgICAgICAgIGlmICghcmFuZENsYXNzLnRlc3QoY2xhc3Nlc1tjXSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IGNsYXNzZXNbY10ubWF0Y2gocmFuZENsYXNzKVsxXTtcclxuICAgICAgICAgICAgY29uc3QgbmV3Q2xhc3MgPSBtYXRjaC5zcGxpdChcIi1cIikubWFwKChzLCBpKSA9PiBpID8gc1swXS50b1VwcGVyQ2FzZSgpICsgcy5zbGljZSgxKSA6IHMpLmpvaW4oXCJcIik7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChgJHtub3JtYWxpemVkUHJlZml4fS0ke25ld0NsYXNzfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsZW1lbnQuY2hpbGRyZW4pIHRoaXMubm9ybWFsaXplRWxlbWVudChjaGlsZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV2ZXJ0RWxlbWVudChlbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4gJiYgZWxlbWVudC5jaGlsZHJlbi5sZW5ndGgpIHRoaXMucmV2ZXJ0RWxlbWVudChlbGVtZW50LmNoaWxkcmVuWzBdKTtcclxuICAgICAgICBpZiAoZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpIHRoaXMucmV2ZXJ0RWxlbWVudChlbGVtZW50Lm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IGVsZW1lbnQuY2xhc3NMaXN0O1xyXG4gICAgICAgIGNvbnN0IHRvUmVtb3ZlID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjbGFzc2VzLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgIGlmIChjbGFzc2VzW2NdLnN0YXJ0c1dpdGgoYCR7bm9ybWFsaXplZFByZWZpeH0tYCkpIHRvUmVtb3ZlLnB1c2goY2xhc3Nlc1tjXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSguLi50b1JlbW92ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcGF0Y2hET01NZXRob2RzKCkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5zID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5jb250YWlucztcclxuICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24odG9rZW4pIHtcclxuICAgICAgICAgICAgLy8gY29uc3QgdG9rZW5zID0gdG9rZW4uc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShjb250YWlucywgdGhpcywgW3Rva2VuLnNwbGl0KFwiIFwiKVswXV0pO1xyXG4gICAgICAgICAgICAvLyByZXR1cm4gdG9rZW5zLmV2ZXJ5KHQgPT4gY29udGFpbnMuY2FsbCh0aGlzLCB0KSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgYWRkID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5hZGQ7XHJcbiAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiguLi50b2tlbnMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCB0b2tlbnMubGVuZ3RoOyB0KyspIHtcclxuICAgICAgICAgICAgICAgIHRva2Vuc1t0XSA9IHRva2Vuc1t0XS5zcGxpdChcIiBcIilbMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkoYWRkLCB0aGlzLCB0b2tlbnMpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IHJlbW92ZSA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUucmVtb3ZlO1xyXG4gICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oLi4udG9rZW5zKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgdG9rZW5zLmxlbmd0aDsgdCsrKSB7XHJcbiAgICAgICAgICAgICAgICB0b2tlbnNbdF0gPSB0b2tlbnNbdF0uc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KHJlbW92ZSwgdGhpcywgdG9rZW5zKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxufTsiLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQ29sb3JlZFRleHQge1xyXG4gICAgaW5qZWN0Q29sb3JlZFRleHQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FuY2VsQ29sb3JlZFRleHQpIHJldHVybjtcclxuICAgICAgICBpZiAoIUJEVjIuTWVzc2FnZUNvbXBvbmVudCkgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLmNhbmNlbENvbG9yZWRUZXh0ID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5NZXNzYWdlQ29tcG9uZW50LCBcImRlZmF1bHRcIiwge2JlZm9yZTogKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXTtcclxuICAgICAgICAgICAgaWYgKCFwcm9wcyB8fCAhcHJvcHMuY2hpbGRyZW5NZXNzYWdlQ29udGVudCkgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlQ29udGVudCA9IHByb3BzLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoIW1lc3NhZ2VDb250ZW50LnR5cGUgfHwgIW1lc3NhZ2VDb250ZW50LnR5cGUudHlwZSB8fCBtZXNzYWdlQ29udGVudC50eXBlLnR5cGUuZGlzcGxheU5hbWUgIT0gXCJNZXNzYWdlQ29udGVudFwiKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsVHlwZSA9IG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZTtcclxuICAgICAgICAgICAgaWYgKG9yaWdpbmFsVHlwZS5fX29yaWdpbmFsTWV0aG9kKSByZXR1cm47IC8vIERvbid0IHBhdGNoIGFnYWluXHJcbiAgICAgICAgICAgIG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZSA9IGZ1bmN0aW9uKHByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IG9yaWdpbmFsVHlwZShwcm9wcyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlQ29sb3IgPSBzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy03XCJdID8gcHJvcHMubWVzc2FnZS5jb2xvclN0cmluZyB8fCBcIlwiIDogXCJcIjtcclxuICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnByb3BzLnN0eWxlID0ge2NvbG9yOiByb2xlQ29sb3J9O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlLl9fb3JpZ2luYWxNZXRob2QgPSBvcmlnaW5hbFR5cGU7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWVzc2FnZUNvbnRlbnQudHlwZS50eXBlLCBvcmlnaW5hbFR5cGUpO1xyXG4gICAgICAgIH19KTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVDb2xvcmVkVGV4dCgpIHtcclxuICAgICAgICBsZXQgY2xhc3NOYW1lTWFya3VwID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFya3VwKVswXS5tYXJrdXBcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLlwiK2NsYXNzTmFtZU1hcmt1cC5zcGxpdChcIiBcIilbMF0pLmZvckVhY2goZWxlbSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW0uc3R5bGUuc2V0UHJvcGVydHkoXCJjb2xvclwiLCBcIlwiKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufTsiLCJpbXBvcnQge2JkQ29uZmlnLCBiZHBsdWdpbnMsIGJkdGhlbWVzLCBzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vcGx1Z2luTW9kdWxlXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IGRhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IHsgZW5jcnlwdFNldHRpbmdzQ2FjaGUsIGRlY3J5cHRTZXR0aW5nc0NhY2hlLCBwcm9jZXNzRmlsZSB9IGZyb20gXCIuL3BsdWdpbkNlcnRpZmllclwiO1xyXG5cclxuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xyXG5jb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcclxuY29uc3QgTW9kdWxlID0gcmVxdWlyZShcIm1vZHVsZVwiKS5Nb2R1bGU7XHJcbk1vZHVsZS5nbG9iYWxQYXRocy5wdXNoKHBhdGgucmVzb2x2ZShyZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLmFwcC5nZXRBcHBQYXRoKCksIFwibm9kZV9tb2R1bGVzXCIpKTtcclxuY2xhc3MgTWV0YUVycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xyXG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiTWV0YUVycm9yXCI7XHJcbiAgICB9XHJcbn1cclxuY29uc3Qgb3JpZ2luYWxKU1JlcXVpcmUgPSBNb2R1bGUuX2V4dGVuc2lvbnNbXCIuanNcIl07XHJcbmNvbnN0IG9yaWdpbmFsQ1NTUmVxdWlyZSA9IE1vZHVsZS5fZXh0ZW5zaW9uc1tcIi5jc3NcIl0gPyBNb2R1bGUuX2V4dGVuc2lvbnNbXCIuY3NzXCJdIDogKCkgPT4ge3JldHVybiBudWxsO307XHJcbmNvbnN0IHNwbGl0UmVnZXggPSAvW15cXFNcXHJcXG5dKj8oPzpcXHJcXG58XFxuKVteXFxTXFxyXFxuXSo/XFwqW15cXFNcXHJcXG5dPy87XHJcbmNvbnN0IGVzY2FwZWRBdFJlZ2V4ID0gL15cXFxcQC87XHJcblxyXG5leHBvcnQgbGV0IGFkZG9uQ2FjaGUgPSB7fVxyXG5cclxubGV0IGhhc1BhdGNoZWQgPSBmYWxzZVxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQ29udGVudE1hbmFnZXIge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMudGltZUNhY2hlID0ge307XHJcbiAgICAgICAgdGhpcy53YXRjaGVycyA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIHBhdGNoRXh0ZW5zaW9ucygpe1xyXG4gICAgICAgIGlmKGhhc1BhdGNoZWQpcmV0dXJuXHJcbiAgICAgICAgaGFzUGF0Y2hlZCA9IHRydWVcclxuICAgICAgICBNb2R1bGUuX2V4dGVuc2lvbnNbXCIuanNcIl0gPSB0aGlzLmdldENvbnRlbnRSZXF1aXJlKFwicGx1Z2luXCIpO1xyXG4gICAgICAgIE1vZHVsZS5fZXh0ZW5zaW9uc1tcIi5jc3NcIl0gPSB0aGlzLmdldENvbnRlbnRSZXF1aXJlKFwidGhlbWVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHBsdWdpbnNGb2xkZXIoKSB7cmV0dXJuIHRoaXMuX3BsdWdpbnNGb2xkZXIgfHwgKHRoaXMuX3BsdWdpbnNGb2xkZXIgPSBmcy5yZWFscGF0aFN5bmMocGF0aC5yZXNvbHZlKGJkQ29uZmlnLmRhdGFQYXRoICsgXCJwbHVnaW5zL1wiKSkpO31cclxuICAgIGdldCB0aGVtZXNGb2xkZXIoKSB7cmV0dXJuIHRoaXMuX3RoZW1lc0ZvbGRlciB8fCAodGhpcy5fdGhlbWVzRm9sZGVyID0gZnMucmVhbHBhdGhTeW5jKHBhdGgucmVzb2x2ZShiZENvbmZpZy5kYXRhUGF0aCArIFwidGhlbWVzL1wiKSkpO31cclxuXHJcbiAgICBsb2FkQWRkb25DZXJ0aWZpZXJDYWNoZSgpe1xyXG4gICAgICAgIGlmKHR5cGVvZiBkYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwiUGx1Z2luQ2VydGlmaWVySGFzaGVzXCIpICE9PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgZGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcIlBsdWdpbkNlcnRpZmllckhhc2hlc1wiLCBlbmNyeXB0U2V0dGluZ3NDYWNoZShcInt9XCIpKVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICBhZGRvbkNhY2hlID0gSlNPTi5wYXJzZShkZWNyeXB0U2V0dGluZ3NDYWNoZShkYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwiUGx1Z2luQ2VydGlmaWVySGFzaGVzXCIpKSlcclxuICAgICAgICAgICAgfWNhdGNoKGUpe1xyXG4gICAgICAgICAgICAgICAgZGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcIlBsdWdpbkNlcnRpZmllckhhc2hlc1wiLCBlbmNyeXB0U2V0dGluZ3NDYWNoZShcInt9XCIpKVxyXG4gICAgICAgICAgICAgICAgYWRkb25DYWNoZSA9IHt9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgT2JqZWN0LmtleXMoYWRkb25DYWNoZSlcclxuICAgICAgICAuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBhZGRvbkNhY2hlW2tleV1cclxuICAgICAgICAgICAgaWYoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSlyZXR1cm4gZGVsZXRlIGFkZG9uQ2FjaGVba2V5XVxyXG5cclxuICAgICAgICAgICAgbGV0IHByb3BzID0gW3tcclxuICAgICAgICAgICAgICAgIGtleTogXCJ0aW1lc3RhbXBcIixcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCJcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAga2V5OiBcInJlc3VsdFwiLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJvYmplY3RcIlxyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICBrZXk6IFwiaGFzaFwiLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIlxyXG4gICAgICAgICAgICB9XVxyXG4gICAgICAgICAgICBmb3IobGV0IHByb3Agb2YgcHJvcHMpe1xyXG4gICAgICAgICAgICAgICAgaWYoIShwcm9wLmtleSBpbiB2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlW3Byb3Aua2V5XSAhPT0gcHJvcC50eXBlKXtcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgYWRkb25DYWNoZVtrZXldXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYodmFsdWUuaGFzaCAhPT0ga2V5KXtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBhZGRvbkNhY2hlW2tleV1cclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHZhbHVlLnJlc3VsdC5zdXNwZWN0KXsgLy8gcmVmZXRjaCBmcm9tIHJlbW90ZSB0byBiZSBzdXJlIHlvdSdyZSB1cCB0byBkYXRlLlxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGFkZG9uQ2FjaGVba2V5XVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuc2F2ZUFkZG9uQ2FjaGUoKVxyXG4gICAgfVxyXG5cclxuICAgIHNhdmVBZGRvbkNhY2hlKCl7XHJcbiAgICAgICAgZGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcIlBsdWdpbkNlcnRpZmllckhhc2hlc1wiLCBlbmNyeXB0U2V0dGluZ3NDYWNoZShKU09OLnN0cmluZ2lmeShhZGRvbkNhY2hlKSkpXHJcbiAgICB9XHJcblxyXG4gICAgd2F0Y2hDb250ZW50KGNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSBjb250ZW50VHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICBjb25zdCBmaWxlRW5kaW5nID0gaXNQbHVnaW4gPyBcIi5wbHVnaW4uanNcIiA6IFwiLnRoZW1lLmNzc1wiO1xyXG4gICAgICAgIHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdID0gZnMud2F0Y2goYmFzZUZvbGRlciwge3BlcnNpc3RlbnQ6IGZhbHNlfSwgYXN5bmMgKGV2ZW50VHlwZSwgZmlsZW5hbWUpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFldmVudFR5cGUgfHwgIWZpbGVuYW1lIHx8ICFmaWxlbmFtZS5lbmRzV2l0aChmaWxlRW5kaW5nKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgNTApKTtcclxuICAgICAgICAgICAgdHJ5IHtmcy5zdGF0U3luYyhwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTt9XHJcbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnIuY29kZSAhPT0gXCJFTk9FTlRcIikgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudGltZUNhY2hlW2ZpbGVuYW1lXTtcclxuICAgICAgICAgICAgICAgIGlmIChpc1BsdWdpbikgcmV0dXJuIHBsdWdpbk1vZHVsZS51bmxvYWRQbHVnaW4oZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoZW1lTW9kdWxlLnVubG9hZFRoZW1lKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpLmlzRmlsZSgpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSk7XHJcbiAgICAgICAgICAgIGlmICghc3RhdHMgfHwgIXN0YXRzLm10aW1lIHx8ICFzdGF0cy5tdGltZS5nZXRUaW1lKCkpIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZihzdGF0cy5tdGltZS5nZXRUaW1lKCkpICE9PSBcIm51bWJlclwiKSByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbWVDYWNoZVtmaWxlbmFtZV0gPT0gc3RhdHMubXRpbWUuZ2V0VGltZSgpKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMudGltZUNhY2hlW2ZpbGVuYW1lXSA9IHN0YXRzLm10aW1lLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBcInJlbmFtZVwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNQbHVnaW4pIGF3YWl0IHBsdWdpbk1vZHVsZS5sb2FkUGx1Z2luKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgYXdhaXQgdGhlbWVNb2R1bGUubG9hZFRoZW1lKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09IFwiY2hhbmdlXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc1BsdWdpbikgYXdhaXQgcGx1Z2luTW9kdWxlLnJlbG9hZFBsdWdpbihmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGF3YWl0IHRoZW1lTW9kdWxlLnJlbG9hZFRoZW1lKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHVud2F0Y2hDb250ZW50KGNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLndhdGNoZXJzW2NvbnRlbnRUeXBlXSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdLmNsb3NlKCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdO1xyXG4gICAgfVxyXG5cclxuICAgIGV4dHJhY3RNZXRhKGNvbnRlbnQpIHtcclxuICAgICAgICBjb25zdCBmaXJzdExpbmUgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpWzBdO1xyXG4gICAgICAgIGNvbnN0IGhhc09sZE1ldGEgPSBmaXJzdExpbmUuaW5jbHVkZXMoXCIvL01FVEFcIik7XHJcbiAgICAgICAgaWYgKGhhc09sZE1ldGEpIHJldHVybiB0aGlzLnBhcnNlT2xkTWV0YShjb250ZW50KTtcclxuICAgICAgICBjb25zdCBoYXNOZXdNZXRhID0gZmlyc3RMaW5lLmluY2x1ZGVzKFwiLyoqXCIpO1xyXG4gICAgICAgIGlmIChoYXNOZXdNZXRhKSByZXR1cm4gdGhpcy5wYXJzZU5ld01ldGEoY29udGVudCk7XHJcbiAgICAgICAgdGhyb3cgbmV3IE1ldGFFcnJvcihcIk1FVEEgd2FzIG5vdCBmb3VuZC5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcGFyc2VPbGRNZXRhKGNvbnRlbnQpIHtcclxuICAgICAgICBjb25zdCBtZXRhID0gY29udGVudC5zcGxpdChcIlxcblwiKVswXTtcclxuICAgICAgICBjb25zdCByYXdNZXRhID0gbWV0YS5zdWJzdHJpbmcobWV0YS5sYXN0SW5kZXhPZihcIi8vTUVUQVwiKSArIDYsIG1ldGEubGFzdEluZGV4T2YoXCIqLy9cIikpO1xyXG4gICAgICAgIGlmIChtZXRhLmluZGV4T2YoXCJNRVRBXCIpIDwgMCkgdGhyb3cgbmV3IE1ldGFFcnJvcihcIk1FVEEgd2FzIG5vdCBmb3VuZC5cIik7XHJcbiAgICAgICAgY29uc3QgcGFyc2VkID0gVXRpbHMudGVzdEpTT04ocmF3TWV0YSk7XHJcbiAgICAgICAgaWYgKCFwYXJzZWQpIHRocm93IG5ldyBNZXRhRXJyb3IoXCJNRVRBIGNvdWxkIG5vdCBiZSBwYXJzZWQuXCIpO1xyXG4gICAgICAgIGlmICghcGFyc2VkLm5hbWUpIHRocm93IG5ldyBNZXRhRXJyb3IoXCJNRVRBIG1pc3NpbmcgbmFtZSBkYXRhLlwiKTtcclxuICAgICAgICBwYXJzZWQuZm9ybWF0ID0gXCJqc29uXCI7XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlZDtcclxuICAgIH1cclxuXHJcbiAgICBwYXJzZU5ld01ldGEoY29udGVudCkge1xyXG4gICAgICAgIGNvbnN0IGJsb2NrID0gY29udGVudC5zcGxpdChcIi8qKlwiLCAyKVsxXS5zcGxpdChcIiovXCIsIDEpWzBdO1xyXG4gICAgICAgIGNvbnN0IG91dCA9IHt9O1xyXG4gICAgICAgIGxldCBmaWVsZCA9IFwiXCI7XHJcbiAgICAgICAgbGV0IGFjY3VtID0gXCJcIjtcclxuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgYmxvY2suc3BsaXQoc3BsaXRSZWdleCkpIHtcclxuICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoID09PSAwKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKGxpbmUuY2hhckF0KDApID09PSBcIkBcIiAmJiBsaW5lLmNoYXJBdCgxKSAhPT0gXCIgXCIpIHtcclxuICAgICAgICAgICAgICAgIG91dFtmaWVsZF0gPSBhY2N1bTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGwgPSBsaW5lLmluZGV4T2YoXCIgXCIpO1xyXG4gICAgICAgICAgICAgICAgZmllbGQgPSBsaW5lLnN1YnN0cigxLCBsIC0gMSk7XHJcbiAgICAgICAgICAgICAgICBhY2N1bSA9IGxpbmUuc3Vic3RyKGwgKyAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFjY3VtICs9IFwiIFwiICsgbGluZS5yZXBsYWNlKFwiXFxcXG5cIiwgXCJcXG5cIikucmVwbGFjZShlc2NhcGVkQXRSZWdleCwgXCJAXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG91dFtmaWVsZF0gPSBhY2N1bS50cmltKCk7XHJcbiAgICAgICAgZGVsZXRlIG91dFtcIlwiXTtcclxuICAgICAgICBvdXQuZm9ybWF0ID0gXCJqc2RvY1wiO1xyXG4gICAgICAgIHJldHVybiBvdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29udGVudFJlcXVpcmUodHlwZSkge1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBjb25zdCBvcmlnaW5hbFJlcXVpcmUgPSBpc1BsdWdpbiA/IG9yaWdpbmFsSlNSZXF1aXJlIDogb3JpZ2luYWxDU1NSZXF1aXJlO1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbihtb2R1bGUsIGZpbGVuYW1lKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJhc2VGb2xkZXIgPSBpc1BsdWdpbiA/IHNlbGYucGx1Z2luc0ZvbGRlciA6IHNlbGYudGhlbWVzRm9sZGVyO1xyXG4gICAgICAgICAgICBjb25zdCBwb3NzaWJsZVBhdGggPSBwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgcGF0aC5iYXNlbmFtZShmaWxlbmFtZSkpO1xyXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocG9zc2libGVQYXRoKSB8fCBmaWxlbmFtZSAhPT0gZnMucmVhbHBhdGhTeW5jKHBvc3NpYmxlUGF0aCkpIHJldHVybiBSZWZsZWN0LmFwcGx5KG9yaWdpbmFsUmVxdWlyZSwgdGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZW5hbWUsIFwidXRmOFwiKTtcclxuICAgICAgICAgICAgY29udGVudCA9IFV0aWxzLnN0cmlwQk9NKGNvbnRlbnQpO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBmcy5zdGF0U3luYyhmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBzZWxmLmV4dHJhY3RNZXRhKGNvbnRlbnQpO1xyXG4gICAgICAgICAgICBtZXRhLmZpbGVuYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgIG1ldGEuYWRkZWQgPSBzdGF0cy5hdGltZU1zO1xyXG4gICAgICAgICAgICBtZXRhLm1vZGlmaWVkID0gc3RhdHMubXRpbWVNcztcclxuICAgICAgICAgICAgbWV0YS5zaXplID0gc3RhdHMuc2l6ZTtcclxuICAgICAgICAgICAgaWYgKCFpc1BsdWdpbikge1xyXG4gICAgICAgICAgICAgICAgbWV0YS5jc3MgPSBjb250ZW50O1xyXG4gICAgICAgICAgICAgICAgaWYgKG1ldGEuZm9ybWF0ID09IFwianNvblwiKSBtZXRhLmNzcyA9IG1ldGEuY3NzLnNwbGl0KFwiXFxuXCIpLnNsaWNlKDEpLmpvaW4oXCJcXG5cIik7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gYG1vZHVsZS5leHBvcnRzID0gJHtKU09OLnN0cmluZ2lmeShtZXRhKX07YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaXNQbHVnaW4pIHtcclxuICAgICAgICAgICAgICAgIG1vZHVsZS5fY29tcGlsZShjb250ZW50LCBtb2R1bGUuZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGlkRXhwb3J0ID0gIVV0aWxzLmlzRW1wdHkobW9kdWxlLmV4cG9ydHMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRpZEV4cG9ydCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1ldGEudHlwZSA9IG1vZHVsZS5leHBvcnRzO1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gbWV0YTtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIFV0aWxzLndhcm4oXCJNb2R1bGUgTm90IEV4cG9ydGVkXCIsIGAke21ldGEubmFtZX0sIHBsZWFzZSBzdGFydCBzZXR0aW5nIG1vZHVsZS5leHBvcnRzYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgXFxubW9kdWxlLmV4cG9ydHMgPSAke0pTT04uc3RyaW5naWZ5KG1ldGEpfTtcXG5tb2R1bGUuZXhwb3J0cy50eXBlID0gJHttZXRhLmV4cG9ydHMgfHwgbWV0YS5uYW1lfTtgO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG1vZHVsZS5fY29tcGlsZShjb250ZW50LCBmaWxlbmFtZSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBtYWtlUGxhY2Vob2xkZXJQbHVnaW4oZGF0YSkge1xyXG4gICAgICAgIHJldHVybiB7cGx1Z2luOiB7XHJcbiAgICAgICAgICAgICAgICBzdGFydDogKCkgPT4ge30sXHJcbiAgICAgICAgICAgICAgICBnZXROYW1lOiAoKSA9PiB7cmV0dXJuIGRhdGEubmFtZSB8fCBkYXRhLmZpbGVuYW1lO30sXHJcbiAgICAgICAgICAgICAgICBnZXRBdXRob3I6ICgpID0+IHtyZXR1cm4gXCI/Pz9cIjt9LFxyXG4gICAgICAgICAgICAgICAgZ2V0RGVzY3JpcHRpb246ICgpID0+IHtyZXR1cm4gZGF0YS5tZXNzYWdlID8gZGF0YS5tZXNzYWdlIDogXCJUaGlzIHBsdWdpbiB3YXMgdW5hYmxlIHRvIGJlIGxvYWRlZC4gQ2hlY2sgdGhlIGF1dGhvcidzIHBhZ2UgZm9yIHVwZGF0ZXMuXCI7fSxcclxuICAgICAgICAgICAgICAgIGdldFZlcnNpb246ICgpID0+IHtyZXR1cm4gXCI/Pz9cIjt9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG5hbWU6IGRhdGEubmFtZSB8fCBkYXRhLmZpbGVuYW1lLFxyXG4gICAgICAgICAgICBmaWxlbmFtZTogZGF0YS5maWxlbmFtZSxcclxuICAgICAgICAgICAgc291cmNlOiBkYXRhLnNvdXJjZSA/IGRhdGEuc291cmNlIDogXCJcIixcclxuICAgICAgICAgICAgd2Vic2l0ZTogZGF0YS53ZWJzaXRlID8gZGF0YS53ZWJzaXRlIDogXCJcIlxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKGZpbGVuYW1lKSA9PT0gXCJ1bmRlZmluZWRcIiB8fCB0eXBlb2YodHlwZSkgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcblxyXG4gICAgICAgIGlmKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy02XCJdKXtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0ZpbGUocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSwgKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdClcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdClcclxuICAgICAgICAgICAgICAgIH0sIChoYXNoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlY3Q6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiBoYXNoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogZmlsZW5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGZpbGVuYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH0sIHRydWUpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGlmKHJlc3VsdCl7XHJcbiAgICAgICAgICAgICAgICBhZGRvbkNhY2hlW3Jlc3VsdC5oYXNoXSA9IHtcclxuICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXHJcbiAgICAgICAgICAgICAgICAgICAgaGFzaDogcmVzdWx0Lmhhc2gsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiByZXN1bHRcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUFkZG9uQ2FjaGUoKVxyXG4gICAgICAgICAgICAgICAgaWYocmVzdWx0LnN1c3BlY3Qpe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGZpbGVuYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBmaWxlbmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXCJUaGlzIHBsdWdpbiBtaWdodCBiZSBkYW5nZXJvdXMgKFwiK3Jlc3VsdC5oYXJtK1wiKS5cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcIlRoaXMgcGx1Z2luIG1pZ2h0IGJlIGRhbmdlcm91cyAoXCIrcmVzdWx0Lmhhcm0rXCIpLlwiKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHt3aW5kb3cucmVxdWlyZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTt9XHJcbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7cmV0dXJuIHtuYW1lOiBmaWxlbmFtZSwgZmlsZTogZmlsZW5hbWUsIG1lc3NhZ2U6IFwiQ291bGQgbm90IGJlIGNvbXBpbGVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsIHN0YWNrOiBlcnJvci5zdGFja319O31cclxuICAgICAgICBjb25zdCBjb250ZW50ID0gd2luZG93LnJlcXVpcmUocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSk7XHJcbiAgICAgICAgaWYoIWNvbnRlbnQubmFtZSlyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJDYW5ub3QgZXNjYXBlIHRoZSBJRC5cIiwgZXJyb3I6IG5ldyBFcnJvcihcIkNhbm5vdCByZWFkIHByb3BlcnR5ICdyZXBsYWNlJyBvZiB1bmRlZmluZWRcIil9XHJcbiAgICAgICAgY29udGVudC5pZCA9IFV0aWxzLmVzY2FwZUlEKGNvbnRlbnQubmFtZSk7XHJcbiAgICAgICAgLy9pZighaWQpcmV0dXJuIHtuYW1lOiBmaWxlbmFtZSwgZmlsZTogZmlsZW5hbWUsIG1lc3NhZ2U6IFwiSW52YWxpZCBJRFwiLCBlcnJvcjogbmV3IEVycm9yKFwiUGxlYXNlIGZpeCB0aGUgbmFtZSBvZiBcIitmaWxlbmFtZStcIi4gQmV0dGVyRGlzY29yZCBjYW4ndCBlc2NhcGUgYW4gSUQuXCIpfVxyXG4gICAgICAgIGlmIChpc1BsdWdpbikge1xyXG4gICAgICAgICAgICBpZiAoIWNvbnRlbnQudHlwZSkgcmV0dXJuO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29udGVudC5wbHVnaW4gPSBuZXcgY29udGVudC50eXBlKCk7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgYmRwbHVnaW5zW2NvbnRlbnQucGx1Z2luLmdldE5hbWUoKV07XHJcbiAgICAgICAgICAgICAgICBiZHBsdWdpbnNbY29udGVudC5wbHVnaW4uZ2V0TmFtZSgpXSA9IGNvbnRlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7cmV0dXJuIHtuYW1lOiBmaWxlbmFtZSwgZmlsZTogZmlsZW5hbWUsIG1lc3NhZ2U6IFwiQ291bGQgbm90IGJlIGNvbnN0cnVjdGVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsIHN0YWNrOiBlcnJvci5zdGFja319O31cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBiZHRoZW1lc1tjb250ZW50Lm5hbWVdO1xyXG4gICAgICAgICAgICBiZHRoZW1lc1tjb250ZW50Lm5hbWVdID0gY29udGVudDtcclxuICAgICAgICB9XHJcbiAgICB9ICAgXHJcblxyXG4gICAgdW5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YoZmlsZW5hbWUpID09PSBcInVuZGVmaW5lZFwiIHx8IHR5cGVvZih0eXBlKSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBkZWxldGUgd2luZG93LnJlcXVpcmUuY2FjaGVbd2luZG93LnJlcXVpcmUucmVzb2x2ZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHtyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJDb3VsZCBub3QgYmUgdW5sb2FkZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyLm1lc3NhZ2UsIHN0YWNrOiBlcnIuc3RhY2t9fTt9XHJcbiAgICB9XHJcblxyXG4gICAgaXNMb2FkZWQoZmlsZW5hbWUsIHR5cGUpIHtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgdHJ5IHt3aW5kb3cucmVxdWlyZS5jYWNoZVt3aW5kb3cucmVxdWlyZS5yZXNvbHZlKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpXTt9XHJcbiAgICAgICAgY2F0Y2ggKGVycikge3JldHVybiBmYWxzZTt9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcmVsb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSkge1xyXG4gICAgICAgIGNvbnN0IGNhbnRVbmxvYWQgPSB0aGlzLnVubG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpO1xyXG4gICAgICAgIGlmIChjYW50VW5sb2FkKSByZXR1cm4gY2FudFVubG9hZDtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZE5ld0NvbnRlbnQodHlwZSkge1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBmaWxlRW5kaW5nID0gaXNQbHVnaW4gPyBcIi5wbHVnaW4uanNcIiA6IFwiLnRoZW1lLmNzc1wiO1xyXG4gICAgICAgIGNvbnN0IGJhc2VkaXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xyXG4gICAgICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmMoYmFzZWRpcik7XHJcbiAgICAgICAgY29uc3QgY29udGVudExpc3QgPSBPYmplY3QudmFsdWVzKGlzUGx1Z2luID8gYmRwbHVnaW5zIDogYmR0aGVtZXMpO1xyXG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSBjb250ZW50TGlzdC5maWx0ZXIodCA9PiAhZmlsZXMuaW5jbHVkZXModC5maWxlbmFtZSkpLm1hcChjID0+IGlzUGx1Z2luID8gYy5wbHVnaW4uZ2V0TmFtZSgpIDogYy5uYW1lKTtcclxuICAgICAgICBjb25zdCBhZGRlZCA9IGZpbGVzLmZpbHRlcihmID0+ICFjb250ZW50TGlzdC5maW5kKHQgPT4gdC5maWxlbmFtZSA9PSBmKSAmJiBmLmVuZHNXaXRoKGZpbGVFbmRpbmcpICYmIGZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlZGlyLCBmKSkuaXNGaWxlKCkpO1xyXG4gICAgICAgIHJldHVybiB7YWRkZWQsIHJlbW92ZWR9O1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvYWRBbGxDb250ZW50KHR5cGUpIHtcclxuICAgICAgICB0aGlzLnBhdGNoRXh0ZW5zaW9ucygpXHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGZpbGVFbmRpbmcgPSBpc1BsdWdpbiA/IFwiLnBsdWdpbi5qc1wiIDogXCIudGhlbWUuY3NzXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZWRpciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgY29uc3QgZXJyb3JzID0gW107XHJcbiAgICAgICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhiYXNlZGlyKTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmaWxlcykge1xyXG4gICAgICAgICAgICBpZiAoIWZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlZGlyLCBmaWxlbmFtZSkpLmlzRmlsZSgpIHx8ICFmaWxlbmFtZS5lbmRzV2l0aChmaWxlRW5kaW5nKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgdGhpcy5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSk7XHJcbiAgICAgICAgICAgIGlmIChlcnJvcikgZXJyb3JzLnB1c2goZXJyb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVycm9ycztcclxuICAgIH1cclxuXHJcbiAgICBsb2FkUGx1Z2lucygpIHtyZXR1cm4gdGhpcy5sb2FkQWxsQ29udGVudChcInBsdWdpblwiKTt9XHJcbiAgICBsb2FkVGhlbWVzKCkge3JldHVybiB0aGlzLmxvYWRBbGxDb250ZW50KFwidGhlbWVcIik7fVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIERvbid0IGV4cG9zZSBjb250ZW50TWFuYWdlciAtIGNvdWxkIGJlIGRhbmdlcm91cyBmb3Igbm93XHJcbiAqLyIsImltcG9ydCB7YmRDb25maWcsIG1pblN1cHBvcnRlZFZlcnNpb24sIGJiZFZlcnNpb24sIHNldHRpbmdzQ29va2llLCBiZHBsdWdpbkVycm9ycywgYmR0aGVtZUVycm9ycywgYmJkQ2hhbmdlbG9nLCBkZWZhdWx0Q29va2llLCBjdXJyZW50RGlzY29yZFZlcnNpb24sIGRlZmF1bHRSUEMsIHNldHRpbmdzUlBDfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgc2V0dGluZ3NQYW5lbCBmcm9tIFwiLi9zZXR0aW5nc1BhbmVsXCI7XHJcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vcGx1Z2luTW9kdWxlXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuaW1wb3J0IEJETG9nbyBmcm9tIFwiLi4vdWkvYmRMb2dvXCI7XHJcbmltcG9ydCBUb29sdGlwV3JhcCBmcm9tIFwiLi4vdWkvdG9vbHRpcFdyYXBcIjtcclxuaW1wb3J0IExpZ2h0Y29yZExvZ28gZnJvbSBcIi4uL3N2Zy9saWdodGNvcmRcIjtcclxuaW1wb3J0IFBsdWdpbkNlcnRpZmllciBmcm9tIFwiLi9wbHVnaW5DZXJ0aWZpZXJcIjtcclxuaW1wb3J0IGRpc3RhbnQsIHsgdXVpZHY0IH0gZnJvbSBcIi4vZGlzdGFudFwiO1xyXG5pbXBvcnQgRW1vamlNb2R1bGUgZnJvbSBcIi4vZW1vamlNb2R1bGVcIlxyXG5pbXBvcnQge3JlbW90ZSBhcyBlbGVjdHJvbn0gZnJvbSBcImVsZWN0cm9uXCJcclxuaW1wb3J0IHYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBjb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5cclxubGV0IG1ldGhvZHNcclxuZnVuY3Rpb24gQ29yZSgpIHt9XHJcblxyXG5cclxuQ29yZS5wcm90b3R5cGUuc2V0Q29uZmlnID0gZnVuY3Rpb24oY29uZmlnKSB7XHJcbiAgICBpZiAodGhpcy5oYXNTdGFydGVkKSByZXR1cm47XHJcbiAgICBPYmplY3QuYXNzaWduKGJkQ29uZmlnLCBjb25maWcpO1xyXG59O1xyXG5cclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KENvcmUucHJvdG90eXBlLCBcIm1ldGhvZHNcIiwge1xyXG4gICAgZ2V0KCl7XHJcbiAgICAgICAgcmV0dXJuIG1ldGhvZHNcclxuICAgIH1cclxufSlcclxuXHJcbkNvcmUucHJvdG90eXBlLnNldE1ldGhvZHMgPSBmdW5jdGlvbihtKSB7XHJcbiAgICBpZiAodGhpcy5oYXNTdGFydGVkKSByZXR1cm47XHJcbiAgICBtZXRob2RzID0gbVxyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUuaW5pdCA9IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuaGFzU3RhcnRlZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5oYXNTdGFydGVkID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAoIUFycmF5LnByb3RvdHlwZS5mbGF0KSB7XHJcbiAgICAgICAgVXRpbHMuYWxlcnQoXCJOb3QgU3VwcG9ydGVkXCIsIFwiQmV0dGVyRGlzY29yZCB2XCIgKyBiYmRWZXJzaW9uICsgXCIgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9sZCB2ZXJzaW9uIChcIiArIGN1cnJlbnREaXNjb3JkVmVyc2lvbiArIFwiKSBvZiBEaXNjb3JkLiBQbGVhc2UgdXBkYXRlIHlvdXIgRGlzY29yZCBpbnN0YWxsYXRpb24gYmVmb3JlIHByb2NlZWRpbmcuXCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYmRDb25maWcudmVyc2lvbiA8IG1pblN1cHBvcnRlZFZlcnNpb24pIHtcclxuICAgICAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCZXR0ZXJEaXNjb3JkIHZcIiArIGJkQ29uZmlnLnZlcnNpb24gKyBcIiAoeW91ciB2ZXJzaW9uKVwiICsgXCIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgbGF0ZXN0IGpzIChcIiArIGJiZFZlcnNpb24gKyBcIikuPGJyPjxicj4gUGxlYXNlIGRvd25sb2FkIHRoZSBsYXRlc3QgdmVyc2lvbiBmcm9tIDxhIGhyZWY9J2h0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvcmVsZWFzZXMvbGF0ZXN0JyB0YXJnZXQ9J19ibGFuayc+R2l0SHViPC9hPlwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHdpbmRvdy5FRCkge1xyXG4gICAgICAgIFV0aWxzLmFsZXJ0KFwiTm90IFN1cHBvcnRlZFwiLCBcIkJhbmRhZ2VkQkQgZG9lcyBub3Qgd29yayB3aXRoIEVuaGFuY2VkRGlzY29yZC4gUGxlYXNlIHVuaW5zdGFsbCBvbmUgb2YgdGhlbS5cIik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh3aW5kb3cuV2ViU29ja2V0ICYmIHdpbmRvdy5XZWJTb2NrZXQubmFtZSAmJiB3aW5kb3cuV2ViU29ja2V0Lm5hbWUuaW5jbHVkZXMoXCJQYXRjaGVkXCIpKSB7XHJcbiAgICAgICAgVXRpbHMuYWxlcnQoXCJOb3QgU3VwcG9ydGVkXCIsIFwiQmFuZGFnZWRCRCBkb2VzIG5vdCB3b3JrIHdpdGggUG93ZXJjb3JkLiBQbGVhc2UgdW5pbnN0YWxsIG9uZSBvZiB0aGVtLlwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEF0dHJpYnV0ZXMuYmluZCh0aGlzKSwgXCJMQyBQbHVnaW4gQ2VydGlmaWVyIFBhdGNoXCIpKCk7XHJcblxyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkluaXRpYWxpemluZyBTZXR0aW5nc1wiKTtcclxuICAgIHRoaXMuaW5pdFNldHRpbmdzKCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5jaGVja0Zvckd1aWxkcygpO1xyXG4gICAgQkRWMi5pbml0aWFsaXplKCk7XHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiVXBkYXRpbmcgU2V0dGluZ3NcIik7XHJcbiAgICBzZXR0aW5nc1BhbmVsLmluaXRpYWxpemVTZXR0aW5ncygpO1xyXG5cclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJMb2FkaW5nIEFkZG9ucyBDYWNoZVwiKVxyXG4gICAgYXdhaXQgY29udGVudE1hbmFnZXIubG9hZEFkZG9uQ2VydGlmaWVyQ2FjaGUoKVxyXG5cclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJMb2FkaW5nIFBsdWdpbnNcIik7XHJcbiAgICBhd2FpdCBwbHVnaW5Nb2R1bGUubG9hZFBsdWdpbnMoKTtcclxuXHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiTG9hZGluZyBUaGVtZXNcIik7XHJcbiAgICBhd2FpdCB0aGVtZU1vZHVsZS5sb2FkVGhlbWVzKCk7XHJcblxyXG4gICAgRE9NLmFkZFN0eWxlKFwiY3VzdG9tY3NzXCIsIEJ1ZmZlci5mcm9tKERhdGFTdG9yZS5nZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiKSwgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJ1dGY4XCIpKTtcclxuXHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCBmdW5jdGlvbigpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZGMtMFwiXSkgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5idG4uYnRuLWRpc2Nvbm5lY3RcIikuY2xpY2soKTtcclxuICAgIH0pO1xyXG5cclxuICAgIFBsdWdpbkNlcnRpZmllci5zdGFydCgpXHJcblxyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIlJlbW92aW5nIExvYWRpbmcgSWNvblwiKTtcclxuICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiYmQtbG9hZGVydjJcIikubGVuZ3RoKSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiYmQtbG9hZGVydjJcIilbMF0ucmVtb3ZlKCk7XHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiSW5pdGlhbGl6aW5nIE1haW4gT2JzZXJ2ZXJcIik7XHJcbiAgICB0aGlzLmluaXRPYnNlcnZlcigpO1xyXG5cclxuICAgIC8vIFNob3cgbG9hZGluZyBlcnJvcnNcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkge1xyXG4gICAgICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJDb2xsZWN0aW5nIFN0YXJ0dXAgRXJyb3JzXCIpO1xyXG4gICAgICAgIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBiZHBsdWdpbkVycm9ycywgdGhlbWVzOiBiZHRoZW1lRXJyb3JzfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcHJldmlvdXNWZXJzaW9uID0gRGF0YVN0b3JlLmdldEJERGF0YShcInZlcnNpb25cIik7XHJcbiAgICBpZiAoYmJkVmVyc2lvbiA+IHByZXZpb3VzVmVyc2lvbikge1xyXG4gICAgICAgIGlmIChiYmRDaGFuZ2Vsb2cpIHRoaXMuc2hvd0NoYW5nZWxvZ01vZGFsKGJiZENoYW5nZWxvZyk7XHJcbiAgICAgICAgRGF0YVN0b3JlLnNldEJERGF0YShcInZlcnNpb25cIiwgYmJkVmVyc2lvbik7XHJcbiAgICB9XHJcblxyXG4gICAgRW1vamlNb2R1bGUuc3RhcnQoKVxyXG5cclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hTb2NpYWwuYmluZCh0aGlzKSwgXCJCRCBTb2NpYWwgUGF0Y2hcIikoKTtcclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hHdWlsZFBpbGxzLmJpbmQodGhpcyksIFwiQkQgR3VpbGQgUGlsbHMgUGF0Y2hcIikoKTtcclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hHdWlsZExpc3RJdGVtcy5iaW5kKHRoaXMpLCBcIkJEIEd1aWxkIExpc3QgSXRlbXMgUGF0Y2hcIikoKTtcclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hHdWlsZFNlcGFyYXRvci5iaW5kKHRoaXMpLCBcIkJEIEd1aWxkIFNlcGFyYXRvciBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaE1lc3NhZ2VIZWFkZXIuYmluZCh0aGlzKSwgXCJCRCBCYWRnZSBDaGF0IFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoTWVtYmVyTGlzdC5iaW5kKHRoaXMpLCBcIkJEIEJhZGdlIE1lbWJlciBMaXN0IFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoQXR0YWNobWVudC5iaW5kKHRoaXMpLCBcIkxDIFBsdWdpbiBDZXJ0aWZpZXIgUGF0Y2hcIikoKTtcclxuXHJcbiAgICBpZihiZENvbmZpZy5oYXZlSW5zdGFsbGVkRGVmYXVsdCl7XHJcbiAgICAgICAgbGV0IGFsZXJ0ID0gVXRpbHMuYWxlcnQoXCJGaXJzdCBJbnN0YWxsYXRpb25cIiwgXCJBcyBpdCBpcyB0aGUgZmlyc3QgdGltZSB5b3UgaW5zdGFsbCBMaWdodGNvcmQsIFdlIGFkZGVkIHR3byBkZWZhdWx0IHRoZW1lcyBhbmQgb25lIGRlZmF1bHQgcGx1Z2luIGluIHlvdXIgcGx1Z2luL3RoZW1lIGZvbGRlci4gQ2hlY2sgaXQgaW4gdGhlIFBsdWdpbi9UaGVtZSBzZXR0aW5ncy5cIilcclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICBhbGVydC5vbkNsb3NlKHJlc29sdmUpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgIGNvbnN0IGxvZ28gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2FwcC1tb3VudCA+IGRpdi50eXBlV2luZG93cy0xemEtbjcud2l0aEZyYW1lLWhhWWx0SS50aXRsZUJhci1BQzRwR1YuaG9yaXpvbnRhbFJldmVyc2UtM3RSalk3LmZsZXgtMU8xR0tZLmRpcmVjdGlvblJvd1JldmVyc2UtbThJaklxLmp1c3RpZnlTdGFydC0yTkRGemkuYWxpZ25TdHJldGNoLURwR1BmMy5kYS10eXBlV2luZG93cy5kYS13aXRoRnJhbWUuZGEtdGl0bGVCYXIuZGEtaG9yaXpvbnRhbFJldmVyc2UuZGEtZmxleC5kYS1kaXJlY3Rpb25Sb3dSZXZlcnNlLmRhLWp1c3RpZnlTdGFydC5kYS1hbGlnblN0cmV0Y2ggPiBkaXYud29yZG1hcmtXaW5kb3dzLTF2MGxZRC53b3JkbWFyay0yaUREZm0uZGEtd29yZG1hcmtXaW5kb3dzLmRhLXdvcmRtYXJrXCIpXHJcbiAgICBpZihsb2dvKXtcclxuICAgICAgICBsb2dvLnN0eWxlLnRvcCA9IFwiM3B4XCJcclxuICAgICAgICBsb2dvLmlubmVySFRNTCA9IGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBoZWlnaHQ9XCIxMFwiIHdpZHRoPVwiNzBcIiB2aWV3Qm94PVwiMCAwIDcyLjU0IDEwXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogLTVweCwgbWFyZ2luLXRvcDogMTBweFwiPlxyXG4gICAgPHBhdGggZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNNDQuODEsOS42N1Y2LjMzYzAtMS4yMSwyLjEzLTEuNDksMi43OC0uMjhsMi0uODFBMy41MywzLjUzLDAsMCwwLDQ2LjIsM2MtMS45MiwwLTMuODEsMS4xMy0zLjgxLDMuMzNWOS42N2MwLDIuMjEsMS44OSwzLjMzLDMuNzcsMy4zM2EzLjg3LDMuODcsMCwwLDAsMy40NS0yLjE4bC0yLjEyLTFDNDcsMTEuMTcsNDQuODEsMTAuODUsNDQuODEsOS42N1pNMTAuNjgsMTIuODloMi40MVYzLjE3SDEwLjY4Wk03MS43NiwzLjE0SDY4LjE5VjcuMjNMNzAuNTcsOS40di00aDEuMjdjLjgxLDAsMS4yMS40MSwxLjIxLDF2M2MwLC42My0uMzgsMS4wNS0xLjIxLDEuMDVINjguMTh2Mi4zMWgzLjU3YzEuOTIsMCwzLjcyLTEsMy43Mi0zLjJWNi4zOUM3NS40OCw0LjEzLDczLjY4LDMuMTQsNzEuNzYsMy4xNFpNNTQuMjIsM2MtMiwwLTQsMS4xLTQsMy4zNFY5LjY2YzAsMi4yMywyLDMuMzQsNCwzLjM0czMuOTUtMS4xMSwzLjk1LTMuMzRWNi4zNEM1OC4xOSw0LjExLDU2LjIsMyw1NC4yMiwzWm0xLjU1LDYuNjZjMCwuNy0uNzgsMS4wNi0xLjU0LDEuMDZzLTEuNTUtLjM1LTEuNTUtMS4wNlY2LjM0YzAtLjcyLjc1LTEuMSwxLjUtMS4xczEuNTkuMzUsMS41OSwxLjFaTTY2Ljg0LDYuMzRjMC0yLjI5LTEuNTgtMy4yLTMuNTUtMy4ySDU5LjQ2djkuNzNoMi40NVY5Ljc3aC40M2wyLjIyLDMuMDloM0w2NSw5LjUyQzY2LjEzLDkuMTUsNjYuODQsOC4xNCw2Ni44NCw2LjM0Wk02My4zMyw3LjY1SDYxLjkxVjUuNDNoMS40MkExLjExLDEuMTEsMCwxLDEsNjMuMzMsNy42NVpNMjkuODMsMTNoMi40MlYzLjA2SDI5LjgzVjYuNzNsLTMsMFYzLjA5SDI0Ljd2OS43OGgyLjE0VjguNjhsMywwWk0xNy4xNiw5Ljc2VjYuNDJjMC0xLjIxLDIuMTMtMS40OSwyLjc4LS4yOGwyLS44MWEzLjU1LDMuNTUsMCwwLDAtMy4zNi0yLjI0Yy0xLjkyLDAtMy44MSwxLjEzLTMuODEsMy4zM1Y5Ljc2YzAsMi4yMSwyLDMuMTUsMy45LDMuMTVzMy41OC0xLDMuNTgtM1Y3LjU4SDE4Ljc5bDAsMS4zNkgyMC4zdi43N0MyMC4zLDEwLjkyLDE3LjE2LDEwLjk0LDE3LjE2LDkuNzZaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC0yLjkzIC0zKVwiLz5cclxuICAgIDxwb2x5Z29uIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBwb2ludHM9XCIzNS45MSAwLjA2IDM4LjQzIDAuMDYgMzguNDMgMS44NCAzNS45MiAxLjgxIDM1Ljk3IDEwIDMzLjU1IDEwIDMzLjQ5IDEuNzUgMzAuOTggMS43NCAzMC45OCAwLjA2IDMzLjQ5IDAuMDYgMzUuOTEgMC4wNlwiLz5cclxuICAgIDxwb2x5Z29uIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBwb2ludHM9XCIwIDkuOTcgNi41IDEwIDYuNSA3LjYzIDIuNDEgNy42MyAyLjQxIDAuMjYgMCAyLjI2IDAgOS45N1wiLz5cclxuPC9zdmc+YFxyXG4gICAgfVxyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hBdHRyaWJ1dGVzID0gYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICBsZXQgYXR0cmlic1BhdGNocyA9IFtdXHJcbiAgICB0aGlzLmNhbmNlbFBhdGNoQXR0cmlidXRlcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGF0dHJpYnNQYXRjaHMuZm9yRWFjaChlID0+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+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkcGx1Z2luc1tmaWxlbmFtZU9yTmFtZV07XG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVxdWlyZShcInBhdGhcIikucmVzb2x2ZShDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyLCBiZHBsdWdpbi5maWxlbmFtZSk7XG4gICAgY29uc29sZS5sb2coXCJFZGl0IFwiICsgZnVsbFBhdGgpO1xuICAgIHJlcXVpcmUoXCJlbGVjdHJvblwiKS5zaGVsbC5vcGVuSXRlbShgJHtmdWxsUGF0aH1gKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUudXBkYXRlUGx1Z2luTGlzdCA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBDb250ZW50TWFuYWdlci5sb2FkTmV3Q29udGVudChcInBsdWdpblwiKTtcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIHJlc3VsdHMuYWRkZWQpIHRoaXMubG9hZFBsdWdpbihmaWxlbmFtZSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHJlc3VsdHMucmVtb3ZlZCkgdGhpcy51bmxvYWRQbHVnaW4obmFtZSk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmxvYWRQbHVnaW5EYXRhID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHNhdmVkID0gRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInBsdWdpbnNcIik7XG4gICAgaWYgKHNhdmVkKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocGx1Z2luQ29va2llLCBzYXZlZCk7XG4gICAgfVxufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5zYXZlUGx1Z2luRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICBEYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwicGx1Z2luc1wiLCBwbHVnaW5Db29raWUpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5uZXdNZXNzYWdlID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHBsdWdpbnMgPSBPYmplY3Qua2V5cyhiZHBsdWdpbnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbnNbcGx1Z2luc1tpXV0ucGx1Z2luO1xuICAgICAgICBpZiAoIXBsdWdpbkNvb2tpZVtwbHVnaW4uZ2V0TmFtZSgpXSkgY29udGludWU7XG4gICAgICAgIGlmICh0eXBlb2YgcGx1Z2luLm9uTWVzc2FnZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0cnkgeyBwbHVnaW4ub25NZXNzYWdlKCk7IH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBcIlVuYWJsZSB0byBmaXJlIG9uTWVzc2FnZSBmb3IgXCIgKyBwbHVnaW4uZ2V0TmFtZSgpICsgXCIuXCIsIGVycik7IH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuY2hhbm5lbFN3aXRjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmtleXMoYmRwbHVnaW5zKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW5zW3BsdWdpbnNbaV1dLnBsdWdpbjtcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbcGx1Z2luLmdldE5hbWUoKV0pIGNvbnRpbnVlO1xuICAgICAgICBpZiAodHlwZW9mIHBsdWdpbi5vblN3aXRjaCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0cnkgeyBwbHVnaW4ub25Td2l0Y2goKTsgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikgeyBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIFwiVW5hYmxlIHRvIGZpcmUgb25Td2l0Y2ggZm9yIFwiICsgcGx1Z2luLmdldE5hbWUoKSArIFwiLlwiLCBlcnIpOyB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnJhd09ic2VydmVyID0gZnVuY3Rpb24oZSkge1xuICAgIGNvbnN0IHBsdWdpbnMgPSBPYmplY3Qua2V5cyhiZHBsdWdpbnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbnNbcGx1Z2luc1tpXV0ucGx1Z2luO1xuICAgICAgICBpZiAoIXBsdWdpbkNvb2tpZVtwbHVnaW4uZ2V0TmFtZSgpXSkgY29udGludWU7XG4gICAgICAgIGlmICh0eXBlb2YgcGx1Z2luLm9ic2VydmVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRyeSB7IHBsdWdpbi5vYnNlcnZlcihlKTsgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikgeyBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIFwiVW5hYmxlIHRvIGZpcmUgb2JzZXJ2ZXIgZm9yIFwiICsgcGx1Z2luLmdldE5hbWUoKSArIFwiLlwiLCBlcnIpOyB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgUGx1Z2luTW9kdWxlKCk7IiwiaW1wb3J0IHsgdGhlbWVDb29raWUgfSBmcm9tIFwiLi4vMGdsb2JhbHNcIlxyXG5pbXBvcnQgYmRFdmVudHMgZnJvbSBcIi4vYmRFdmVudHNcIlxyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCJcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBwb3BvdXRXaW5kb3cge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAdHlwZSB7TWFwPHN0cmluZywgV2luZG93Pn1cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLndpbmRvd3MgPSBuZXcgTWFwKClcclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxyXG4gICAgICAgIHRoaXMuaW5pdCgpXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdCgpe1xyXG4gICAgICAgIGxldCBwb3BvdXRNb2R1bGUgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0V2luZG93KVxyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuRGlzY29yZE1vZHVsZXMuZGlzcGF0Y2hlci5zdWJzY3JpYmUoXCJQT1BPVVRfV0lORE9XX09QRU5cIiwgKGV2KSA9PiB7XHJcbiAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIEB0eXBlIHtXaW5kb3d9XHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGNvbnN0IHdpbmRvdyA9IHBvcG91dE1vZHVsZS5kZWZhdWx0LmdldFdpbmRvdyhldi5rZXkpXHJcbiAgICAgICAgICAgICAgICB0aGlzLndpbmRvd3Muc2V0KGV2LmtleSwgd2luZG93KVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBjbGFzc0xpc3QgPSB3aW5kb3cuZG9jdW1lbnQuYm9keS5jbGFzc0xpc3RcclxuICAgICAgICAgICAgICAgIGNsYXNzTGlzdC5hZGQoXCJ3aW5kb3ctcG9wb3V0XCIpXHJcbiAgICAgICAgICAgICAgICBjbGFzc0xpc3QuYWRkKFwibGlnaHRjb3JkXCIpXHJcbiAgICAgICAgICAgICAgICBjbGFzc0xpc3QuYWRkKFwibGlnaHRjb3JkXCIpXHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoZXYua2V5KVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5EaXNjb3JkTW9kdWxlcy5kaXNwYXRjaGVyLnN1YnNjcmliZShcIlBPUE9VVF9XSU5ET1dfQ0xPU0VcIiwgKGV2KSA9PiB7XHJcbiAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndpbmRvd3MuZGVsZXRlKGV2LmtleSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgICAgIGJkRXZlbnRzLm9uKFwidGhlbWUtZW5hYmxlZFwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKClcclxuICAgICAgICB9KVxyXG4gICAgICAgIGJkRXZlbnRzLm9uKFwidGhlbWUtZGlzYWJsZWRcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpXHJcbiAgICAgICAgfSlcclxuICAgICAgICBiZEV2ZW50cy5vbihcInRoZW1lLXJlbG9hZGVkXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGUoKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgYmRFdmVudHMub24oXCJ0aGVtZS11bmxvYWRlZFwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKClcclxuICAgICAgICB9KVxyXG4gICAgICAgIGJkRXZlbnRzLm9uKFwidGhlbWUtbG9hZGVkXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGUoKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKCl7XHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxyXG4gICAgICAgIHRoaXMudXBkYXRlKClcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKCl7XHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgICAgICB0aGlzLnVwZGF0ZSgpXHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlKGtleSl7XHJcbiAgICAgICAgaWYoIXRoaXMud2luZG93cy5zaXplKXJldHVyblxyXG4gICAgICAgIGlmKCF0aGlzLmVuYWJsZWQpe1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVUaGVtZXMoa2V5KVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcHBseVRoZW1lcyhrZXkpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZVRoZW1lcyhrZXkpe1xyXG4gICAgICAgIGlmKHRoaXMuZW5hYmxlZClyZXR1cm5cclxuICAgICAgICBpZihrZXkpe1xyXG4gICAgICAgICAgICBsZXQgd2luZG93ID0gdGhpcy53aW5kb3dzLmdldChrZXkpXHJcbiAgICAgICAgICAgIGlmKCF3aW5kb3cpcmV0dXJuXHJcbiAgICAgICAgICAgIGxldCBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudFxyXG5cclxuICAgICAgICAgICAgZm9yKGxldCBzdHlsZSBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwic3R5bGVbZGF0YS1saWdodGNvcmQtdGhlbWU9dHJ1ZV1cIikpe1xyXG4gICAgICAgICAgICAgICAgc3R5bGUucmVtb3ZlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBmb3IobGV0IGtleSBvZiB0aGlzLndpbmRvd3Mua2V5cygpKXtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlVGhlbWVzKGtleSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcHBseVRoZW1lcyhrZXkpe1xyXG4gICAgICAgIGlmKCF0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgaWYoa2V5KXtcclxuICAgICAgICAgICAgbGV0IHdpbmRvdyA9IHRoaXMud2luZG93cy5nZXQoa2V5KVxyXG4gICAgICAgICAgICBpZighd2luZG93KXJldHVyblxyXG4gICAgICAgICAgICBsZXQgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnRcclxuXHJcbiAgICAgICAgICAgIGZvcihsZXQgc3R5bGUgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcInN0eWxlW2RhdGEtbGlnaHRjb3JkLXRoZW1lPXRydWVdXCIpKXtcclxuICAgICAgICAgICAgICAgIHN0eWxlLnNldEF0dHJpYnV0ZShcIndpbGwtcmVtb3ZlXCIsIFwidHJ1ZVwiKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhiZHRoZW1lcylcclxuICAgICAgICAgICAgLmZvckVhY2godGhlbWVOYW1lID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKCF0aGVtZUNvb2tpZVt0aGVtZU5hbWVdKXJldHVybiAvLyB0aGVtZSBkaXNhYmxlZFxyXG4gICAgICAgICAgICAgICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lc1t0aGVtZU5hbWVdXHJcbiAgICAgICAgICAgICAgICBpZighdGhlbWUpcmV0dXJuIC8vOnNocnVnOlxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJzdHlsZVtkYXRhLWxpZ2h0Y29yZC10aGVtZT10cnVlXSNcIitET00uZXNjYXBlSUQodGhlbWUuaWQpKVxyXG4gICAgICAgICAgICAgICAgaWYoZXhpc3Rpbmcpe1xyXG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmlubmVySFRNTCA9IHVuZXNjYXBlKHRoZW1lLmNzcylcclxuICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5yZW1vdmVBdHRyaWJ1dGUoXCJ3aWxsLXJlbW92ZVwiKVxyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIilcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZS5pZCA9IERPTS5lc2NhcGVJRCh0aGVtZS5pZClcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZS5pbm5lckhUTUwgPSB1bmVzY2FwZSh0aGVtZS5jc3MpXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUuc2V0QXR0cmlidXRlKFwiZGF0YS1saWdodGNvcmQtdGhlbWVcIiwgXCJ0cnVlXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmQoc3R5bGUpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICBmb3IobGV0IHN0eWxlIG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzdHlsZVt3aWxsLXJlbW92ZT10cnVlXVwiKSl7XHJcbiAgICAgICAgICAgICAgICBzdHlsZS5yZW1vdmUoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGZvcihsZXQga2V5IG9mIHRoaXMud2luZG93cy5rZXlzKCkpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseVRoZW1lcyhrZXkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IHdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL3dlYnBhY2tNb2R1bGVzXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgVjJDX1B1YmxpY1NlcnZlcnMgZnJvbSBcIi4uL3VpL3B1YmxpY3NlcnZlcnMvcHVibGljU2VydmVyc1wiO1xyXG5pbXBvcnQgTGF5ZXJzIGZyb20gXCIuL0xheWVyc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFYyX1B1YmxpY1NlcnZlcnMge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuX2FwcGVuZEJ1dHRvbiA9IHRoaXMuX2FwcGVuZEJ1dHRvbi5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5WMl9QdWJsaWNTZXJ2ZXJzID0gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBMYXllcnMuY3JlYXRlTGF5ZXIoKGNsb3NlKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVjJDX1B1YmxpY1NlcnZlcnMsIHtyb290SWQ6IFwicHVic2xheWVycm9vdFwiLCBjbG9zZX0pXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBnZXQgYnV0dG9uKCkge1xyXG4gICAgICAgIGNvbnN0IGJ0biA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtcHViLWxpXCIgY2xhc3M9XCIke0JEVjIuZ3VpbGRDbGFzc2VzLmxpc3RJdGVtfVwiPmApO1xyXG4gICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtMVwiXSkgYnRuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICBjb25zdCBsYWJlbCA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtcHViLWJ1dHRvblwiIGNsYXNzPVwiJHtcIndyYXBwZXItMjVlVkluIFwiICsgQkRWMi5ndWlsZENsYXNzZXMuY2lyY2xlQnV0dG9uTWFza31cIj5wdWJsaWM8L2Rpdj5gKTtcclxuICAgICAgICBsYWJlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge3RoaXMucmVuZGVyKCk7fSk7XHJcbiAgICAgICAgYnRuLmFwcGVuZChsYWJlbCk7XHJcbiAgICAgICAgcmV0dXJuIGJ0bjtcclxuICAgIH1cclxuXHJcbiAgICBfYXBwZW5kQnV0dG9uKCkge1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZXR1dG9yaWFsQ29udGFpbmVyXHJcbiAgICAgICAgXSA9IFtcclxuICAgICAgICAgICAgVXRpbHMucmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuZG93bmxvYWRQcm9ncmVzcyAmJiBlLnR1dG9yaWFsQ29udGFpbmVyKVswXS50dXRvcmlhbENvbnRhaW5lcilcclxuICAgICAgICBdXHJcbiAgICAgICAgaWYgKERPTS5xdWVyeShcIiNiZC1wdWItbGlcIikpIHJldHVybjtcclxuICAgICAgICBjb25zdCBndWlsZHMgPSBET00ucXVlcnkoYGRpdi4ke2NsYXNzTmFtZXR1dG9yaWFsQ29udGFpbmVyfSA+IGRpdmApO1xyXG4gICAgICAgIERPTS5hZnRlcihndWlsZHMsIHRoaXMuYnV0dG9uKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRCdXR0b24oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3VpbGRQYXRjaCkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IEd1aWxkTGlzdCA9IHdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHQgJiYgbS5kZWZhdWx0LmRpc3BsYXlOYW1lID09IFwiTmF2aWdhYmxlR3VpbGRzXCIpO1xyXG4gICAgICAgIGNvbnN0IEd1aWxkTGlzdE9sZCA9IHdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiR3VpbGRzXCIpO1xyXG4gICAgICAgIGlmICghR3VpbGRMaXN0ICYmICFHdWlsZExpc3RPbGQpIFV0aWxzLndhcm4oXCJQdWJsaWNTZXJ2ZXJcIiwgXCJDYW4ndCBmaW5kIEd1aWxkTGlzdCBjb21wb25lbnRcIik7XHJcbiAgICAgICAgdGhpcy5ndWlsZFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goR3VpbGRMaXN0ID8gR3VpbGRMaXN0IDogR3VpbGRMaXN0T2xkLnByb3RvdHlwZSwgR3VpbGRMaXN0ID8gXCJkZWZhdWx0XCIgOiBcInJlbmRlclwiLCB7YWZ0ZXI6IHRoaXMuX2FwcGVuZEJ1dHRvbn0pO1xyXG4gICAgICAgIHRoaXMuX2FwcGVuZEJ1dHRvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUJ1dHRvbigpIHtcclxuICAgICAgICB0aGlzLmd1aWxkUGF0Y2goKTtcclxuICAgICAgICBkZWxldGUgdGhpcy5ndWlsZFBhdGNoO1xyXG4gICAgICAgIGNvbnN0IGJ1dHRvbiA9IERPTS5xdWVyeShcIiNiZC1wdWItbGlcIik7XHJcbiAgICAgICAgaWYgKGJ1dHRvbikgYnV0dG9uLnJlbW92ZSgpO1xyXG4gICAgfVxyXG59OyIsImltcG9ydCB7c2V0dGluZ3MsIHNldHRpbmdzQ29va2llLCBzZXR0aW5nc1JQQ30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBWMl9TZXR0aW5nc1BhbmVsX1NpZGViYXIgZnJvbSBcIi4vc2V0dGluZ3NQYW5lbFNpZGViYXJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgY29sb3JlZFRleHQgZnJvbSBcIi4vY29sb3JlZFRleHRcIjtcclxuaW1wb3J0IHRmSG91ciBmcm9tIFwiLi8yNGhvdXJcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuaW1wb3J0IHB1YmxpY1NlcnZlcnNNb2R1bGUgZnJvbSBcIi4vcHVibGljU2VydmVyc1wiO1xyXG5pbXBvcnQgdm9pY2VNb2RlIGZyb20gXCIuL3ZvaWNlTW9kZVwiO1xyXG5pbXBvcnQgQ2xhc3NOb3JtYWxpemVyIGZyb20gXCIuL2NsYXNzTm9ybWFsaXplclwiO1xyXG5pbXBvcnQgZE1vZGUgZnJvbSBcIi4vZGV2TW9kZVwiO1xyXG5cclxuaW1wb3J0IFNlY3Rpb25lZFNldHRpbmdzUGFuZWwgZnJvbSBcIi4uL3VpL3NlY3Rpb25lZFNldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IENzc0VkaXRvciBmcm9tIFwiLi4vdWkvY3NzRWRpdG9yXCI7XHJcbmltcG9ydCBDYXJkTGlzdCBmcm9tIFwiLi4vdWkvYWRkb25saXN0XCI7XHJcbmltcG9ydCBWMkNfUHJlc2VuY2VTZXR0aW5ncyBmcm9tIFwiLi4vdWkvcHJlc2VuY2VTZXR0aW5nc1wiO1xyXG5pbXBvcnQgQ3VzdG9tUmljaFByZXNlbmNlIGZyb20gXCIuL0N1c3RvbVJpY2hQcmVzZW5jZVwiO1xyXG5pbXBvcnQgVjJDX0FjY291bnRJbmZvcyBmcm9tIFwiLi4vdWkvQWNjb3VudEluZm9zXCI7XHJcbmltcG9ydCB7IHJlbW90ZSB9IGZyb20gXCJlbGVjdHJvblwiO1xyXG5pbXBvcnQgQW50aUFkRE0gZnJvbSBcIi4vQW50aUFkRE1cIjtcclxuaW1wb3J0IGJsdXJQcml2YXRlIGZyb20gXCIuL2JsdXJQcml2YXRlXCI7XHJcbmltcG9ydCBkaXNhYmxlVHlwaW5nIGZyb20gXCIuL2Rpc2FibGVUeXBpbmdcIjtcclxuaW1wb3J0IEFwaVByZXZpZXcgZnJvbSBcIi4uL3VpL0FwaVByZXZpZXdcIjtcclxuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi4vdWkvc3dpdGNoXCI7XHJcbmltcG9ydCBNYXJnaW5Ub3AgZnJvbSBcIi4uL3VpL21hcmdpbnRvcFwiO1xyXG5pbXBvcnQgd2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuaW1wb3J0IHRvb2x0aXBXcmFwIGZyb20gXCIuLi91aS90b29sdGlwV3JhcFwiO1xyXG5pbXBvcnQgSGlzdG9yeSBmcm9tIFwiLi4vdWkvaWNvbnMvaGlzdG9yeVwiO1xyXG5pbXBvcnQgY29yZSBmcm9tIFwiLi9jb3JlXCI7XHJcbmltcG9ydCBwb3BvdXRXaW5kb3cgZnJvbSBcIi4vcG9wb3V0V2luZG93XCI7XHJcblxyXG5jbGFzcyBCRFNpZGViYXJIZWFkZXIgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBzaWRlYmFyQ29tcG9uZW50cyA9IHdlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLlNlcGFyYXRvciAmJiBlLkhlYWRlciAmJiBlLkl0ZW0pXHJcblxyXG4gICAgICAgIGNvbnN0IGNoYW5nZWxvZ0J1dHRvbiA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQodG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkNoYW5nZWxvZ1wifSwgXHJcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtzdHlsZToge2Zsb2F0OiBcInJpZ2h0XCIsIGN1cnNvcjogXCJwb2ludGVyXCJ9LCBjbGFzc05hbWU6IFwiYmQtY2hhbmdlbG9nLWJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7VXRpbHMuc2hvd0NoYW5nZWxvZ01vZGFsKGJiZENoYW5nZWxvZyk7fX0sXHJcbiAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KEhpc3RvcnksIHtjbGFzc05hbWU6IFwiYmQtaWNvblwiLCBzaXplOiBcIjE2cHhcIn0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgICAgIGxldCByZW5kZXJlZCA9IG5ldyBzaWRlYmFyQ29tcG9uZW50cy5IZWFkZXIoe1xyXG4gICAgICAgICAgICBjaGlsZHJlbjogUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgXCJCYW5kYWdlZCBCRFwiLCBjaGFuZ2Vsb2dCdXR0b24pLFxyXG4gICAgICAgICAgICBjbGFzc05hbWU6IFwidWktdGFiLWJhci1oZWFkZXJcIlxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmV0dXJuIHJlbmRlcmVkXHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCBpc0NsZWFyaW5nQ2FjaGUgPSBmYWxzZVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFYyX1NldHRpbmdzUGFuZWwge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTZXR0aW5ncyA9IHRoaXMudXBkYXRlU2V0dGluZ3MuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNpZGViYXIgPSBuZXcgVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyKCk7XHJcblxyXG4gICAgICAgIHRoaXMucmVnaXN0ZXJDb21wb25lbnRzKClcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3RlckNvbXBvbmVudHMoKXtcclxuICAgICAgICAvKiogTGlnaHRjb3JkICovXHJcbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwibGlnaHRjb3JkXCIsIG1ha2VDb21wb25lbnQodGhpcy5saWdodGNvcmRDb21wb25lbnQuYmluZCh0aGlzKSkpXHJcbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwic3RhdHVzXCIsIG1ha2VDb21wb25lbnQodGhpcy5QcmVzZW5jZUNvbXBvbmVudC5iaW5kKHRoaXMpKSlcclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJhY2NvdW50aW5mb1wiLCBtYWtlQ29tcG9uZW50KHRoaXMuQWNjb3VudEluZm9zQ29tcG9uZW50LmJpbmQodGhpcykpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcImxjYXBpcHJldmlld1wiLCBtYWtlQ29tcG9uZW50KHRoaXMuQXBpUHJldmlld0NvbXBvbmVudC5iaW5kKHRoaXMpKSlcclxuXHJcbiAgICAgICAgLyogQmFuZGFnZWQgQkQgKi9cclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJCRENoYW5nZWxvZ1RpdGxlXCIsIG1ha2VDb21wb25lbnQoKCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IEJEU2lkZWJhckhlYWRlcigpLnJlbmRlcigpXHJcbiAgICAgICAgfSkpXHJcbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwiY29yZVwiLCBtYWtlQ29tcG9uZW50KHRoaXMuY29yZUNvbXBvbmVudC5iaW5kKHRoaXMpKSlcclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJjdXN0b21jc3NcIiwgbWFrZUNvbXBvbmVudCh0aGlzLmN1c3RvbUNzc0NvbXBvbmVudC5iaW5kKHRoaXMpKSlcclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJwbHVnaW5zXCIsIG1ha2VDb21wb25lbnQodGhpcy5yZW5kZXJBZGRvblBhbmUoXCJwbHVnaW5zXCIpKSlcclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJ0aGVtZXNcIiwgbWFrZUNvbXBvbmVudCh0aGlzLnJlbmRlckFkZG9uUGFuZShcInRoZW1lc1wiKSkpXHJcbiAgICB9XHJcbiAgICBcclxuICAgIGdldCBjb3JlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLmdldFNldHRpbmdzKFwiY29yZVwiKTtcclxuICAgICAgICBjb25zdCBjYXRlZ29yaWVzID0gWy4uLm5ldyBTZXQoc2V0dGluZ3MubWFwKHMgPT4gcy5jYXRlZ29yeSkpXTtcclxuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGNhdGVnb3JpZXMubWFwKGMgPT4ge3JldHVybiB7dGl0bGU6IGMsIHNldHRpbmdzOiBzZXR0aW5ncy5maWx0ZXIocyA9PiBzLmNhdGVnb3J5ID09IGMpfTt9KTtcclxuICAgICAgICByZXR1cm4gc2VjdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxpZ2h0Y29yZFNldHRpbmdzKCkge1xyXG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5nZXRTZXR0aW5ncyhcImxpZ2h0Y29yZFwiKTtcclxuICAgICAgICBjb25zdCBjYXRlZ29yaWVzID0gWy4uLm5ldyBTZXQoc2V0dGluZ3MubWFwKHMgPT4gcy5jYXRlZ29yeSkpXTtcclxuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGNhdGVnb3JpZXMubWFwKGMgPT4ge3JldHVybiB7dGl0bGU6IGMsIHNldHRpbmdzOiBzZXR0aW5ncy5maWx0ZXIocyA9PiBzLmNhdGVnb3J5ID09IGMpfTt9KTtcclxuICAgICAgICByZXR1cm4gc2VjdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IFByZXNlbmNlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2V0dGluZ3MoXCJzdGF0dXNcIilcclxuICAgIH1cclxuXHJcbiAgICBnZXRTZXR0aW5ncyhjYXRlZ29yeSkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhzZXR0aW5ncykucmVkdWNlKChhcnIsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nID0gc2V0dGluZ3Nba2V5XTtcclxuICAgICAgICAgICAgaWYgKHNldHRpbmcuY2F0ID09PSBjYXRlZ29yeSAmJiBzZXR0aW5nLmltcGxlbWVudGVkICYmICFzZXR0aW5nLmhpZGRlbikge1xyXG4gICAgICAgICAgICAgICAgc2V0dGluZy50ZXh0ID0ga2V5O1xyXG4gICAgICAgICAgICAgICAgYXJyLnB1c2goc2V0dGluZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGFycjtcclxuICAgICAgICB9LCBbXSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIG9uQ2hhbmdlKGlkLCBjaGVja2VkLCBzaWRlYmFyKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTZXR0aW5ncyhpZCwgY2hlY2tlZCwgc2lkZWJhcik7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlU2V0dGluZ3MoaWQsIGVuYWJsZWQsIHNpZGViYXIpIHtcclxuICAgICAgICBpZighW1wibGlnaHRjb3JkLThcIiwgXCJub193aW5kb3dfYm91bmRcIiwgXCJlbmFibGVfZ2xhc3N0cm9uXCIsIFwibGlnaHRjb3JkLTEwXCJdLmluY2x1ZGVzKGlkKSlzZXR0aW5nc0Nvb2tpZVtpZF0gPSBlbmFibGVkO1xyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtMlwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsXCIpO1xyXG4gICAgICAgICAgICBlbHNlIERPTS5yZW1vdmVDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWxcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtM1wiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsLWNoYW5cIik7XHJcbiAgICAgICAgICAgIGVsc2UgRE9NLnJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbC1jaGFuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgcHVibGljU2VydmVyc01vZHVsZS5hZGRCdXR0b24oKTtcclxuICAgICAgICAgICAgZWxzZSBwdWJsaWNTZXJ2ZXJzTW9kdWxlLnJlbW92ZUJ1dHRvbigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTRcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgdm9pY2VNb2RlLnN0YXJ0KCk7XHJcbiAgICAgICAgICAgIGVsc2Ugdm9pY2VNb2RlLnN0b3AoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy01XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIERPTS5hZGRDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkYS1kYXJrXCIpO1xyXG4gICAgICAgICAgICBlbHNlIERPTS5yZW1vdmVDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkYS1kYXJrXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVuYWJsZWQgJiYgaWQgPT0gXCJiZGEtZ3MtNlwiKSB0ZkhvdXIuaW5qZWN0MjRIb3VyKCk7XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy03XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIGNvbG9yZWRUZXh0LmluamVjdENvbG9yZWRUZXh0KCk7XHJcbiAgICAgICAgICAgIGVsc2UgY29sb3JlZFRleHQucmVtb3ZlQ29sb3JlZFRleHQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImZvcmstcHMtNFwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBDbGFzc05vcm1hbGl6ZXIuc3RhcnQoKTtcclxuICAgICAgICAgICAgZWxzZSBDbGFzc05vcm1hbGl6ZXIuc3RvcCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiZm9yay1wcy01XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInBsdWdpblwiKTtcclxuICAgICAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgQ29udGVudE1hbmFnZXIudW53YXRjaENvbnRlbnQoXCJwbHVnaW5cIik7XHJcbiAgICAgICAgICAgICAgICBDb250ZW50TWFuYWdlci51bndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJmb3JrLXdwLTFcIikge1xyXG4gICAgICAgICAgICBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKFwidHJhbnNwYXJlbnRcIiwgZW5hYmxlZCk7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKFwiYmFja2dyb3VuZENvbG9yXCIsIG51bGwpO1xyXG4gICAgICAgICAgICBlbHNlIFV0aWxzLnNldFdpbmRvd1ByZWZlcmVuY2UoXCJiYWNrZ3JvdW5kQ29sb3JcIiwgXCIjMmYzMTM2XCIpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy04XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIGRNb2RlLnN0YXJ0RGVidWdMaXN0ZW5lcigpO1xyXG4gICAgICAgICAgICBlbHNlIGRNb2RlLnN0b3BEZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJmb3JrLWRtLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgZE1vZGUuc3RhcnRDb3B5U2VsZWN0b3IoKTtcclxuICAgICAgICAgICAgZWxzZSBkTW9kZS5zdG9wQ29weVNlbGVjdG9yKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5kZXZNb2RlID0gdHJ1ZVxyXG4gICAgICAgICAgICBlbHNlIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSA9IGZhbHNlXHJcbiAgICAgICAgICAgIHNpZGViYXIuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTJcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5jYWxsUmluZ2luZ0JlYXQgPSB0cnVlXHJcbiAgICAgICAgICAgIGVsc2Ugd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5jYWxsUmluZ2luZ0JlYXQgPSBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLXByZXNlbmNlLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgQ3VzdG9tUmljaFByZXNlbmNlLmVuYWJsZSgpXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5nc1N0b3JlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiB0eXBlb2YgZS5kZWZhdWx0ID09PSBcIm9iamVjdFwiICYmIFwic2hvd0N1cnJlbnRHYW1lXCIgaW4gZS5kZWZhdWx0KVswXVxyXG4gICAgICAgICAgICAgICAgaWYoc2V0dGluZ3NTdG9yZSAmJiAhc2V0dGluZ3NTdG9yZS5kZWZhdWx0LnNob3dDdXJyZW50R2FtZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQudXBkYXRlUmVtb3RlU2V0dGluZ3MpWzBdLmRlZmF1bHQudXBkYXRlUmVtb3RlU2V0dGluZ3Moe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93Q3VycmVudEdhbWU6IHRydWVcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgQ3VzdG9tUmljaFByZXNlbmNlLmRpc2FibGUoKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTNcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKS5zZXRBbHdheXNPblRvcCh0cnVlKVxyXG4gICAgICAgICAgICBlbHNlIHJlbW90ZS5nZXRDdXJyZW50V2luZG93KCkuc2V0QWx3YXlzT25Ub3AoZmFsc2UpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtNFwiKSB7XHJcbiAgICAgICAgICAgIGlmKGVuYWJsZWQpe1xyXG4gICAgICAgICAgICAgICAgQW50aUFkRE0uZW5hYmxlKClcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBBbnRpQWRETS5kaXNhYmxlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTZcIikge1xyXG4gICAgICAgICAgICBpZihlbmFibGVkKXtcclxuICAgICAgICAgICAgICAgIGJsdXJQcml2YXRlLmVuYWJsZSgpXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgYmx1clByaXZhdGUuZGlzYWJsZSgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC03XCIpIHtcclxuICAgICAgICAgICAgaWYoZW5hYmxlZCl7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlVHlwaW5nLmVuYWJsZSgpXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgZGlzYWJsZVR5cGluZy5kaXNhYmxlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLThcIil7XHJcbiAgICAgICAgICAgIGxldCBhcHBTZXR0aW5ncyA9IHJlbW90ZS5nZXRHbG9iYWwoXCJhcHBTZXR0aW5nc1wiKVxyXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zZXQoXCJpc1RhYnNcIiwgZW5hYmxlZClcclxuICAgICAgICAgICAgYXBwU2V0dGluZ3Muc2F2ZSgpXHJcbiAgICAgICAgICAgIHJlbW90ZS5hcHAucmVsYXVuY2goKVxyXG4gICAgICAgICAgICByZW1vdGUuYXBwLmV4aXQoKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTlcIikge1xyXG4gICAgICAgICAgICBwb3BvdXRXaW5kb3dbZW5hYmxlZCA/IFwiZW5hYmxlXCIgOiBcImRpc2FibGVcIl0oKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTEwXCIpe1xyXG4gICAgICAgICAgICBjb3JlLm1ldGhvZHMuTm90aWZpY2F0aW9uc1VzZVNoaW0oZW5hYmxlZClcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJub193aW5kb3dfYm91bmRcIil7XHJcbiAgICAgICAgICAgIGxldCBhcHBTZXR0aW5ncyA9IHJlbW90ZS5nZXRHbG9iYWwoXCJhcHBTZXR0aW5nc1wiKVxyXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zZXQoXCJOT19XSU5ET1dTX0JPVU5EXCIsIGVuYWJsZWQpXHJcblxyXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5kZWxldGUoXCJJU19NQVhJTUlaRURcIilcclxuICAgICAgICAgICAgYXBwU2V0dGluZ3MuZGVsZXRlKFwiSVNfTUlOSU1JWkVEXCIpIFxyXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5kZWxldGUoXCJXSU5ET1dfQk9VTkRTXCIpXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zYXZlKClcclxuICAgICAgICAgICAgcmVtb3RlLmFwcC5yZWxhdW5jaCgpXHJcbiAgICAgICAgICAgIHJlbW90ZS5hcHAuZXhpdCgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJlbmFibGVfZ2xhc3N0cm9uXCIpe1xyXG4gICAgICAgICAgICBsZXQgYXBwU2V0dGluZ3MgPSByZW1vdGUuZ2V0R2xvYmFsKFwiYXBwU2V0dGluZ3NcIilcclxuICAgICAgICAgICAgYXBwU2V0dGluZ3Muc2V0KFwiR0xBU1NUUk9OXCIsIGVuYWJsZWQpXHJcbiAgICAgICAgICAgIGFwcFNldHRpbmdzLnNhdmUoKVxyXG4gICAgICAgICAgICByZW1vdGUuYXBwLnJlbGF1bmNoKClcclxuICAgICAgICAgICAgcmVtb3RlLmFwcC5leGl0KClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2F2ZVNldHRpbmdzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdGlhbGl6ZVNldHRpbmdzKCkge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy0yXCJdKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsXCIpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy0zXCJdKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsLWNoYW5cIik7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTFcIl0pIHB1YmxpY1NlcnZlcnNNb2R1bGUuYWRkQnV0dG9uKCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTRcIl0pIHZvaWNlTW9kZS5zdGFydCgpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy01XCJdKSBET00uYWRkQ2xhc3MoRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKSwgXCJiZGEtZGFya1wiKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtNlwiXSkgdGZIb3VyLmluamVjdDI0SG91cigpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy03XCJdKSBjb2xvcmVkVGV4dC5pbmplY3RDb2xvcmVkVGV4dCgpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNFwiXSkgQ2xhc3NOb3JtYWxpemVyLnN0YXJ0KCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTFcIl0pIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSA9IHRydWVcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtMlwiXSkgd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5jYWxsUmluZ2luZ0JlYXQgPSB0cnVlXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLXByZXNlbmNlLTFcIl0pIEN1c3RvbVJpY2hQcmVzZW5jZS5lbmFibGUoKVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC0zXCJdKSByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpLnNldEFsd2F5c09uVG9wKHRydWUpXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTRcIl0pIEFudGlBZERNLmVuYWJsZSgpXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTZcIl0pIGJsdXJQcml2YXRlLmVuYWJsZSgpXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTdcIl0pIGRpc2FibGVUeXBpbmcuZW5hYmxlKClcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtOVwiXSkgcG9wb3V0V2luZG93LmVuYWJsZSgpXHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSkge1xyXG4gICAgICAgICAgICBDb250ZW50TWFuYWdlci53YXRjaENvbnRlbnQoXCJwbHVnaW5cIik7XHJcbiAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLThcIl0pIGRNb2RlLnN0YXJ0RGVidWdMaXN0ZW5lcigpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstZG0tMVwiXSkgZE1vZGUuc3RhcnRDb3B5U2VsZWN0b3IoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBzYXZlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIsIHNldHRpbmdzQ29va2llKTtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwicnBjXCIsIHNldHRpbmdzUlBDKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5nc0Nvb2tpZSwgRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIpKTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzUlBDLCBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJTaWRlYmFyKHNpZGViYXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zaWRlYmFyLnJlbmRlcihzaWRlYmFyKTtcclxuICAgIH1cclxuXHJcbiAgICBjb3JlQ29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VjdGlvbmVkU2V0dGluZ3NQYW5lbCwge2tleTogXCJjc3BhbmVsXCIsIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLCBzZWN0aW9uczogdGhpcy5jb3JlU2V0dGluZ3N9KVxyXG4gICAgfVxyXG5cclxuICAgIGxpZ2h0Y29yZENvbXBvbmVudChzaWRlYmFyLCBmb3JjZVVwZGF0ZSkge1xyXG4gICAgICAgIGxldCBhcHBTZXR0aW5ncyA9IHJlbW90ZS5nZXRHbG9iYWwoXCJhcHBTZXR0aW5nc1wiKVxyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHRoaXMubGlnaHRjb3JkU2V0dGluZ3MubWFwKChzZWN0aW9uLCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICAgICAgICAgIChpID09PSAwID8gbnVsbCA6IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChNYXJnaW5Ub3ApKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoMlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGl0bGUgaDIgbWFyZ2luLXJlc2V0IG1hcmdpbi1ib3R0b20tMjBcIn0sIHNlY3Rpb24udGl0bGUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uc2V0dGluZ3MubWFwKHNldHRpbmcgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNDaGVja2VkID0gc2V0dGluZ3NDb29raWVbc2V0dGluZy5pZF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0dGluZy5pZCA9PT0gXCJsaWdodGNvcmQtOFwiKWlzQ2hlY2tlZCA9IGFwcFNldHRpbmdzLmdldChcImlzVGFic1wiLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldHRpbmcuaWQgPT09IFwibm9fd2luZG93X2JvdW5kXCIpaXNDaGVja2VkID0gYXBwU2V0dGluZ3MuZ2V0KFwiTk9fV0lORE9XU19CT1VORFwiLCBmYWxzZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0dGluZy5pZCA9PT0gXCJlbmFibGVfZ2xhc3N0cm9uXCIpaXNDaGVja2VkID0gYXBwU2V0dGluZ3MuZ2V0KFwiR0xBU1NUUk9OXCIsIHRydWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldHRpbmcuaWQgPT09IFwibGlnaHRjb3JkLTEwXCIpaXNDaGVja2VkID0gIWFwcFNldHRpbmdzLmdldChcIkRFRkFVTFRfTk9USUZJQ0FUSU9OU1wiLCB0cnVlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmV0dXJuVmFsdWUgPSBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU3dpdGNoLCB7aWQ6IHNldHRpbmcuaWQsIGtleTogc2V0dGluZy5pZCwgZGF0YTogc2V0dGluZywgY2hlY2tlZDogaXNDaGVja2VkLCBvbkNoYW5nZTogKGlkLCBjaGVja2VkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKGlkLCBjaGVja2VkLCBzaWRlYmFyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfX0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldHRpbmcuaWQgPT0gXCJsaWdodGNvcmQtOFwiICYmIGlzQ2hlY2tlZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFwiZ3JlZW5cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vazogXCJvdXRsaW5lZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBcInNtYWxsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdmVyQ29sb3I6IFwiYnJhbmRcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY29yZE5hdGl2ZS5pcGMuc2VuZChcIk5FV19UQUJcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlcjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFwiT3BlbiBhIG5ldyBUYWJcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWVcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9KSwgXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24sIHtcclxuICAgICAgICAgICAgICAgIGNvbG9yOiBcInllbGxvd1wiLFxyXG4gICAgICAgICAgICAgICAgbG9vazogXCJnaG9zdFwiLFxyXG4gICAgICAgICAgICAgICAgc2l6ZTogXCJtZWRpdW1cIixcclxuICAgICAgICAgICAgICAgIGhvdmVyQ29sb3I6IFwicmVkXCIsXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrKCl7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJTaG91bGQgcmVsYXVuY2hcIilcclxuICAgICAgICAgICAgICAgICAgICByZW1vdGUuYXBwLnJlbGF1bmNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogcmVtb3RlLnByb2Nlc3MuYXJndi5zbGljZSgxKS5jb25jYXQoW1wiLS1kaXNhYmxlLWJldHRlcmRpc2NvcmRcIl0pXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICByZW1vdGUuYXBwLnF1aXQoKVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHdyYXBwZXI6IHRydWVcclxuICAgICAgICAgICAgfSwgXCJSZWxhdW5jaCB3aXRob3V0IEJldHRlckRpc2NvcmRcIiksXHJcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24sIHtcclxuICAgICAgICAgICAgICAgIGNvbG9yOiBcInllbGxvd1wiLFxyXG4gICAgICAgICAgICAgICAgbG9vazogXCJnaG9zdFwiLFxyXG4gICAgICAgICAgICAgICAgc2l6ZTogXCJtZWRpdW1cIixcclxuICAgICAgICAgICAgICAgIGhvdmVyQ29sb3I6IFwicmVkXCIsXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoaXNDbGVhcmluZ0NhY2hlKXJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgIGlzQ2xlYXJpbmdDYWNoZSA9IHRydWVcclxuICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJDbGVhcmluZyBjYWNoZS4uLlwiLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaW5mb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICBmb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpLnNlc3Npb24uY2xlYXJDYWNoZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJDYWNoZSBpcyBjbGVhcmVkICFcIiwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdWNjZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDbGVhcmluZ0NhY2hlID0gZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkLiBDaGVjayBjb25zb2xlIGZvciBtb3JlIGluZm9ybWF0aW9ucy5cIiwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJlcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2xlYXJpbmdDYWNoZSA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlVXBkYXRlKClcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHdyYXBwZXI6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogaXNDbGVhcmluZ0NhY2hlXHJcbiAgICAgICAgICAgIH0sIFwiQ2xlYXIgY2FjaGVcIilcclxuICAgICAgICBdXHJcbiAgICB9XHJcblxyXG4gICAgUHJlc2VuY2VDb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChWMkNfUHJlc2VuY2VTZXR0aW5ncywge1xyXG4gICAgICAgICAgICBrZXk6IFwibHBwYW5uZWxcIixcclxuICAgICAgICAgICAgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIFxyXG4gICAgICAgICAgICBzZXR0aW5nczogdGhpcy5QcmVzZW5jZVNldHRpbmdzXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBBY2NvdW50SW5mb3NDb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChWMkNfQWNjb3VudEluZm9zLCB7XHJcbiAgICAgICAgICAgIGtleTogXCJsYXBhbm5lbFwiXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBBcGlQcmV2aWV3Q29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQXBpUHJldmlldywge1xyXG4gICAgICAgICAgICBrZXk6IFwibGFwaXBhbm5lbFwiXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBjdXN0b21Dc3NDb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDc3NFZGl0b3IsIHtrZXk6IFwiY3NzZWRpdG9yXCJ9KVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlckFkZG9uUGFuZSh0eXBlKSB7XHJcbiAgICAgICAgLy8gSSBrbm93IHRoaXMgc2hvdWxkbid0IGJlIGhlcmUsIGJ1dCB3aGVuIGl0IGlzbid0LFxyXG4gICAgICAgIC8vIFJlYWN0IHJlZnVzZXMgdG8gY2hhbmdlIHRoZSBidXR0b24gd2hlbiBnb2luZ1xyXG4gICAgICAgIC8vIGJldHdlZW4gcGx1Z2lucyBhbmQgdGhlbWVzIHBhZ2UuLi4gc29tZXRoaW5nXHJcbiAgICAgICAgLy8gdG8gZGVidWcgbGF0ZXIuXHJcbiAgICAgICAgY2xhc3MgQ29udGVudExpc3QgZXh0ZW5kcyBCRFYyLnJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByZWZpeCA9IHRoaXMucHJvcHMudHlwZS5yZXBsYWNlKFwic1wiLCBcIlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICBvbkNoYW5nZSgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UodGhpcy5wcm9wcy50eXBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICByZW5kZXIoKSB7cmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47fVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvcmlnaW5hbFJlbmRlciA9IENvbnRlbnRMaXN0LnByb3RvdHlwZS5yZW5kZXI7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnRlbnRMaXN0LnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xyXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbigpIHtjb25zb2xlLndhcm4oXCJBZGRvbiBwb2xpY3kgZm9yIHBsdWdpbnMgIzUgaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC93aWtpL0FkZG9uLVBvbGljaWVzI3BsdWdpbnNcIik7fSxcclxuICAgICAgICAgICAgZ2V0OiAoKSA9PiBvcmlnaW5hbFJlbmRlclxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENvbnRlbnRMaXN0LCB7dHlwZX0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDYXJkTGlzdCwge3R5cGV9KSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxyXG4vKipcclxuICogTm8gbmVlZCB0byBleHBvcnQgc2V0dGluZ3NQYW5lbCBvbiB3aW5kb3dcclxuICovXHJcblxyXG5mdW5jdGlvbiBtYWtlQ29tcG9uZW50KGNoaWxkcmVuKXtcclxuICAgIGNsYXNzIFNldHRpbmdDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgICAgIHJlbmRlcigpe1xyXG4gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW4oc2lkZWJhciwgKCkgPT4gdGhpcy5mb3JjZVVwZGF0ZSgpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBzaWRlYmFyXHJcbiAgICByZXR1cm4gKHMpID0+IHtcclxuICAgICAgICBzaWRlYmFyID0gc1xyXG4gICAgICAgIHJldHVybiBTZXR0aW5nQ29tcG9uZW50XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBWMl9TZXR0aW5nc1BhbmVsX1NpZGViYXIge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMucGFuZWxzID0ge31cclxuICAgIH1cclxuXHJcbiAgICByZWdpc3RlcihwYW5lbCwgY29tcG9uZW50KXtcclxuICAgICAgICB0aGlzLnBhbmVsc1twYW5lbF0gPSBjb21wb25lbnRcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb21wb25lbnQocGFuZWwsIHNpZGViYXIpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBhbmVsc1twYW5lbF0oc2lkZWJhcilcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXRlbXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIFt7XHJcbiAgICAgICAgICAgIHRleHQ6IFwiQmV0dGVyRGlzY29yZCBTZXR0aW5nc1wiLCBcclxuICAgICAgICAgICAgaWQ6IFwiY29yZVwiXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICB0ZXh0OiBcIlBsdWdpbnNcIiwgXHJcbiAgICAgICAgICAgIGlkOiBcInBsdWdpbnNcIlxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgdGV4dDogXCJUaGVtZXNcIiwgXHJcbiAgICAgICAgICAgIGlkOiBcInRoZW1lc1wiXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICB0ZXh0OiBcIkN1c3RvbSBDU1NcIiwgXHJcbiAgICAgICAgICAgIGlkOiBcImN1c3RvbWNzc1wiXHJcbiAgICAgICAgfV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IExDaXRlbXMoKXtcclxuICAgICAgICBsZXQgaXRlbXMgPSBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRleHQ6IFwiTGlnaHRjb3JkIFNldHRpbmdzXCIsXHJcbiAgICAgICAgICAgICAgICBpZDogXCJsaWdodGNvcmRcIlxyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIlJpY2hQcmVzZW5jZVwiLCBcclxuICAgICAgICAgICAgICAgIGlkOiBcInN0YXR1c1wiXHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIHRleHQ6IFwiQWNjb3VudCBJbmZvXCIsXHJcbiAgICAgICAgICAgICAgICBpZDogXCJhY2NvdW50aW5mb1wiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IExDRGV2SXRlbXMoKXtcclxuICAgICAgICBsZXQgaXRlbXMgPSBbXVxyXG4gICAgICAgIGlmKCF3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmRldk1vZGUpcmV0dXJuIGl0ZW1zXHJcbiAgICAgICAgaXRlbXMucHVzaCguLi5bXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNlY3Rpb246IFwiRElWSURFUlwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNlY3Rpb246IFwiSEVBREVSXCIsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogXCJMaWdodGNvcmQgQXBpXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGV4dDogXCJDb21wb25lbnRzIFByZXZpZXdcIixcclxuICAgICAgICAgICAgICAgIGlkOiBcImxjYXBpcHJldmlld1wiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdKVxyXG4gICAgICAgIHJldHVybiBpdGVtc1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcihzaWRlYmFyKSB7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJIRUFERVJcIixcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBcIkxpZ2h0Y29yZFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIC4uLnRoaXMuTENpdGVtcy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246IGUuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGUudGV4dCxcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmdldENvbXBvbmVudChlLmlkLCBzaWRlYmFyKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgLi4udGhpcy5MQ0Rldkl0ZW1zLm1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKGUuc2VjdGlvbilyZXR1cm4gZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uOiBlLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBlLnRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogdGhpcy5nZXRDb21wb25lbnQoZS5pZCwgc2lkZWJhcilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNlY3Rpb246IFwiRElWSURFUlwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNlY3Rpb246IFwiQ1VTVE9NXCIsXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmdldENvbXBvbmVudChcIkJEQ2hhbmdlbG9nVGl0bGVcIilcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgLi4udGhpcy5pdGVtcy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246IGUuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGUudGV4dCxcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmdldENvbXBvbmVudChlLmlkLCBzaWRlYmFyKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJESVZJREVSXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIE5vIG5lZWQgdG8gZXhwb3J0IHNldHRpbmdzUGFuZWxTaWRlYmFyIG9uIHdpbmRvd1xyXG4gKi8iLCJpbXBvcnQge2JkdGhlbWVFcnJvcnMsIHRoZW1lQ29va2llLCBzZXR0aW5nc0Nvb2tpZSwgYmR0aGVtZXN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IEJERXZlbnRzIGZyb20gXCIuL2JkRXZlbnRzXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcbmltcG9ydCBiZEV2ZW50cyBmcm9tIFwiLi9iZEV2ZW50c1wiO1xyXG5cclxuY2xhc3MgVGhlbWVNb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuVGhlbWVNb2R1bGUgPSB0aGlzXHJcbiAgICB9XHJcbiAgICBnZXQgZm9sZGVyKCkge3JldHVybiBDb250ZW50TWFuYWdlci50aGVtZXNGb2xkZXI7fVxyXG59XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUubG9hZFRoZW1lcyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcclxuICAgIHRoaXMubG9hZFRoZW1lRGF0YSgpO1xyXG4gICAgYmR0aGVtZUVycm9ycy5zcGxpY2UoMCwgMCwgLi4uKGF3YWl0IENvbnRlbnRNYW5hZ2VyLmxvYWRUaGVtZXMoKSkpO1xyXG4gICAgY29uc3QgdGhlbWVzID0gT2JqZWN0LmtleXMoYmR0aGVtZXMpO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhlbWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lc1t0aGVtZXNbaV1dO1xyXG4gICAgICAgIGlmICghdGhlbWVDb29raWVbdGhlbWUubmFtZV0pIHRoZW1lQ29va2llW3RoZW1lLm5hbWVdID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoZW1lQ29va2llW3RoZW1lLm5hbWVdKSBET00uYWRkU3R5bGUoRE9NLmVzY2FwZUlEKHRoZW1lLmlkKSwgdW5lc2NhcGUodGhlbWUuY3NzKSk7XHJcblxyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwKSlcclxuICAgIH1cclxuICAgIGZvciAoY29uc3QgdGhlbWUgaW4gdGhlbWVDb29raWUpIHtcclxuICAgICAgICBpZiAoIWJkdGhlbWVzW3RoZW1lXSkgZGVsZXRlIHRoZW1lQ29va2llW3RoZW1lXTtcclxuICAgIH1cclxuICAgIHRoaXMuc2F2ZVRoZW1lRGF0YSgpO1xyXG4gICAgLy8gaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy01XCJdKSBDb250ZW50TWFuYWdlci53YXRjaENvbnRlbnQoXCJ0aGVtZVwiKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5lbmFibGVUaGVtZSA9IGZ1bmN0aW9uKG5hbWUsIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICB0aGVtZUNvb2tpZVtuYW1lXSA9IHRydWU7XHJcbiAgICB0aGlzLnNhdmVUaGVtZURhdGEoKTtcclxuICAgIGNvbnN0IHRoZW1lID0gYmR0aGVtZXNbbmFtZV07XHJcbiAgICBET00uYWRkU3R5bGUoRE9NLmVzY2FwZUlEKHRoZW1lLmlkKSwgdW5lc2NhcGUodGhlbWUuY3NzKSk7XHJcbiAgICBiZEV2ZW50cy5kaXNwYXRjaChcInRoZW1lLWVuYWJsZWRcIilcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWUubmFtZX0gdiR7dGhlbWUudmVyc2lvbn0gaGFzIGJlZW4gYXBwbGllZC5gKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAobmFtZSwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHJldHVybiB0aGlzLmVuYWJsZVRoZW1lKG5hbWUsIHJlbG9hZCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZGlzYWJsZVRoZW1lID0gZnVuY3Rpb24obmFtZSwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHRoZW1lQ29va2llW25hbWVdID0gZmFsc2U7XHJcbiAgICB0aGlzLnNhdmVUaGVtZURhdGEoKTtcclxuICAgIGNvbnN0IHRoZW1lID0gYmR0aGVtZXNbbmFtZV07XHJcbiAgICBET00ucmVtb3ZlU3R5bGUoRE9NLmVzY2FwZUlEKHRoZW1lLmlkKSk7XHJcbiAgICBiZEV2ZW50cy5kaXNwYXRjaChcInRoZW1lLWRpc2FibGVkXCIpXHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lLm5hbWV9IHYke3RoZW1lLnZlcnNpb259IGhhcyBiZWVuIGRpc2FibGVkLmApO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAobmFtZSwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHJldHVybiB0aGlzLmRpc2FibGVUaGVtZShuYW1lLCByZWxvYWQpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnRvZ2dsZVRoZW1lID0gZnVuY3Rpb24odGhlbWUpIHtcclxuICAgIGlmICh0aGVtZUNvb2tpZVt0aGVtZV0pIHRoaXMuZGlzYWJsZVRoZW1lKHRoZW1lKTtcclxuICAgIGVsc2UgdGhpcy5lbmFibGVUaGVtZSh0aGVtZSk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKG5hbWUpIHtcclxuICAgIHJldHVybiB0aGlzLnRvZ2dsZVRoZW1lKG5hbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmxvYWRUaGVtZSA9IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lKSB7XHJcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IENvbnRlbnRNYW5hZ2VyLmxvYWRDb250ZW50KGZpbGVuYW1lLCBcInRoZW1lXCIpO1xyXG4gICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7dGhlbWVzOiBbZXJyb3JdfSk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7ZmlsZW5hbWV9IGNvdWxkIG5vdCBiZSBsb2FkZWQuIEl0IG1heSBub3QgaGF2ZSBiZWVuIGxvYWRlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke2ZpbGVuYW1lfSBjb3VsZCBub3QgYmUgbG9hZGVkLmAsIGVycm9yKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHRoZW1lID0gT2JqZWN0LnZhbHVlcyhiZHRoZW1lcykuZmluZChwID0+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/IFwiWWVzXCIgOiBcIk5vXCJ9XHJcbi0gRW1haWw6ICR7dXNlci5lbWFpbH1cclxuLSAyRkE6ICR7dXNlci5tZmFFbmFibGVkID8gXCJZZXNcIiA6IFwiTm9cIn1cclxuLSBIYXMgQmVlbiBPbiBNb2JpbGU6ICR7dXNlci5tb2JpbGUgPyBcIlllc1wiIDogXCJOb1wifVxyXG4tIFBob25lOiAke3VzZXIucGhvbmUgfHwgXCJOb25lXCJ9XHJcbi0gVmVyaWZpZWQ6ICR7dXNlci52ZXJpZmllZH1cclxuLSBDYW4gU2VlIE5TRlcgQ2hhbm5lbHM6ICR7dXNlci5uc2Z3QWxsb3dlZH1gO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFN0YXRpc3RpY3MoKXtcclxuXHJcbiAgICAgICAgY29uc3QgZ3VpbGRzID0gT2JqZWN0LnZhbHVlcyhHdWlsZE1vZHVsZS5nZXRHdWlsZHMoKSlcclxuICAgICAgICBjb25zdCByZWxhdGlvbnMgPSBPYmplY3Qua2V5cyhyZWxhdGlvblNoaXBNb2R1bGUuZ2V0UmVsYXRpb25zaGlwcygpKVxyXG4gICAgICAgIGNvbnN0IGZyaWVuZHMgPSByZWxhdGlvbnMuZmlsdGVyKGUgPT4gcmVsYXRpb25TaGlwTW9kdWxlLmlzRnJpZW5kKGUpKVxyXG4gICAgICAgIGNvbnN0IGJsb2NrZWQgPSByZWxhdGlvbnMuZmlsdGVyKGUgPT4gcmVsYXRpb25TaGlwTW9kdWxlLmlzQmxvY2tlZChlKSlcclxuXHJcbiAgICAgICAgcmV0dXJuIGArIFNlcnZlciBDb3VudDogJHtndWlsZHMubGVuZ3RofSBzZXJ2ZXJzXHJcbisgUmVsYXRpb25zOiAke3JlbGF0aW9ucy5sZW5ndGh9IHJlbGF0aW9uc1xyXG4rIEZyaWVuZHMgQ291bnQ6ICR7ZnJpZW5kcy5sZW5ndGh9IGZyaWVuZHNcclxuLSBCbG9ja2VkIFVzZXJzIENvdW50OiAke2Jsb2NrZWQubGVuZ3RofSBibG9ja2VkIHVzZXJzYFxyXG4gICAgfVxyXG59XHJcblxyXG5cclxubGV0IGhpZ2h0bGlnaHRKUyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhpZ2hsaWdodClbMF1cclxubGV0IG1lc3NhZ2VNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFya3VwKVswXVxyXG5sZXQgbWVzc2FnZU1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tZXNzYWdlQ29udGVudClbMF1cclxuXHJcbmNsYXNzIENvZGVDb250ZW50IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGlmKCFtZXNzYWdlTW9kdWxlMSltZXNzYWdlTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmt1cClbMF1cclxuICAgICAgICBpZighbWVzc2FnZU1vZHVsZTIpbWVzc2FnZU1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tZXNzYWdlQ29udGVudClbMF1cclxuICAgICAgICBpZighc2Nyb2xsYmFyTW9kdWxlMSlzY3JvbGxiYXJNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsYmFyR2hvc3RIYWlybGluZSlbMF1cclxuICAgICAgICBpZighaGlnaHRsaWdodEpTKWhpZ2h0bGlnaHRKUyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmxpc3RMYW5ndWFnZXMpWzBdXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzPXtgJHttZXNzYWdlTW9kdWxlMS5tYXJrdXB9ICR7bWVzc2FnZU1vZHVsZTIubWVzc2FnZUNvbnRlbnR9YH0+XHJcbiAgICAgICAgICAgIDxwcmU+XHJcbiAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz17YCR7c2Nyb2xsYmFyTW9kdWxlMS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lfSBobGpzYH0gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGhpZ2h0bGlnaHRKUy5oaWdobGlnaHQodGhpcy5wcm9wcy5sYW5ndWFnZSwgdGhpcy5wcm9wcy5jb250ZW50KS52YWx1ZX19PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvY29kZT5cclxuICAgICAgICAgICAgPC9wcmU+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b204KVswXS5tYXJnaW5Cb3R0b204fT48L2Rpdj5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn0iLCIvLyBHb29kIGx1Y2sgdG8gcmVhZCBteSBjb2RlLCBFdmVuIG1lIGNhbid0IHJlYWQgaXQgcHJvcGVybHkuXHJcblxyXG5pbXBvcnQgeyBzdGF0IH0gZnJvbSBcImZzXCJcclxuaW1wb3J0IHsgdXVpZHY0IH0gZnJvbSBcIi4uL21vZHVsZXMvZGlzdGFudFwiXHJcbmltcG9ydCB3ZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi4vbW9kdWxlcy93ZWJwYWNrTW9kdWxlc1wiXHJcbmltcG9ydCB7IHJlbW90ZSB9IGZyb20gXCJlbGVjdHJvblwiXHJcbmltcG9ydCBNYXJnaW5Ub3AgZnJvbSBcIi4vbWFyZ2ludG9wXCJcclxuXHJcbmxldCBmb3JtTW9kdWxlXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFwaVByZXZpZXcgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIHN0YXRlczogW11cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgaWYoIWZvcm1Nb2R1bGUpZm9ybU1vZHVsZSA9IHdlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLkZvcm1TZWN0aW9uKVxyXG4gICAgICAgIC8qKiBcclxuICAgICAgICAgKiBAdHlwZSB7RnVuY3Rpb25bXX1cclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBhbGxDb21wb25lbnRzID0gWy4uLm5ldyBTZXQoT2JqZWN0LmtleXMod2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cykubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMod2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50c1tlXSkubWFwKGsgPT4gd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50c1tlXVtrXSlcclxuICAgICAgICB9KS5mbGF0KCkpXVxyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIDxmb3JtTW9kdWxlLkZvcm1TZWN0aW9uIHRhZz1cImgyXCIgdGl0bGU9XCJMaWdodGNvcmQncyBBcGkgQXZhaWxsYWJsZSBjb21wb25lbnRzXCI+XHJcbiAgICAgICAgICAgICAgICA8Zm9ybU1vZHVsZS5Gb3JtVGV4dCB0eXBlPVwiZGVzY3JpcHRpb25cIiBjbGFzc05hbWU9XCJcIiBzZWxlY3RhYmxlPXtmYWxzZX0+XHJcbiAgICAgICAgICAgICAgICAgICAgVGhlc2UgY29tcG9uZW50cyBhcmUgaGVyZSBmb3IgdGhlIHBsdWdpbiBkZXZzLiBUaGV5IGNhbiBxdWlja2x5IGVtYmVkIGFueSBjb21wb25lbnQgYmVsb3cgd2l0aCB0aGlzIHBhbmVsLlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3ttYXJnaW5Ub3A6IFwiMjBweFwifX0+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94IHR5cGU9XCJpbmZvXCI+QWxsIHRoZXNlIGNvbXBvbmVudHMgaGF2ZSBlcnJvciBoYW5kbGluZy4gSWYgeW91IHdhbnQgbm9uZSwgYWRkIGAub3JpZ2luYWxgIGFmdGVyIHRoZSBjb21wb25lbnQgcGF0aC48L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PlxyXG4gICAgICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwid2FyblwiPldlIGRvIG5vdCByZWNvbW1lbmQgbW9kaWZ5aW5nIHRoZXNlIGNvbXBvbmVudCB3aXRoIHBsdWdpbnMuIE9ubHkgZG8gdGhpcyBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveD5cclxuICAgICAgICAgICAgICAgIDwvZm9ybU1vZHVsZS5Gb3JtVGV4dD5cclxuICAgICAgICAgICAgICAgIDxNYXJnaW5Ub3A+PC9NYXJnaW5Ub3A+XHJcbiAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24gY29sb3I9XCJicmFuZFwiIGxvb2s9XCJvdXRsaW5lZFwiIHNpemU9XCJtZWRpdW1cIiBob3ZlckNvbG9yPVwiZ3JlZW5cIiBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlLnNoZWxsLm9wZW5FeHRlcm5hbChcImh0dHBzOi8vbGlnaHRjb3JkLmRlcm9rdS54eXovTGlnaHRjb3JkQXBpL2RvY3NcIilcclxuICAgICAgICAgICAgICAgIH19IHdyYXBwZXI9e2ZhbHNlfT5cclxuICAgICAgICAgICAgICAgICAgICBEb2N1bWVudGF0aW9uXHJcbiAgICAgICAgICAgICAgICA8L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Zvcm1Nb2R1bGUuRm9ybVNlY3Rpb24+LFxyXG4gICAgICAgICAgICBhbGxDb21wb25lbnRzLm1hcChjb21wID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBOYW1lID0gY29tcC5kaXNwbGF5TmFtZSB8fCBjb21wLm5hbWVcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBQYXRoID0gYExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy4ke09iamVjdC5rZXlzKHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMpLmZpbmQoZSA9PiB3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzW2VdW2NvbXBOYW1lXSl9LiR7Y29tcE5hbWV9YFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxDb21wb25lbnRQcmV2aWV3IGtleT17Y29tcFBhdGh9IGNvbXA9e2NvbXB9IC8+XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIGdldCByZW5kZXJzKCl7XHJcblxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBDb21wb25lbnRQcmV2aWV3IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICB0YWI6IFwicHJldmlld1wiLFxyXG4gICAgICAgICAgICBlbGVtOiBwcm9wcy5jb21wLFxyXG4gICAgICAgICAgICBvcHRpb25zOiB7fVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBjb25zdCBjb21wID0gdGhpcy5wcm9wcy5jb21wXHJcbiAgICAgICAgbGV0IEFsbFByZXZpZXdzID0gW11cclxuICAgICAgICBpZihjb21wLkFsbFByZXZpZXdzKUFsbFByZXZpZXdzID0gY29tcC5BbGxQcmV2aWV3c1xyXG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVcclxuICAgICAgICBsZXQgZ2V0UHJvcHMgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBmaW5hbCA9IHt9XHJcbiAgICAgICAgICAgIEFsbFByZXZpZXdzLmZvckVhY2goY2F0ZWdvcnkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZmluYWxbT2JqZWN0LmtleXMoY2F0ZWdvcnlbMF0pWzBdXSA9IGNhdGVnb3J5WzBdW09iamVjdC5rZXlzKGNhdGVnb3J5WzBdKVswXV1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgT2JqZWN0LmtleXMoc3RhdGUub3B0aW9ucykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZmluYWxba2V5XSA9IEFsbFByZXZpZXdzLmZpbmQoZSA9PiBlLmZpbmQoZSA9PiBlW2tleV0pKVtzdGF0ZS5vcHRpb25zW2tleV1dW2tleV1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgcmV0dXJuIGZpbmFsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByZW5kZXJQcmV2aWV3ID0gKCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gPGRpdiBzdHlsZT17e21hcmdpbjogXCIyMHB4XCJ9fT5cclxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tYmFja2dyb3VuZC1zZWNvbmRhcnkpXCIsIFxyXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMzBweCAzMHB4XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCI4cHhcIlxyXG4gICAgICAgICAgICAgICAgfX0gY2xhc3NOYW1lPVwibGMtdGFiLWJveC1zaGFkb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICB7UmVhY3QuY3JlYXRlRWxlbWVudChjb21wLCBnZXRQcm9wcygpKX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHJlbmRlckNvZGUgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiA8ZGl2IHN0eWxlPXt7bWFyZ2luOiBcIjIwcHhcIn19PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXNlY29uZGFyeSlcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogXCIzMHB4IDMwcHhcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjhweFwiXHJcbiAgICAgICAgICAgICAgICB9fSBjbGFzc05hbWU9XCJsYy10YWItYm94LXNoYWRvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ1N1YlRpdGxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBKU1hcclxuICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5FcnJvckNhdGNoZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtSZWFjdC5jcmVhdGVFbGVtZW50KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkNvZGVCbG9jayBsYW5ndWFnZT1cImpzeFwiIGNvbnRlbnQ9e2dlbmVyYXRlQ29kZShcImpzeFwiKX0vPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5FcnJvckNhdGNoZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+ICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3RcclxuICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5FcnJvckNhdGNoZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtSZWFjdC5jcmVhdGVFbGVtZW50KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkNvZGVCbG9jayBsYW5ndWFnZT1cImpzXCIgY29udGVudD17Z2VuZXJhdGVDb2RlKFwicmVhY3RcIil9Lz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgICAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuRXJyb3JDYXRjaGVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgZ2V0U3RyRm9yUHJvcCA9ICh2YWx1ZSwgY29tcFBhdGgsIGxhbmcpID0+IHtcclxuICAgICAgICAgICAgaWYodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVxyXG4gICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpXHJcbiAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpXHJcbiAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIil7XHJcbiAgICAgICAgICAgICAgICBpZih2YWx1ZSAmJiB2YWx1ZS4kJHR5cGVvZiAmJiAodmFsdWUuJCR0eXBlb2YgPT09IFN5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpIHx8IHZhbHVlLiQkdHlwZW9mID09PSAweGVhYzcpKXtcclxuICAgICAgICAgICAgICAgICAgICBpZihjb21wUGF0aCA9PT0gXCJMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UYWJzXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihsYW5nID09PSBcInJlYWN0XCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtzdHlsZToge1xyXG5tYXJnaW5Ub3A6IFwiMjBweFwiLCBtYXJnaW5Cb3R0b206IFwiMjBweFwiXHJcbn19LFxyXG5SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtzdHlsZToge1xyXG5iYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tYmFja2dyb3VuZC1zZWNvbmRhcnkpXCIsXHJcbnBhZGRpbmc6IFwiMzBweCAzMHB4XCIsXHJcbmJvcmRlclJhZGl1czogXCI4cHhcIlxyXG59LCBjbGFzc05hbWU6IFwibGMtdGFiLWJveC1zaGFkb3dcIiB9LFxyXG5SZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlRpdGxlLCBudWxsLCBcIlByZXZpZXcgdGFic1wiKVxyXG4pXHJcbilgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGxhbmcgPT09IFwianN4XCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGA8ZGl2IHN0eWxlPXt7XHJcbm1hcmdpblRvcDogXCIyMHB4XCIsIG1hcmdpbkJvdHRvbTogXCIyMHB4XCJcclxufX0+XHJcbjxkaXYgc3R5bGU9e3tcclxuICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXNlY29uZGFyeSlcIiwgXHJcbiAgICBwYWRkaW5nOiBcIjMwcHggMzBweFwiLCBcclxuICAgIGJvcmRlclJhZGl1czogXCI4cHhcIlxyXG59fSBjbGFzc05hbWU9XCJsYy10YWItYm94LXNoYWRvd1wiPlxyXG4gICAgPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlRpdGxlPlByZXZpZXcgdGFiczwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuVGl0bGU+XHJcbjwvZGl2PlxyXG48L2Rpdj5gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiWW91ciBjb21wb25lbnRzIGhlcmUuXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgXCIgICAgXCIpXHJcbiAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIil7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBnZW5lcmF0ZUNvZGUgPSBmdW5jdGlvbihsYW5nKXsgLy8gY29kZSBmb3JtYXR0aW5nIGlzIGhhcmRcclxuICAgICAgICAgICAgY29uc3QgY29tcE5hbWUgPSBjb21wLmRpc3BsYXlOYW1lIHx8IGNvbXAubmFtZVxyXG4gICAgICAgICAgICBsZXQgY2F0ZWdvcmllcyA9IE9iamVjdC5rZXlzKHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMpXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBDYXRlZ29yeSA9IGNhdGVnb3JpZXMuZmluZChlID0+IHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHNbZV1bY29tcE5hbWVdKVxyXG4gICAgICAgICAgICBjb25zdCBjb21wUGF0aCA9IGBMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuJHtjb21wQ2F0ZWdvcnl9LiR7Y29tcE5hbWV9YFxyXG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IGdldFByb3BzKClcclxuXHJcbiAgICAgICAgICAgIGlmKGxhbmcgPT09IFwianN4XCIpe1xyXG4gICAgICAgICAgICAgICAgbGV0IHByb3BTdHJpbmdzID0gW11cclxuICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlblByb3AgPSBudWxsXHJcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGtleSA9PSBcImNoaWxkcmVuXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlblByb3AgPSBnZXRTdHJGb3JQcm9wKHByb3BzW2tleV0sIGNvbXBQYXRoLCBsYW5nKVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyID0ga2V5K1wiPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBwcm9wc1trZXldID09PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBKU09OLnN0cmluZ2lmeShwcm9wc1trZXldKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBgeyR7Z2V0U3RyRm9yUHJvcChwcm9wc1trZXldLCBjb21wUGF0aCwgbGFuZyl9fWBcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wU3RyaW5ncy5wdXNoKHN0cilcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgbGV0IG9wZW5UYWdcclxuICAgICAgICAgICAgICAgIGlmKGNoaWxkcmVuUHJvcCl7XHJcbiAgICAgICAgICAgICAgICAgICAgb3BlblRhZyA9IGA8JHtjb21wUGF0aH0gJHtwcm9wU3RyaW5ncy5qb2luKFwiIFwiKX0+YFxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjbG9zZVRhZyA9IGA8LyR7Y29tcFBhdGh9PmBcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7b3BlblRhZ31cXG4gICAgJHtjaGlsZHJlblByb3B9XFxuJHtjbG9zZVRhZ31gXHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBvcGVuVGFnID0gYDwke2NvbXBQYXRofSAke3Byb3BTdHJpbmdzLmpvaW4oXCIgXCIpfS8+YFxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcGVuVGFnXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKGxhbmcgPT09IFwicmVhY3RcIil7XHJcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbiB8fCBudWxsXHJcbiAgICAgICAgICAgICAgICBkZWxldGUgcHJvcHMuY2hpbGRyZW5cclxuICAgICAgICAgICAgICAgIGlmKGNoaWxkcmVuICYmIGNoaWxkcmVuLiQkdHlwZW9mICYmIChjaGlsZHJlbi4kJHR5cGVvZiA9PT0gU3ltYm9sLmZvcihcInJlYWN0LmVsZW1lbnRcIikgfHwgY2hpbGRyZW4uJCR0eXBlb2YgPT09IDB4ZWFjNykpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gZ2V0U3RyRm9yUHJvcChjaGlsZHJlbiwgY29tcFBhdGgsIGxhbmcpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvcFN0cmluZ3MgPSBbXVxyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocHJvcHMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmlzaWJsZUtleSA9IC9bXlxcd1xcZF9dL2cudGVzdChrZXkpID8gSlNPTi5zdHJpbmdpZnkoa2V5KSA6IGtleVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzdHIgPSB2aXNpYmxlS2V5K1wiOiBcIlxyXG4gICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBwcm9wc1trZXldID09PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IEpTT04uc3RyaW5naWZ5KHByb3BzW2tleV0pXHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBnZXRTdHJGb3JQcm9wKHByb3BzW2tleV0sIGNvbXBQYXRoLCBsYW5nKS5zcGxpdChcIlxcblwiKS5tYXAoKHN0ciwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaSA9PT0gMClyZXR1cm4gc3RyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgICAgXCIgKyBzdHJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbihcIlxcblwiKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBwcm9wU3RyaW5ncy5wdXNoKHN0cilcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvcE9iamVjdCA9IFwie1wiXHJcbiAgICAgICAgICAgICAgICBpZihwcm9wU3RyaW5ncy5sZW5ndGgpe1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BTdHJpbmdzLmZvckVhY2goKHN0ciwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNMYXN0ID0gaSA9PT0gcHJvcFN0cmluZ3MubGVuZ3RoIC0gMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNGaXJzdCA9IGkgPT09IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWlzRmlyc3Qpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPSBcIixcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BPYmplY3QgKz0gXCJcXG4gICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPSBzdHJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNMYXN0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BPYmplY3QgKz1cIlxcbn1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BPYmplY3QgKz0gXCJ9XCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbkRhdGEgPSB0eXBlb2YgY2hpbGRyZW4gPT09IFwic3RyaW5nXCIgJiYgY2hpbGRyZW4uc3RhcnRzV2l0aChcIlJlYWN0LmNyZWF0ZUVsZW1lbnRcIikgPyBjaGlsZHJlbiA6IEpTT04uc3RyaW5naWZ5KGNoaWxkcmVuKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBSZWFjdC5jcmVhdGVFbGVtZW50KCR7Y29tcFBhdGh9LCAke3Byb3BPYmplY3R9LCAke2NoaWxkcmVuRGF0YX0pYFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBoZWxwID0gY29tcC5oZWxwIHx8IHt9XHJcbiAgICAgICAgbGV0IGluZm8gPSBoZWxwLmluZm8gPyA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94IHR5cGU9XCJpbmZvXCI+XHJcbiAgICAgICAgICAgIHtoZWxwLmluZm99XHJcbiAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3g+IDogbnVsbFxyXG4gICAgICAgIGxldCB3YXJuID0gaGVscC53YXJuID8gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwid2FyblwiPlxyXG4gICAgICAgICAgICB7aGVscC53YXJufVxyXG4gICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcclxuICAgICAgICBsZXQgZGFuZ2VyID0gaGVscC5kYW5nZXIgPyA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94IHR5cGU9XCJkYW5nZXJcIj5cclxuICAgICAgICAgICAge2hlbHAuZGFuZ2VyfVxyXG4gICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcclxuICAgICAgICBsZXQgZXJyb3IgPSBoZWxwLmVycm9yID8gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwiZXJyb3JcIj5cclxuICAgICAgICAgICAge2hlbHAuZXJyb3J9XHJcbiAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3g+IDogbnVsbFxyXG4gICAgICAgIGxldCBzdWNjZXNzID0gaGVscC5zdWNjZXNzID8gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwic3VjY2Vzc1wiPlxyXG4gICAgICAgICAgICB7aGVscC5zdWNjZXNzfVxyXG4gICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcclxuICAgICAgICByZXR1cm4gKDxkaXY+XHJcbiAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ3NUaXRsZT5cclxuICAgICAgICAgICAgICAgIHtjb21wLmRpc3BsYXlOYW1lIHx8IGNvbXAubmFtZX1cclxuICAgICAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ3NUaXRsZT5cclxuICAgICAgICAgICAge2luZm99XHJcbiAgICAgICAgICAgIHtzdWNjZXNzfVxyXG4gICAgICAgICAgICB7d2Fybn1cclxuICAgICAgICAgICAge2Vycm9yfVxyXG4gICAgICAgICAgICB7ZGFuZ2VyfVxyXG4gICAgICAgICAgICB7QWxsUHJldmlld3MubWFwKGNhdGVnb3J5ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKGNhdGVnb3J5WzBdLm9uQ2xpY2spcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgIGlmKGNhdGVnb3J5WzBdLnRleHQpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgIGlmKGNhdGVnb3J5WzBdLmNoaWxkcmVuKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICBpZihjYXRlZ29yeS5sZW5ndGggPT09IDEpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IE9iamVjdC5rZXlzKGNhdGVnb3J5WzBdKVswXVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdTdWJUaXRsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAge2tleX1cclxuICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+LFxyXG4gICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5Ecm9wZG93biBvcHRpb25zPXtjYXRlZ29yeS5tYXAoKGUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogXCJvcHQtXCIraW5kZXgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogSlNPTi5zdHJpbmdpZnkoZVtPYmplY3Qua2V5cyhlKVswXV0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KX0gdmFsdWU9e1wib3B0LVwiKyhzdGF0ZS5vcHRpb25zW2tleV0gfHwgXCIwXCIpfSBvbkNoYW5nZT17KHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUub3B0aW9ucywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtrZXldOiAodmFsdWUudmFsdWUgfHwgXCIwXCIpLnJlcGxhY2UoXCJvcHQtXCIsIFwiXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH19IHNlYXJjaGFibGU9e3RydWV9Lz4sXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e21hcmdpbkJvdHRvbTogXCI4cHhcIn19PjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UYWJzIHRhYnM9e1t7bGFiZWw6IFwiUHJldmlld1wiLCBpZDogXCJwcmV2aWV3XCJ9LCB7bGFiZWw6IFwiQ29kZVwiLCBpZDogXCJjb2RlXCJ9XX0gXHJcbiAgICAgICAgICAgICAgICBhY3RpdmU9e3N0YXRlLnRhYn0gY2hpbGRyZW49e3N0YXRlLnRhYiA9PT0gXCJwcmV2aWV3XCIgPyByZW5kZXJQcmV2aWV3KCkgOiByZW5kZXJDb2RlKCl9IG9uQ2hhbmdlPXsodGFiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYlxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9fS8+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuLi9tb2R1bGVzL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgWFN2ZyBmcm9tIFwiLi94U3ZnXCI7XHJcbmltcG9ydCBSZWxvYWRJY29uIGZyb20gXCIuL3JlbG9hZEljb25cIjtcclxuaW1wb3J0IEVkaXRJY29uIGZyb20gXCIuL2ljb25zL2VkaXRcIjtcclxuaW1wb3J0IERlbGV0ZUljb24gZnJvbSBcIi4vaWNvbnMvZGVsZXRlXCI7XHJcbmltcG9ydCBTd2l0Y2ggZnJvbSBcIi4vY29tcG9uZW50cy9zd2l0Y2hcIjtcclxuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuL3Rvb2x0aXBXcmFwXCI7XHJcbmltcG9ydCB7IHByb2Nlc3NGaWxlIH0gZnJvbSBcIi4uL21vZHVsZXMvcGx1Z2luQ2VydGlmaWVyXCI7XHJcbmltcG9ydCBjb250ZW50TWFuYWdlciBmcm9tIFwiLi4vbW9kdWxlcy9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcInBhdGhcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuY29uc3QgYW5jaG9yQ2xhc3NlcyA9IEJEVjIuYW5jaG9yQ2xhc3NlcztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19QbHVnaW5DYXJkIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNob3dTZXR0aW5ncyA9IHRoaXMuc2hvd1NldHRpbmdzLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgICAgICB0aGlzLmhhc1NldHRpbmdzID0gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gJiYgdHlwZW9mKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldFNldHRpbmdzUGFuZWwpID09PSBcImZ1bmN0aW9uXCI7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nc1BhbmVsID0gXCJcIjtcclxuXHJcbiAgICAgICAgdGhpcy5lZGl0ID0gdGhpcy5lZGl0LmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5kZWxldGUgPSB0aGlzLmRlbGV0ZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMucmVsb2FkID0gdGhpcy5yZWxvYWQuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgY2hlY2tlZDogdGhpcy5wcm9wcy5lbmFibGVkLFxyXG4gICAgICAgICAgICBzZXR0aW5nczogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlbG9hZHM6IDAsXHJcbiAgICAgICAgICAgIHRydXN0ZWQ6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93U2V0dGluZ3MoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc1NldHRpbmdzKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c2V0dGluZ3M6IHRydWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZVNldHRpbmdzKCkge1xyXG4gICAgICAgIHRoaXMucGFuZWxSZWYuY3VycmVudC5pbm5lckhUTUwgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3NldHRpbmdzT3BlbjogZmFsc2V9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRVcGRhdGUoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLnNldHRpbmdzKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNldHRpbmdzUGFuZWwgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWZzLnNldHRpbmdzcGFuZWwuYXBwZW5kQ2hpbGQodGhpcy5zZXR0aW5nc1BhbmVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTNcIl0pIHJldHVybjtcclxuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpc0hpZGRlbiA9IChjb250YWluZXIsIGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKCFjb250YWluZXIpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobmV3IEVycm9yKGBDb250YWluZXIgaXMgdW5kZWZpbmVkLmApKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgY1RvcCA9IGNvbnRhaW5lci5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjQm90dG9tID0gY1RvcCArIGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlVG9wID0gZWxlbWVudC5vZmZzZXRUb3A7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlQm90dG9tID0gZVRvcCArIGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICAoZVRvcCA8IGNUb3AgfHwgZUJvdHRvbSA+IGNCb3R0b20pO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgdGhpc05vZGUgPSB0aGlzLnJlZnMuY2FyZE5vZGU7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXNOb2RlLmNsb3Nlc3QoXCJkaXZbY2xhc3MqPVxcXCJjb250ZW50UmVnaW9uU2Nyb2xsZXItXFxcIl1cIilcclxuICAgICAgICAgICAgaWYgKCFpc0hpZGRlbihjb250YWluZXIsIHRoaXNOb2RlKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCB0aGlzTm9kZU9mZnNldCA9IERPTS5vZmZzZXQodGhpc05vZGUpO1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJPZmZzZXQgPSBET00ub2Zmc2V0KGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsID0gY29udGFpbmVyLnNjcm9sbFRvcDtcclxuICAgICAgICAgICAgY29uc3QgZW5kUG9pbnQgPSB0aGlzTm9kZU9mZnNldC50b3AgLSBjb250YWluZXJPZmZzZXQudG9wICsgY29udGFpbmVyLnNjcm9sbFRvcCAtIDMwO1xyXG4gICAgICAgICAgICBET00uYW5pbWF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwLFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmRQb2ludCA+IG9yaWdpbmFsKSBjb250YWluZXIuc2Nyb2xsVG9wID0gb3JpZ2luYWwgKyAocHJvZ3Jlc3MgKiAoZW5kUG9pbnQgLSBvcmlnaW5hbCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgY29udGFpbmVyLnNjcm9sbFRvcCA9IG9yaWdpbmFsIC0gKHByb2dyZXNzICogKG9yaWdpbmFsIC0gZW5kUG9pbnQpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldFN0cmluZyh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybiBcIj8/P1wiO1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2V0dGluZ3NDb21wb25lbnQoKSB7XHJcbiAgICAgICAgdHJ5IHsgdGhpcy5zZXR0aW5nc1BhbmVsID0gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0U2V0dGluZ3NQYW5lbCgpOyB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikgeyBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIFwiVW5hYmxlIHRvIGdldCBzZXR0aW5ncyBwYW5lbCBmb3IgXCIgKyB0aGlzLm5hbWUgKyBcIi5cIiwgZXJyKTsgfVxyXG5cclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtY2FyZCBiZC1hZGRvbi1jYXJkIHNldHRpbmdzLW9wZW4gdWktc3dpdGNoLWl0ZW1cIiwgcmVmOiBcImNhcmROb2RlXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtzdHlsZToge1wiZmxvYXRcIjogXCJyaWdodFwiLCBcImN1cnNvclwiOiBcInBvaW50ZXJcIn0sIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZzLnNldHRpbmdzcGFuZWwuaW5uZXJIVE1MID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c2V0dGluZ3M6IGZhbHNlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoWFN2ZywgbnVsbClcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuc2V0dGluZ3NQYW5lbCA9PT0gXCJvYmplY3RcIiAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBgcGx1Z2luLXNldHRpbmdzLSR7dGhpcy5uYW1lfWAsIGNsYXNzTmFtZTogXCJwbHVnaW4tc2V0dGluZ3NcIiwgcmVmOiBcInNldHRpbmdzcGFuZWxcIn0pLFxyXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5zZXR0aW5nc1BhbmVsICE9PSBcIm9iamVjdFwiICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IGBwbHVnaW4tc2V0dGluZ3MtJHt0aGlzLm5hbWV9YCwgY2xhc3NOYW1lOiBcInBsdWdpbi1zZXR0aW5nc1wiLCByZWY6IFwic2V0dGluZ3NwYW5lbFwiLCBkYW5nZXJvdXNseVNldElubmVySFRNTDoge19faHRtbDogdGhpcy5zZXR0aW5nc1BhbmVsfX0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBidWlsZFRpdGxlKG5hbWUsIHZlcnNpb24sIGF1dGhvcikge1xyXG4gICAgICAgIGNvbnN0IHRpdGxlID0gXCJ7e25hbWV9fSB2e3t2ZXJzaW9ufX0gYnkge3thdXRob3J9fVwiLnNwbGl0KC8oe3tbQS1aYS16XSt9fSkvKTtcclxuICAgICAgICBjb25zdCBuYW1lSW5kZXggPSB0aXRsZS5maW5kSW5kZXgocyA9PiBzID09IFwie3tuYW1lfX1cIik7XHJcbiAgICAgICAgaWYgKG5hbWVJbmRleCkgdGl0bGVbbmFtZUluZGV4XSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IFwibmFtZSBiZGEtbmFtZVwifSwgbmFtZSk7XHJcbiAgICAgICAgY29uc3QgdmVyc2lvbkluZGV4ID0gdGl0bGUuZmluZEluZGV4KHMgPT4gcyA9PSBcInt7dmVyc2lvbn19XCIpO1xyXG4gICAgICAgIGlmIChuYW1lSW5kZXgpIHRpdGxlW3ZlcnNpb25JbmRleF0gPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBcInZlcnNpb24gYmRhLXZlcnNpb25cIn0sIHZlcnNpb24pO1xyXG4gICAgICAgIGNvbnN0IGF1dGhvckluZGV4ID0gdGl0bGUuZmluZEluZGV4KHMgPT4gcyA9PSBcInt7YXV0aG9yfX1cIik7XHJcbiAgICAgICAgaWYgKG5hbWVJbmRleCkge1xyXG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IHtjbGFzc05hbWU6IFwiYXV0aG9yIGJkYS1hdXRob3JcIn07XHJcbiAgICAgICAgICAgIGlmIChhdXRob3IubGluayB8fCBhdXRob3IuaWQpIHtcclxuICAgICAgICAgICAgICAgIHByb3BzLmNsYXNzTmFtZSArPSBgICR7YW5jaG9yQ2xhc3Nlcy5hbmNob3J9ICR7YW5jaG9yQ2xhc3Nlcy5hbmNob3JVbmRlcmxpbmVPbkhvdmVyfWA7XHJcbiAgICAgICAgICAgICAgICBwcm9wcy50YXJnZXQgPSBcIl9ibGFua1wiO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhdXRob3IubGluaykgcHJvcHMuaHJlZiA9IGF1dGhvci5saW5rO1xyXG4gICAgICAgICAgICAgICAgaWYgKGF1dGhvci5pZCkgcHJvcHMub25DbGljayA9ICgpID0+IHtCRFYyLkxheWVyU3RhY2sucG9wTGF5ZXIoKTsgQkRWMi5vcGVuRE0oYXV0aG9yLmlkKTt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRpdGxlW2F1dGhvckluZGV4XSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoYXV0aG9yLmxpbmsgfHwgYXV0aG9yLmlkID8gXCJhXCIgOiBcInNwYW5cIiwgcHJvcHMsIGF1dGhvci5uYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRpdGxlLmZsYXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBtYWtlTGluayh0aXRsZSwgdXJsKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcHMgPSB7Y2xhc3NOYW1lOiBcImJkYS1saW5rIGJkYS1saW5rLXdlYnNpdGVcIiwgdGFyZ2V0OiBcIl9ibGFua1wifTtcclxuICAgICAgICBpZiAodHlwZW9mKHVybCkgPT0gXCJzdHJpbmdcIikgcHJvcHMuaHJlZiA9IHVybDtcclxuICAgICAgICBpZiAodHlwZW9mKHVybCkgPT0gXCJmdW5jdGlvblwiKSBwcm9wcy5vbkNsaWNrID0gKGV2ZW50KSA9PiB7ZXZlbnQucHJldmVudERlZmF1bHQoKTsgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHVybCgpO307XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwgcHJvcHMsIHRpdGxlKTtcclxuICAgIH1cclxuXHJcbiAgICBtYWtlQnV0dG9uKHRpdGxlLCBjaGlsZHJlbiwgYWN0aW9uKSB7XHJcbiAgICAgICAgcmV0dXJuIDxUb29sdGlwV3JhcCBjb2xvcj1cImJsYWNrXCIgc2lkZT1cInRvcFwiIHRleHQ9e3RpdGxlfT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1hZGRvbi1idXR0b25cIiBvbkNsaWNrPXthY3Rpb259PntjaGlsZHJlbn08L2Rpdj5cclxuICAgICAgICA8L1Rvb2x0aXBXcmFwPjtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpe1xyXG4gICAgICAgIHRoaXMudW5tb3VudGVkID0gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBsaW5rcygpIHtcclxuICAgICAgICBjb25zdCBsaW5rcyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGFkZG9uID0gdGhpcy5wcm9wcy5hZGRvbjtcclxuICAgICAgICBpZiAoYWRkb24ud2Vic2l0ZSkgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiV2Vic2l0ZVwiLCBhZGRvbi53ZWJzaXRlKSk7XHJcbiAgICAgICAgaWYgKGFkZG9uLnNvdXJjZSkgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiU291cmNlXCIsIGFkZG9uLnNvdXJjZSkpO1xyXG4gICAgICAgIGlmIChhZGRvbi5pbnZpdGUpIHtcclxuICAgICAgICAgICAgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiU3VwcG9ydCBTZXJ2ZXJcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVzdGVyID0gL1xcLmdnXFwvKC4qKSQvO1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvZGUgPSBhZGRvbi5pbnZpdGU7XHJcbiAgICAgICAgICAgICAgICBpZiAodGVzdGVyLnRlc3QoY29kZSkpIGNvZGUgPSBjb2RlLm1hdGNoKHRlc3RlcilbMV07XHJcbiAgICAgICAgICAgICAgICBCRFYyLkxheWVyU3RhY2sucG9wTGF5ZXIoKTtcclxuICAgICAgICAgICAgICAgIEJEVjIuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGVBbmRUcmFuc2l0aW9uVG9JbnZpdGVDaGFubmVsKGNvZGUpO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhZGRvbi5kb25hdGUpIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIkRvbmF0ZVwiLCBhZGRvbi5kb25hdGUpKTtcclxuICAgICAgICBpZiAoYWRkb24ucGF0cmVvbikgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiUGF0cmVvblwiLCBhZGRvbi5wYXRyZW9uKSk7XHJcbiAgICAgICAgcmV0dXJuIGxpbmtzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBmb290ZXIoKSB7XHJcbiAgICAgICAgY29uc3QgbGlua3MgPSB0aGlzLmxpbmtzO1xyXG4gICAgICAgIHJldHVybiAobGlua3MubGVuZ3RoIHx8IHRoaXMuaGFzU2V0dGluZ3MpICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNhcmQtZm9vdGVyIGJkYS1mb290ZXJcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJiZC1hZGRvbi1saW5rcyBiZGEtbGlua3NcIn0sXHJcbiAgICAgICAgICAgICAgICAuLi4obGlua3MubWFwKChlbGVtZW50LCBpbmRleCkgPT4gaW5kZXggPCBsaW5rcy5sZW5ndGggLSAxID8gW2VsZW1lbnQsIFwiIHwgXCJdIDogZWxlbWVudCkuZmxhdCgpKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICB0aGlzLmhhc1NldHRpbmdzICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7b25DbGljazogdGhpcy5zaG93U2V0dGluZ3MsIGNsYXNzTmFtZTogXCJiZC1idXR0b24gYmRhLXNldHRpbmdzLWJ1dHRvblwiLCBkaXNhYmxlZDogIXRoaXMuc3RhdGUuY2hlY2tlZH0sIFwiU2V0dGluZ3NcIilcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMudG9nZ2xlICYmIHRoaXMucHJvcHMudG9nZ2xlKHRoaXMubmFtZSk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Y2hlY2tlZDogIXRoaXMuc3RhdGUuY2hlY2tlZH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGVkaXQoKSB7dGhpcy5wcm9wcy5lZGl0KHRoaXMubmFtZSk7fVxyXG4gICAgZGVsZXRlKCkge3RoaXMucHJvcHMucmVtb3ZlKHRoaXMubmFtZSk7fVxyXG4gICAgcmVsb2FkKCkge3RoaXMucHJvcHMucmVsb2FkKHRoaXMubmFtZSk7fVxyXG5cclxuICAgIGdldCBuYW1lKCkge3JldHVybiB0aGlzLmdldFN0cmluZyh0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiA/IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldE5hbWUoKSA6IHRoaXMucHJvcHMuYWRkb24ubmFtZSk7fVxyXG4gICAgZ2V0IGF1dGhvcigpIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcodGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gPyB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXRBdXRob3IoKSA6IHRoaXMucHJvcHMuYWRkb24uYXV0aG9yKTt9XHJcbiAgICBnZXQgZGVzY3JpcHRpb24oKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luID8gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0RGVzY3JpcHRpb24oKSA6IHRoaXMucHJvcHMuYWRkb24uZGVzY3JpcHRpb24pO31cclxuICAgIGdldCB2ZXJzaW9uKCkge3JldHVybiB0aGlzLmdldFN0cmluZyh0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiA/IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldFZlcnNpb24oKSA6IHRoaXMucHJvcHMuYWRkb24udmVyc2lvbik7fVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5zZXR0aW5ncykgcmV0dXJuIHRoaXMuc2V0dGluZ3NDb21wb25lbnQ7XHJcbiAgICAgICAgY29uc3Qge2F1dGhvcklkLCBhdXRob3JMaW5rfSA9IHRoaXMucHJvcHMuYWRkb247XHJcblxyXG4gICAgICAgIGNvbnN0IHN0eWxlID0ge31cclxuICAgICAgICBpZihzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNlwiXSl7XHJcbiAgICAgICAgICAgIGlmKCF0aGlzLmlzU2Nhbm5pbmcpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1NjYW5uaW5nID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0ZpbGUocmVzb2x2ZSh0aGlzLnByb3BzLmFkZG9uLmZpbGVuYW1lLmVuZHNXaXRoKFwiLnBsdWdpbi5qc1wiKSA/IGNvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIgOiBjb250ZW50TWFuYWdlci50aGVtZXNGb2xkZXIsIHRoaXMucHJvcHMuYWRkb24uZmlsZW5hbWUpLCAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy51bm1vdW50ZWQpcmV0dXJuXHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNUcnVzdGVkOiByZXN1bHQuc3VzcGVjdCA/IFwic3VzcGVjdFwiIDogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9LCAoKSA9PiB7fSlcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLnN0YXRlLmlzVHJ1c3RlZCA9PT0gdHJ1ZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiM0MDg3ZWRcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5zdGF0ZS5pc1RydXN0ZWQgPT09IFwic3VzcGVjdFwiKXtcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZS5ib3JkZXJDb2xvciA9IFwicmdiKDI0MCwgNzEsIDcxKVwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNhcmQgYmQtYWRkb24tY2FyZCBzZXR0aW5ncy1jbG9zZWQgdWktc3dpdGNoLWl0ZW1cIiwgc3R5bGV9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1hZGRvbi1oZWFkZXIgYmRhLWhlYWRlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1jYXJkLXRpdGxlIGJkYS1oZWFkZXItdGl0bGVcIn0sIHRoaXMuYnVpbGRUaXRsZSh0aGlzLm5hbWUsIHRoaXMudmVyc2lvbiwge25hbWU6IHRoaXMuYXV0aG9yLCBpZDogYXV0aG9ySWQsIGxpbms6IGF1dGhvckxpbmt9KSksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtYWRkb24tY29udHJvbHMgYmRhLWNvbnRyb2xzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLmVkaXQgJiYgdGhpcy5tYWtlQnV0dG9uKFwiRWRpdFwiLCA8RWRpdEljb24gY2xhc3NOYW1lPVwiYmQtaWNvblwiIC8+LCB0aGlzLmVkaXQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnJlbW92ZSAmJiB0aGlzLm1ha2VCdXR0b24oXCJEZWxldGVcIiwgPERlbGV0ZUljb24gY2xhc3NOYW1lPVwiYmQtaWNvblwiIC8+LCB0aGlzLmRlbGV0ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMucmVsb2FkICYmIHRoaXMubWFrZUJ1dHRvbihcIlJlbG9hZFwiLCA8UmVsb2FkSWNvbiBjbGFzc05hbWU9XCJiZC1pY29uXCIgLz4sIHRoaXMucmVsb2FkKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChTd2l0Y2gsIHtvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgY2hlY2tlZDogdGhpcy5zdGF0ZS5jaGVja2VkfSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLXNjcm9sbGVyLXdyYXAgYmRhLWRlc2NyaXB0aW9uLXdyYXAgc2Nyb2xsZXItd3JhcCBmYWRlXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtc2Nyb2xsZXIgYmQtYWRkb24tZGVzY3JpcHRpb24gYmRhLWRlc2NyaXB0aW9uIHNjcm9sbGVyXCJ9LCB0aGlzLmRlc2NyaXB0aW9uKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICB0aGlzLmZvb3RlclxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IG9yaWdpbmFsUmVuZGVyID0gVjJDX1BsdWdpbkNhcmQucHJvdG90eXBlLnJlbmRlcjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFYyQ19QbHVnaW5DYXJkLnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xyXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgc2V0OiBmdW5jdGlvbigpIHtjb25zb2xlLndhcm4oXCJBZGRvbiBwb2xpY3kgZm9yIHBsdWdpbnMgIzUgaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC93aWtpL0FkZG9uLVBvbGljaWVzI3BsdWdpbnNcIik7fSxcclxuICAgIGdldDogKCkgPT4gb3JpZ2luYWxSZW5kZXJcclxufSk7IiwiaW1wb3J0IEVycm9yQm91bmRhcnkgZnJvbSBcIi4vZXJyb3JCb3VuZGFyeVwiO1xyXG5pbXBvcnQgQ29udGVudENvbHVtbiBmcm9tIFwiLi9jb250ZW50Q29sdW1uXCI7XHJcbmltcG9ydCBSZWxvYWRJY29uIGZyb20gXCIuL3JlbG9hZEljb25cIjtcclxuaW1wb3J0IEFkZG9uQ2FyZCBmcm9tIFwiLi9hZGRvbmNhcmRcIjtcclxuaW1wb3J0IERyb3Bkb3duIGZyb20gXCIuL2NvbXBvbmVudHMvZHJvcGRvd25cIjtcclxuaW1wb3J0IFNlYXJjaCBmcm9tIFwiLi9jb21wb25lbnRzL3NlYXJjaFwiO1xyXG5cclxuaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZSwgcGx1Z2luQ29va2llLCB0aGVtZUNvb2tpZSwgYmRwbHVnaW5zLCBiZHRoZW1lc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi4vbW9kdWxlcy9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgcGx1Z2luTW9kdWxlIGZyb20gXCIuLi9tb2R1bGVzL3BsdWdpbk1vZHVsZVwiO1xyXG5pbXBvcnQgdGhlbWVNb2R1bGUgZnJvbSBcIi4uL21vZHVsZXMvdGhlbWVNb2R1bGVcIjtcclxuaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuLi9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzXCI7XHJcbmltcG9ydCBCZEFwaSBmcm9tIFwiLi4vbW9kdWxlcy9iZEFwaVwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4uL21vZHVsZXMvdXRpbHNcIjtcclxuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuL3Rvb2x0aXBXcmFwXCI7XHJcbmltcG9ydCBiZEV2ZW50cyBmcm9tIFwiLi4vbW9kdWxlcy9iZEV2ZW50c1wiO1xyXG5pbXBvcnQgRW11bGF0ZWRUb29sdGlwIGZyb20gXCIuL3Rvb2x0aXBcIjtcclxuXHJcbmNvbnN0IFRvb2x0aXAgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIlRvb2x0aXBcIik7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIucmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXJkTGlzdCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtzb3J0OiBcIm5hbWVcIiwgYXNjZW5kaW5nOiB0cnVlLCBxdWVyeTogXCJcIn07XHJcbiAgICAgICAgdGhpcy5pc1BsdWdpbnMgPSB0aGlzLnByb3BzLnR5cGUgPT0gXCJwbHVnaW5zXCI7XHJcbiAgICAgICAgdGhpcy5jb29raWUgPSB0aGlzLmlzUGx1Z2lucyA/IHBsdWdpbkNvb2tpZSA6IHRoZW1lQ29va2llO1xyXG4gICAgICAgIHRoaXMubWFuYWdlciA9IHRoaXMuaXNQbHVnaW5zID8gcGx1Z2luTW9kdWxlIDogdGhlbWVNb2R1bGU7XHJcblxyXG4gICAgICAgIHRoaXMuc29ydCA9IHRoaXMuc29ydC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMucmV2ZXJzZSA9IHRoaXMucmV2ZXJzZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoID0gdGhpcy5zZWFyY2guYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5vbkFkZG9uQ2hhbmdlcyA9IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9uQWRkb25DaGFuZ2VzID0gdGhpcy5vbkFkZG9uQ2hhbmdlcy5iaW5kKHRoaXMpXHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKXtcclxuICAgICAgICBjb25zdCB0eXBlID0gKHRoaXMuaXNQbHVnaW5zID8gXCJwbHVnaW5cIiA6IFwidGhlbWVcIikgKyBcIi1cIlxyXG4gICAgICAgIGJkRXZlbnRzLm9uKGAke3R5cGV9bG9hZGVkYCwgdGhpcy5vbkFkZG9uQ2hhbmdlcylcclxuICAgICAgICBiZEV2ZW50cy5vbihgJHt0eXBlfXVubG9hZGVkYCwgdGhpcy5vbkFkZG9uQ2hhbmdlcylcclxuICAgICAgICBiZEV2ZW50cy5vbihgJHt0eXBlfXJlbG9hZGVkYCwgdGhpcy5vbkFkZG9uQ2hhbmdlcylcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpe1xyXG4gICAgICAgIGNvbnN0IHR5cGUgPSAodGhpcy5pc1BsdWdpbnMgPyBcInBsdWdpblwiIDogXCJ0aGVtZVwiKSArIFwiLVwiXHJcbiAgICAgICAgYmRFdmVudHMub2ZmKGAke3R5cGV9bG9hZGVkYCwgdGhpcy5vbkFkZG9uQ2hhbmdlcylcclxuICAgICAgICBiZEV2ZW50cy5vZmYoYCR7dHlwZX11bmxvYWRlZGAsIHRoaXMub25BZGRvbkNoYW5nZXMpXHJcbiAgICAgICAgYmRFdmVudHMub2ZmKGAke3R5cGV9cmVsb2FkZWRgLCB0aGlzLm9uQWRkb25DaGFuZ2VzKVxyXG4gICAgfVxyXG5cclxuICAgIG9wZW5Gb2xkZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2hlbGwgPSByZXF1aXJlKFwiZWxlY3Ryb25cIikuc2hlbGw7XHJcbiAgICAgICAgY29uc3Qgb3BlbiA9IHNoZWxsLm9wZW5QYXRoIHx8IHNoZWxsLm9wZW5JdGVtO1xyXG4gICAgICAgIG9wZW4odGhpcy5pc1BsdWdpbnMgPyBDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyIDogQ29udGVudE1hbmFnZXIudGhlbWVzRm9sZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBlZGl0KG5hbWUpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhuYW1lKTtcclxuICAgICAgICB0aGlzLm1hbmFnZXIuZWRpdChuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkZWxldGUobmFtZSkge1xyXG4gICAgICAgIGNvbnN0IHNob3VsZERlbGV0ZSA9IGF3YWl0IHRoaXMuY29uZmlybURlbGV0ZShuYW1lKTtcclxuICAgICAgICBpZiAoIXNob3VsZERlbGV0ZSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMubWFuYWdlci5kZWxldGUobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uZmlybURlbGV0ZShuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBCZEFwaS5zaG93Q29uZmlybWF0aW9uTW9kYWwoXCJBcmUgWW91IFN1cmU/XCIsIGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICR7bmFtZX0/YCwge1xyXG4gICAgICAgICAgICAgICAgZGFuZ2VyOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgY29uZmlybVRleHQ6IFwiRGVsZXRlXCIsXHJcbiAgICAgICAgICAgICAgICBvbkNvbmZpcm06ICgpID0+IHtyZXNvbHZlKHRydWUpO30sXHJcbiAgICAgICAgICAgICAgICBvbkNhbmNlbDogKCkgPT4ge3Jlc29sdmUoZmFsc2UpO31cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNvcnRPcHRpb25zKCkge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJOYW1lXCIsIHZhbHVlOiBcIm5hbWVcIn0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJBdXRob3JcIiwgdmFsdWU6IFwiYXV0aG9yXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiVmVyc2lvblwiLCB2YWx1ZTogXCJ2ZXJzaW9uXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiUmVjZW50bHkgQWRkZWRcIiwgdmFsdWU6IFwiYWRkZWRcIn0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJMYXN0IE1vZGlmaWVkXCIsIHZhbHVlOiBcIm1vZGlmaWVkXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiRmlsZSBTaXplXCIsIHZhbHVlOiBcInNpemVcIn0sXHJcbiAgICAgICAgXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGlyZWN0aW9ucygpIHtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7bGFiZWw6IFwiQXNjZW5kaW5nXCIsIHZhbHVlOiB0cnVlfSxcclxuICAgICAgICAgICAge2xhYmVsOiBcIkRlc2NlbmRpbmdcIiwgdmFsdWU6IGZhbHNlfVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcblxyXG4gICAgcmV2ZXJzZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2FzY2VuZGluZzogdmFsdWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBzb3J0KHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c29ydDogdmFsdWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBzZWFyY2goZXZlbnQpIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtxdWVyeTogZXZlbnQudGFyZ2V0LnZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCl9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcm9wcyhhZGRvbikge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGtleTogdGhpcy5nZXROYW1lKGFkZG9uKSxcclxuICAgICAgICAgICAgZW5hYmxlZDogdGhpcy5jb29raWVbdGhpcy5nZXROYW1lKGFkZG9uKV0sXHJcbiAgICAgICAgICAgIHRvZ2dsZTogdGhpcy5tYW5hZ2VyLnRvZ2dsZS5iaW5kKHRoaXMubWFuYWdlciksXHJcbiAgICAgICAgICAgIGVkaXQ6IHNldHRpbmdzQ29va2llW1wiZm9yay1wcy03XCJdID8gdGhpcy5lZGl0LmJpbmQodGhpcykgOiBudWxsLFxyXG4gICAgICAgICAgICByZW1vdmU6IHRoaXMuZGVsZXRlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgIGFkZG9uOiBhZGRvbixcclxuICAgICAgICAgICAgaGFzaDogYWRkb24uaGFzaFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3RyaW5nKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiPz8/XCI7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBsaXN0KCl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMudHlwZSA9PT0gXCJwbHVnaW5zXCIgPyBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykgOiBPYmplY3QudmFsdWVzKGJkdGhlbWVzKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBZGRvbnMoKSB7XHJcbiAgICAgICAgY29uc3Qgc29ydGVkQWRkb25zID0gdGhpcy5saXN0LnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2FwID0gdGhpcy5zdGF0ZS5zb3J0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGhpcy5zdGF0ZS5zb3J0LnNsaWNlKDEpO1xyXG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IGEucGx1Z2luICYmIGEucGx1Z2luW2BnZXQke2NhcH1gXSA/IHRoaXMuZ2V0U3RyaW5nKGEucGx1Z2luW2BnZXQke2NhcH1gXSgpKSA6IHRoaXMuZ2V0U3RyaW5nKGFbdGhpcy5zdGF0ZS5zb3J0XSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZCA9IGIucGx1Z2luICYmIGIucGx1Z2luW2BnZXQke2NhcH1gXSA/IHRoaXMuZ2V0U3RyaW5nKGIucGx1Z2luW2BnZXQke2NhcH1gXSgpKSAgOiB0aGlzLmdldFN0cmluZyhiW3RoaXMuc3RhdGUuc29ydF0pO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mKGZpcnN0KSA9PSBcInN0cmluZ1wiKSByZXR1cm4gZmlyc3QudG9Mb2NhbGVMb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKHNlY29uZC50b0xvY2FsZUxvd2VyQ2FzZSgpKTtcclxuICAgICAgICAgICAgaWYgKGZpcnN0ID4gc2Vjb25kKSByZXR1cm4gMTtcclxuICAgICAgICAgICAgaWYgKHNlY29uZCA+IGZpcnN0KSByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5hc2NlbmRpbmcpIHNvcnRlZEFkZG9ucy5yZXZlcnNlKCk7XHJcbiAgICAgICAgY29uc3QgcmVuZGVyZWQgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBhID0gMDsgYSA8IHNvcnRlZEFkZG9ucy5sZW5ndGg7IGErKykge1xyXG4gICAgICAgICAgICBjb25zdCBhZGRvbiA9IHNvcnRlZEFkZG9uc1thXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUucXVlcnkpIHtcclxuICAgICAgICAgICAgICAgIGxldCBtYXRjaGVzID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldE5hbWUoYWRkb24pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXV0aG9yID0gdGhpcy5nZXRBdXRob3IoYWRkb24pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSB0aGlzLmdldERlc2NyaXB0aW9uKGFkZG9uKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLmdldFZlcnNpb24oYWRkb24pO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUpIG1hdGNoZXMgPSBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zdGF0ZS5xdWVyeSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXV0aG9yKSBtYXRjaGVzID0gbWF0Y2hlcyB8fCBhdXRob3IudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnN0YXRlLnF1ZXJ5KTtcclxuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbikgbWF0Y2hlcyA9IG1hdGNoZXMgfHwgZGVzY3JpcHRpb24udG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnN0YXRlLnF1ZXJ5KTtcclxuICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uKSBtYXRjaGVzID0gbWF0Y2hlcyB8fCB2ZXJzaW9uLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zdGF0ZS5xdWVyeSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZXMpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5nZXRQcm9wcyhhZGRvbik7XHJcbiAgICAgICAgICAgIHJlbmRlcmVkLnB1c2goPEVycm9yQm91bmRhcnk+PEFkZG9uQ2FyZCB7Li4ucHJvcHN9IHJlbG9hZD17IXNldHRpbmdzQ29va2llW1wiZm9yay1wcy01XCJdICYmIHRoaXMubWFuYWdlci5yZWxvYWQuYmluZCh0aGlzLm1hbmFnZXIpfSAvPjwvRXJyb3JCb3VuZGFyeT4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVuZGVyZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TmFtZShhZGRvbikge3JldHVybiB0aGlzLmdldFN0cmluZyhhZGRvbi5wbHVnaW4gPyBhZGRvbi5wbHVnaW4uZ2V0TmFtZSgpIDogYWRkb24ubmFtZSk7fVxyXG4gICAgZ2V0QXV0aG9yKGFkZG9uKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKGFkZG9uLnBsdWdpbiA/IGFkZG9uLnBsdWdpbi5nZXRBdXRob3IoKSA6IGFkZG9uLmF1dGhvcik7fVxyXG4gICAgZ2V0RGVzY3JpcHRpb24oYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldERlc2NyaXB0aW9uKCkgOiBhZGRvbi5kZXNjcmlwdGlvbik7fVxyXG4gICAgZ2V0VmVyc2lvbihhZGRvbikge3JldHVybiB0aGlzLmdldFN0cmluZyhhZGRvbi5wbHVnaW4gPyBhZGRvbi5wbHVnaW4uZ2V0VmVyc2lvbigpIDogYWRkb24udmVyc2lvbik7fVxyXG5cclxuICAgIHJlbmRlckNoZWNrVXBkYXRlcygpe1xyXG4gICAgICAgIGlmKCF3aW5kb3cuWmVyZXNQbHVnaW5MaWJyYXJ5KXJldHVybiBudWxsXHJcbiAgICAgICAgaWYoIXdpbmRvdy5QbHVnaW5VcGRhdGVzKXJldHVybiBudWxsXHJcbiAgICAgICAgaWYodHlwZW9mIHdpbmRvdy5QbHVnaW5VcGRhdGVzLmNoZWNrQWxsICE9PSBcImZ1bmN0aW9uXCIpcmV0dXJuIG51bGxcclxuICAgICAgICBpZighdGhpcy5pc1BsdWdpbnMpcmV0dXJuIG51bGxcclxuXHJcbiAgICAgICAgbGV0IHRvb2x0aXBJc1Nob3dpbmcgPSBmYWxzZVxyXG4gICAgICAgIGxldCB0b29sdGlwXHJcbiAgICAgICAgcmV0dXJuIDxUb29sdGlwV3JhcCB0ZXh0PVwiQ2hlY2tzIGZvciB1cGRhdGVzIG9mIHBsdWdpbnMgdGhhdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4gUmlnaHQtY2xpY2sgZm9yIGEgbGlzdC5cIj5cclxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9e3ttYXJnaW5MZWZ0OiBcIjEwcHhcIn19IG9uTW91c2VMZWF2ZT17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXBJc1Nob3dpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXAuaGlkZSgpXHJcbiAgICAgICAgICAgICAgICB9fT5cclxuICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiByZWY9XCJjaGVja1VwZGF0ZUJ1dHRvblwiIGNvbG9yPVwiYnJhbmRcIiBsb29rPVwiZmlsbGVkXCIgc2l6ZT1cIm1pblwiIGhvdmVyQ29sb3I9XCJkZWZhdWx0XCIgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KFwiUGx1Z2luIHVwZGF0ZSBjaGVjayBpbiBwcm9ncmVzcy5cIiwge3R5cGU6IFwiaW5mb1wifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LlBsdWdpblVwZGF0ZXMuY2hlY2tBbGwoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJQbHVnaW4gdXBkYXRlIGNoZWNrIGNvbXBsZXRlLlwiLCB7dHlwZTogXCJzdWNjZXNzXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGNoZWNraW5nIHVwZGF0ZS5cIiwge3R5cGU6IFwiZXJyb3JcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfWNhdGNoKGUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChcIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgY2hlY2tpbmcgdXBkYXRlLlwiLCB7dHlwZTogXCJlcnJvclwifSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9fSB3cmFwcGVyPXtmYWxzZX0gZGlzYWJsZWQ9e2ZhbHNlfSBvblJpZ2h0Q2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZighdGhpcy5yZWZzLmNoZWNrVXBkYXRlQnV0dG9uKXJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LlBsdWdpblVwZGF0ZXMgfHwgIXdpbmRvdy5QbHVnaW5VcGRhdGVzLnBsdWdpbnMpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICBpZih0b29sdGlwSXNTaG93aW5nKXJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXAgPSBuZXcgRW11bGF0ZWRUb29sdGlwKHRoaXMucmVmcy5jaGVja1VwZGF0ZUJ1dHRvbi5yZWZzLm9yaWdpbmFsLnJlZnMuYnV0dG9uLCBPYmplY3QudmFsdWVzKHdpbmRvdy5QbHVnaW5VcGRhdGVzLnBsdWdpbnMpLm1hcChwID0+IHAubmFtZSkuam9pbihcIiwgXCIpLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZGU6IFwiYm90dG9tXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaEV2ZW50czogZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXAuc2hvdygpXHJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcElzU2hvd2luZyA9IHRydWVcclxuICAgICAgICAgICAgICAgIH19PlxyXG4gICAgICAgICAgICAgICAgICAgIENoZWNrIGZvciBVcGRhdGVzXHJcbiAgICAgICAgICAgICAgICA8L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9Ub29sdGlwV3JhcD5cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3QgcmVmcmVzaEljb24gPSA8VG9vbHRpcCBjb2xvcj1cImJsYWNrXCIgcG9zaXRpb249XCJ0b3BcIiB0ZXh0PVwiUmVsb2FkIExpc3RcIj5cclxuICAgICAgICAgICAgeyhwcm9wcykgPT4gXHJcbiAgICAgICAgICAgIDxSZWxvYWRJY29uIHsuLi5wcm9wc30gY2xhc3NOYW1lPVwiYmQtaWNvbiBiZC1yZWxvYWQgYmQtcmVsb2FkLWhlYWRlclwiIHNpemU9XCIxOHB4XCIgb25DbGljaz17YXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQbHVnaW5zKSBwbHVnaW5Nb2R1bGUudXBkYXRlUGx1Z2luTGlzdCgpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGVtZU1vZHVsZS51cGRhdGVUaGVtZUxpc3QoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKTtcclxuICAgICAgICAgICAgfX0gLz5cclxuICAgICAgICAgICAgfTwvVG9vbHRpcD47XHJcbiAgICAgICAgY29uc3QgYWRkb25DYXJkcyA9IHRoaXMuZ2V0QWRkb25zKCk7XHJcblxyXG4gICAgICAgIHJldHVybiA8Q29udGVudENvbHVtbiB0aXRsZT17YCR7dGhpcy5wcm9wcy50eXBlLnRvVXBwZXJDYXNlKCl94oCUJHthZGRvbkNhcmRzLmxlbmd0aH1gfT5cclxuICAgICAgICAgICAgPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uIGtleT1cImZvbGRlci1idXR0b25cIiBjb2xvcj1cImJyYW5kXCIgXHJcbiAgICAgICAgICAgICAgICBsb29rPVwiZmlsbGVkXCIgc2l6ZT1cIm1pblwiIGhvdmVyQ29sb3I9XCJkZWZhdWx0XCIgb25DbGljaz17dGhpcy5vcGVuRm9sZGVyLmJpbmQodGhpcyl9IHdyYXBwZXI9e2ZhbHNlfVxyXG4gICAgICAgICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICBtYXJnaW5MZWZ0OiBcIjEwcHhcIlxyXG4gICAgICAgICAgICAgICAgfX0+XHJcbiAgICAgICAgICAgICAgICBPcGVuIHt0aGlzLmlzUGx1Z2lucyA/IFwiUGx1Z2luXCIgOiBcIlRoZW1lXCJ9IEZvbGRlclxyXG4gICAgICAgICAgICA8L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uPlxyXG4gICAgICAgICAgICB7dGhpcy5yZW5kZXJDaGVja1VwZGF0ZXMoKX1cclxuICAgICAgICAgICAgeyFzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSAmJiByZWZyZXNoSWNvbn1cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1jb250cm9scyBiZC1hZGRvbi1jb250cm9sc1wiPlxyXG4gICAgICAgICAgICAgICAgPFNlYXJjaCBvbkNoYW5nZT17dGhpcy5zZWFyY2h9IHBsYWNlaG9sZGVyPXtgU2VhcmNoICR7dGhpcy5wcm9wcy50eXBlfS4uLmB9IC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLWFkZG9uLWRyb3Bkb3duc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImJkLWxhYmVsXCI+U29ydCBieTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd24gb3B0aW9ucz17dGhpcy5zb3J0T3B0aW9uc30gb25DaGFuZ2U9e3RoaXMuc29ydH0gc3R5bGU9XCJ0cmFuc3BhcmVudFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiYmQtbGFiZWxcIj5PcmRlcjo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd24gb3B0aW9ucz17dGhpcy5kaXJlY3Rpb25zfSBvbkNoYW5nZT17dGhpcy5yZXZlcnNlfSBzdHlsZT1cInRyYW5zcGFyZW50XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZGEtc2xpc3QgYmQtYWRkb24tbGlzdFwiPnthZGRvbkNhcmRzfTwvZGl2PlxyXG4gICAgICAgIDwvQ29udGVudENvbHVtbj5cclxuICAgIH1cclxufVxyXG5cclxuY29uc3Qgb3JpZ2luYWxSZW5kZXIgPSBDYXJkTGlzdC5wcm90b3R5cGUucmVuZGVyO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQ2FyZExpc3QucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XHJcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcbiAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxyXG4gICAgZ2V0OiAoKSA9PiBvcmlnaW5hbFJlbmRlclxyXG59KTsiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQkRMb2dvIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJzdmdcIixcclxuICAgICAgICAgICAge2hlaWdodDogXCIxMDAlXCIsIHdpZHRoOiB0aGlzLnByb3BzLnNpemUgfHwgXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvIFwiICsgdGhpcy5wcm9wcy5jbGFzc05hbWUsIHN0eWxlOiB7ZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLCBjbGlwUnVsZTogXCJldmVub2RkXCIsIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIiwgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIn0sIHZpZXdCb3g6IFwiMCAwIDIwMDAgMjAwMFwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwibWV0YWRhdGFcIiwgbnVsbCksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRlZnNcIiwgbnVsbCxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZpbHRlclwiLCB7aWQ6IFwic2hhZG93MVwifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVEcm9wU2hhZG93XCIsIHtcImR4XCI6IFwiMjBcIiwgXCJkeVwiOiBcIjBcIiwgXCJzdGREZXZpYXRpb25cIjogXCIyMFwiLCBcImZsb29kLWNvbG9yXCI6IFwicmdiYSgwLDAsMCwwLjM1KVwifSkpLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmlsdGVyXCIsIHtpZDogXCJzaGFkb3cyXCJ9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmZURyb3BTaGFkb3dcIiwge1wiZHhcIjogXCIxNVwiLCBcImR5XCI6IFwiMFwiLCBcInN0ZERldmlhdGlvblwiOiBcIjIwXCIsIFwiZmxvb2QtY29sb3JcIjogXCJyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpXCJ9KSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmaWx0ZXJcIiwge2lkOiBcInNoYWRvdzNcIn0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZlRHJvcFNoYWRvd1wiLCB7XCJkeFwiOiBcIjEwXCIsIFwiZHlcIjogXCIwXCIsIFwic3RkRGV2aWF0aW9uXCI6IFwiMjBcIiwgXCJmbG9vZC1jb2xvclwiOiBcInJnYmEoMCwwLDAsMC4zNSlcIn0pKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIG51bGwsXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtzdHlsZToge2ZpbHRlcjogXCJ1cmwoI3NoYWRvdzMpXCJ9LCBkOiBcIk0xMTk1LjQ0KzEzNS40NDJMMTE5NS40NCsxMzUuNDQyTDk5Ny42KzEzNi40NDJDMTAyNC4yKzE0OS43NDIrMTE3MC4zNCsxNjMuNTQyKzExOTMuNjQrMTc5Ljc0MkMxMjY0LjM0KzIyOC44NDIrMTMxOS43NCsyOTEuMjQyKzEzNTguMjQrMzY1LjA0MkMxMzk4LjE0KzQ0MS42NDIrMTQxOS43NCs1MzAuNjQyKzE0MjIuNTQrNjI5LjY0MkwxNDIyLjU0KzYzMC44NDJMMTQyMi41NCs2MzIuMDQyQzE0MjIuNTQrNzczLjE0MisxNDIyLjU0KzEyMjguMTQrMTQyMi41NCsxMzY5LjE0TDE0MjIuNTQrMTM3MC4zNEwxNDIyLjU0KzEzNzEuNTRDMTQxOS44NCsxNDcwLjU0KzEzOTguMjQrMTU1OS41NCsxMzU4LjI0KzE2MzYuMTRDMTMxOS43NCsxNzA5Ljk0KzEyNjQuNDQrMTc3Mi4zNCsxMTkzLjY0KzE4MjEuNDRDMTE3MS4wNCsxODM3LjE0KzEwMjUuNysxODUwLjU0KzEwMDArMTg2My41NEwxMTkzLjU0KzE4NjQuNTRDMTUzOS43NCsxODY2LjQ0KzE4NjQuNTQrMTY5My4zNCsxODY0LjU0KzEyOTYuNjRMMTg2NC41NCs3MTYuOTQyQzE4NjYuNDQrMzEyLjQ0MisxNTQxLjY0KzEzNS40NDIrMTE5NS40NCsxMzUuNDQyWlwiLCBmaWxsOiBcIiMxNzE3MTdcIiwgb3BhY2l0eTogXCIxXCJ9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge3N0eWxlOiB7ZmlsdGVyOiBcInVybCgjc2hhZG93MilcIn0sIGQ6IFwiTTE2OTUuNTQrNjMxLjQ0MkMxNjg1Ljg0KzI3OC4wNDIrMTQwOS4zNCsxMzUuNDQyKzEwNTIuOTQrMTM1LjQ0MkwzNjEuNzQrMTM2LjQ0Mkw4MDMuNzQrNDkwLjQ0MkwxMDYwLjc0KzQ5MC40NDJDMTMzNS4yNCs0OTAuNDQyKzEzMzUuMjQrODM1LjM0MisxMDYwLjc0KzgzNS4zNDJMMTA2MC43NCsxMTY0Ljg0QzExNTAuMjIrMTE2NC44NCsxMjEwLjUzKzEyMDEuNDgrMTI0MS42OCsxMjUwLjg3QzEzMDYuMDcrMTM1MysxMjQ1Ljc2KzE1MDkuNjQrMTA2MC43NCsxNTA5LjY0TDM2MS43NCsxODYzLjU0TDEwNTIuOTQrMTg2NC41NEMxNDA5LjI0KzE4NjQuNTQrMTY4NS43NCsxNzIxLjk0KzE2OTUuNTQrMTM2OC41NEMxNjk1LjU0KzEyMDUuOTQrMTY1MS4wNCsxMDg0LjQ0KzE1NzIuNjQrOTk5Ljk0MkMxNjUxLjA0KzkxNS41NDIrMTY5NS41NCs3OTQuMDQyKzE2OTUuNTQrNjMxLjQ0MlpcIiwgZmlsbDogXCIjM0U4MkU1XCIsIG9wYWNpdHk6IFwiMVwifSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtzdHlsZToge2ZpbHRlcjogXCJ1cmwoI3NoYWRvdzEpXCJ9LCBkOiBcIk0xNDY5LjI1KzYzMS40NDJDMTQ1OS41NSsyNzguMDQyKzExODMuMDUrMTM1LjQ0Mis4MjYuNjUrMTM1LjQ0MkwxMzUuNDUrMTM1LjQ0MkwxMzUuNDUrMTAwNEMxMzUuNDUrMTAwNCsxMzUuNDI3KzEyNTUuMjErMzU1LjYyNisxMjU1LjIxQzU3NS44MjUrMTI1NS4yMSs1NzUuODQ4KzEwMDQrNTc1Ljg0OCsxMDA0TDU3Ny40NSs0OTAuNDQyTDgzNC40NSs0OTAuNDQyQzExMDguOTUrNDkwLjQ0MisxMTA4Ljk1KzgzNS4zNDIrODM0LjQ1KzgzNS4zNDJMNjY0LjY1KzgzNS4zNDJMNjY0LjY1KzExNjQuODRMODM0LjQ1KzExNjQuODRDOTIzLjkzMisxMTY0Ljg0Kzk4NC4yNDQrMTIwMS40OCsxMDE1LjM5KzEyNTAuODdDMTA3OS43OCsxMzUzKzEwMTkuNDcrMTUwOS42NCs4MzQuNDUrMTUwOS42NEwxMzUuNDUrMTUwOS42NEwxMzUuNDUrMTg2NC41NEw4MjYuNjUrMTg2NC41NEMxMTgyLjk1KzE4NjQuNTQrMTQ1OS40NSsxNzIxLjk0KzE0NjkuMjUrMTM2OC41NEMxNDY5LjI1KzEyMDUuOTQrMTQyNC43NSsxMDg0LjQ0KzEzNDYuMzUrOTk5Ljk0MkMxNDI0Ljc1KzkxNS41NDIrMTQ2OS4yNSs3OTQuMDQyKzE0NjkuMjUrNjMxLjQ0MlpcIiwgZmlsbDogXCIjRkZGRkZGXCIsIG9wYWNpdHk6IFwiMVwifSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0NoZWNrYm94IGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLm9uQ2xpY2sgPSB0aGlzLm9uQ2xpY2suYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBjaGVja2VkOiB0aGlzLnByb3BzLmNoZWNrZWQgfHwgZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImxpXCIsXHJcbiAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImNoZWNrYm94IFwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmNoZWNrYm94RWxlbWVudClbMF0uY2hlY2tib3gsIG9uQ2xpY2s6IHRoaXMub25DbGlja30sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImNoZWNrYm94LWlubmVyIFwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmNoZWNrYm94SW5uZXIpWzBdLmNoZWNrYm94SW5uZXJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtjbGFzc05hbWU6IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNoZWNrYm94RWxlbWVudClbMF0uY2hlY2tib3hFbGVtZW50LCBjaGVja2VkOiB0aGlzLnN0YXRlLmNoZWNrZWQsIG9uQ2hhbmdlOiAoKSA9PiB7fSwgdHlwZTogXCJjaGVja2JveFwifSksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsKVxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcInNwYW5cIixcclxuICAgICAgICAgICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMudGV4dFxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UodGhpcy5wcm9wcy5pZCwgIXRoaXMuc3RhdGUuY2hlY2tlZCk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGNoZWNrZWQ6ICF0aGlzLnN0YXRlLmNoZWNrZWRcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBBcnJvdyBmcm9tIFwiLi4vaWNvbnMvZG93bmFycm93XCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VsZWN0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7b3BlbjogZmFsc2UsIHZhbHVlOiB0aGlzLnByb3BzLnZhbHVlIHx8IHRoaXMucHJvcHMub3B0aW9uc1swXS52YWx1ZX07XHJcbiAgICAgICAgdGhpcy5kcm9wZG93biA9IFJlYWN0LmNyZWF0ZVJlZigpO1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zaG93TWVudSA9IHRoaXMuc2hvd01lbnUuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmhpZGVNZW51ID0gdGhpcy5oaWRlTWVudS5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dNZW51KGV2ZW50KSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtvcGVuOiB0cnVlfSwgKCkgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5oaWRlTWVudSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZU1lbnUoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7b3BlbjogZmFsc2V9LCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLmhpZGVNZW51KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3ZhbHVlfSk7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25DaGFuZ2UpIHRoaXMucHJvcHMub25DaGFuZ2UodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZWxlY3RlZCgpIHtyZXR1cm4gdGhpcy5wcm9wcy5vcHRpb25zLmZpbmQobyA9PiBvLnZhbHVlID09IHRoaXMuc3RhdGUudmFsdWUpO31cclxuXHJcbiAgICBnZXQgb3B0aW9ucygpIHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWQ7XHJcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LW9wdGlvbnNcIj5cclxuICAgICAgICAgICAge3RoaXMucHJvcHMub3B0aW9ucy5tYXAob3B0ID0+IFxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2BiZC1zZWxlY3Qtb3B0aW9uJHtzZWxlY3RlZC52YWx1ZSA9PSBvcHQudmFsdWUgPyBcIiBzZWxlY3RlZFwiIDogXCJcIn1gfSBvbkNsaWNrPXt0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcywgb3B0LnZhbHVlKX0+e29wdC5sYWJlbH08L2Rpdj5cclxuICAgICAgICAgICAgKX1cclxuICAgICAgICA8L2Rpdj47XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHN0eWxlID0gdGhpcy5wcm9wcy5zdHlsZSA9PSBcInRyYW5zcGFyZW50XCIgPyBcIiBiZC1zZWxlY3QtdHJhbnNwYXJlbnRcIiA6IFwiXCI7XHJcbiAgICAgICAgY29uc3QgaXNPcGVuID0gdGhpcy5zdGF0ZS5vcGVuID8gXCIgbWVudS1vcGVuXCIgOiBcIlwiO1xyXG4gICAgICAgIHJldHVybiAgPGRpdiBjbGFzc05hbWU9e2BiZC1zZWxlY3Qke3N0eWxlfSR7aXNPcGVufWB9IG9uQ2xpY2s9e3RoaXMuc2hvd01lbnV9IHJlZj17dGhpcy5kcm9wZG93bn0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3QtdmFsdWVcIj57dGhpcy5zZWxlY3RlZC5sYWJlbH08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8QXJyb3cgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LWFycm93XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5zdGF0ZS5vcGVuICYmIHRoaXMub3B0aW9uc31cclxuICAgICAgICAgICAgICAgIDwvZGl2PjtcclxuICAgIH1cclxufVxyXG5cclxuLy8gcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXdyYXBcIj5cclxuLy8gPGxhYmVsIGNsYXNzTmFtZT1cImJkLWxhYmVsXCI+e3RoaXMucHJvcHMubGFiZWx9PC9sYWJlbD5cclxuLy8gPGRpdiBjbGFzc05hbWU9e2BiZC1zZWxlY3Qke3N0eWxlfSR7aXNPcGVufWB9IG9uQ2xpY2s9e3RoaXMuc2hvd01lbnV9IHJlZj17dGhpcy5kcm9wZG93bn0+XHJcbi8vICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC1jb250cm9sc1wiPlxyXG4vLyAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXZhbHVlXCI+e3RoaXMuc2VsZWN0ZWQubGFiZWx9PC9kaXY+XHJcbi8vICAgICAgICAgPEFycm93IGNsYXNzTmFtZT1cImJkLXNlbGVjdC1hcnJvd1wiIC8+XHJcbi8vICAgICA8L2Rpdj5cclxuLy8gPC9kaXY+XHJcbi8vIHt0aGlzLnN0YXRlLm9wZW4gJiYgdGhpcy5vcHRpb25zfVxyXG4vLyA8L2Rpdj47IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFNlYXJjaEljb24gZnJvbSBcIi4uL2ljb25zL3NlYXJjaFwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VhcmNoIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBmb2N1c2VkOiBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBbXCJiZC1zZWFyY2gtd3JhcHBlclwiXVxyXG4gICAgICAgIGlmKHRoaXMuc3RhdGUuZm9jdXNlZCljbGFzc05hbWUucHVzaChcImZvY3VzZWRcIilcclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e2NsYXNzTmFtZS5qb2luKFwiIFwiKX0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG9uQ2hhbmdlPXt0aGlzLnByb3BzLm9uQ2hhbmdlfSBvbktleURvd249e3RoaXMucHJvcHMub25LZXlEb3dufSB0eXBlPVwidGV4dFwiIFxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJkLXNlYXJjaFwiIHBsYWNlaG9sZGVyPXt0aGlzLnByb3BzLnBsYWNlaG9sZGVyfSBtYXhMZW5ndGg9XCI1MFwiIFxyXG4gICAgICAgICAgICAgICAgICAgIG9uRm9jdXM9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Zm9jdXNlZDogdHJ1ZX0pXHJcbiAgICAgICAgICAgICAgICAgICAgfX0gb25CbHVyPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2ZvY3VzZWQ6IGZhbHNlfSlcclxuICAgICAgICAgICAgICAgICAgICB9fS8+XHJcbiAgICAgICAgICAgICAgICAgICAgPFNlYXJjaEljb24gLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PjtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTd2l0Y2ggZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtjaGVja2VkOiB0aGlzLnByb3BzLmNoZWNrZWR9O1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zd2l0Y2ggPSA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5Td2l0Y2ggb25DaGFuZ2U9e3RoaXMub25DaGFuZ2V9IHZhbHVlPXt0aGlzLnN0YXRlLmNoZWNrZWR9IC8+XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UodmFsdWUpIHtcclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UodmFsdWUpO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2NoZWNrZWQ6IHZhbHVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN3aXRjaFxyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19Db250ZW50Q29sdW1uIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IGRpc3BsYXlOYW1lKCkge3JldHVybiBcIkNvbnRlbnRDb2x1bW5cIjt9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIC8vbGV0IGNvbnRlbnRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250ZW50Q29sdW1uKVswXVxyXG4gICAgICAgIGxldCB0aXRsZSA9IHRoaXMucHJvcHMudGl0bGUgPyBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoMlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGl0bGUgaDIgbWFyZ2luLXJlc2V0IG1hcmdpbi1ib3R0b20tMjBcIn0sIHRoaXMucHJvcHMudGl0bGUpIDogbnVsbFxyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLmNoaWxkcmVuXHJcbiAgICAgICAgXVxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IGNvbnRlbnRNb2R1bGUuY29udGVudENvbHVtbiArIFwiIFwiK2NvbnRlbnRNb2R1bGUuY29udGVudENvbHVtbkRlZmF1bHQrXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwiLCBzdHlsZToge3BhZGRpbmc6IFwiNjBweCA0MHB4IDBweFwifX0sXHJcbiAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLmNoaWxkcmVuXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4uL21vZHVsZXMvc2V0dGluZ3NQYW5lbFwiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuLi9tb2R1bGVzL2RvbXRvb2xzXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiXHJcblxyXG5pbXBvcnQgU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi9zZXR0aW5nc1RpdGxlXCI7XHJcbmltcG9ydCBDaGVja2JveCBmcm9tIFwiLi9jaGVja2JveFwiO1xyXG5pbXBvcnQgVjJDX0Nzc0VkaXRvckRldGFjaGVkIGZyb20gXCIuL2Nzc0VkaXRvckRldGFjaGVkXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfQ3NzRWRpdG9yIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5wcm9wcy5saW5lcyA9IDA7XHJcbiAgICAgICAgc2VsZi5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgICAgICBzZWxmLmF0dGFjaCA9IHNlbGYuYXR0YWNoLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi5kZXRhY2hlZEVkaXRvciA9IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChWMkNfQ3NzRWRpdG9yRGV0YWNoZWQsIHthdHRhY2g6IHNlbGYuYXR0YWNofSk7XHJcbiAgICAgICAgc2VsZi5vbkNsaWNrID0gc2VsZi5vbkNsaWNrLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi51cGRhdGVDc3MgPSBzZWxmLnVwZGF0ZUNzcy5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYuc2F2ZUNzcyA9IHNlbGYuc2F2ZUNzcy5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYuZGV0YWNoID0gc2VsZi5kZXRhY2guYmluZChzZWxmKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgZGV0YWNoZWQ6IHRoaXMucHJvcHMuZGV0YWNoZWQgfHwgQkRWMi5lZGl0b3JEZXRhY2hlZFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgLy8gdGhpcy51cGRhdGVMaW5lQ291bnQoKTtcclxuICAgICAgICB0aGlzLmVkaXRvciA9IGFjZS5lZGl0KFwiYmQtY3VzdG9tY3NzLWVkaXRvclwiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRUaGVtZShcImFjZS90aGVtZS9kaXNjb3JkXCIpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNlc3Npb24uc2V0TW9kZShcImFjZS9tb2RlL2Nzc1wiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRTaG93UHJpbnRNYXJnaW4oZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNldEZvbnRTaXplKDE0KTtcclxuICAgICAgICB0aGlzLmVkaXRvci5vbihcImNoYW5nZVwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl0pIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy5zYXZlQ3NzKCk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ3NzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICAgICAgdGhpcy5lZGl0b3IuZGVzdHJveSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGlmIChwcmV2U3RhdGUuZGV0YWNoZWQgJiYgIXNlbGYuc3RhdGUuZGV0YWNoZWQpIHtcclxuICAgICAgICAgICAgQkRWMi5yZWFjdERvbS51bm1vdW50Q29tcG9uZW50QXROb2RlKHNlbGYuZGV0YWNoZWRSb290KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29kZU1pcnJvcigpIHtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgb3B0aW9ucygpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSxcclxuICAgICAgICAgICAgbW9kZTogXCJjc3NcIixcclxuICAgICAgICAgICAgaW5kZW50VW5pdDogNCxcclxuICAgICAgICAgICAgdGhlbWU6IFwibWF0ZXJpYWxcIixcclxuICAgICAgICAgICAgc2Nyb2xsYmFyU3R5bGU6IFwic2ltcGxlXCJcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjc3MoKSB7XHJcbiAgICAgICAgY29uc3QgX2Njc3MgPSBEYXRhU3RvcmUuZ2V0QkREYXRhKFwiYmRjdXN0b21jc3NcIik7XHJcbiAgICAgICAgbGV0IGNjc3MgPSBcIlwiO1xyXG4gICAgICAgIGlmIChfY2NzcyAmJiBfY2NzcyAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICBjY3NzID0gQnVmZmVyLmZyb20oX2Njc3MsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwidXRmOFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNjc3M7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlTGluZUNvdW50KCkge1xyXG4gICAgICAgIGNvbnN0IGxpbmVDb3VudCA9IHRoaXMucmVmcy5lZGl0b3IudmFsdWUuc3BsaXQoXCJcXG5cIikubGVuZ3RoO1xyXG4gICAgICAgIGlmIChsaW5lQ291bnQgPT0gdGhpcy5wcm9wcy5saW5lcykgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucmVmcy5saW5lcy50ZXh0Q29udGVudCA9IEFycmF5LmZyb20obmV3IEFycmF5KGxpbmVDb3VudCksIChfLCBpKSA9PiBpICsgMSkuam9pbihcIi5cXG5cIikgKyBcIi5cIjtcclxuICAgICAgICB0aGlzLnByb3BzLmxpbmVzID0gbGluZUNvdW50O1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuXHJcbiAgICAgICAgY29uc3Qge2RldGFjaGVkfSA9IHNlbGYuc3RhdGU7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgZGV0YWNoZWQgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtpZDogXCJlZGl0b3ItZGV0YWNoZWRcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwge3RleHQ6IFwiQ3VzdG9tIENTUyBFZGl0b3JcIn0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiaDNcIixcclxuICAgICAgICAgICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiRWRpdG9yIERldGFjaGVkXCJcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmF0dGFjaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICBcIkF0dGFjaFwiXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICFkZXRhY2hlZCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogXCJDdXN0b20gQ1NTIEVkaXRvclwifSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJlZGl0b3Itd3JhcHBlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBcImJkLWN1c3RvbWNzcy1lZGl0b3JcIiwgY2xhc3NOYW1lOiBcImVkaXRvclwiLCByZWY6IFwiZWRpdG9yXCJ9LCBzZWxmLmNzcylcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWF0dGFjaC1jb250cm9sc1wifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidWxcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJjaGVja2JveC1ncm91cFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENoZWNrYm94LCB7aWQ6IFwibGl2ZS11cGRhdGVcIiwgdGV4dDogXCJMaXZlIFVwZGF0ZVwiLCBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgY2hlY2tlZDogc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl19KVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWRldGFjaC1jb250cm9scy1idXR0b25cIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiM3B4IDAgMCAzcHhcIiwgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkICMzZjQxNDZcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJ1cGRhdGVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVwZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiMFwiLCBib3JkZXJMZWZ0OiBcIjFweCBzb2xpZCAjMmQyZDJkXCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjMmQyZDJkXCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwic2F2ZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU2F2ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiMCAzcHggM3B4IDBcIiwgYm9yZGVyTGVmdDogXCIxcHggc29saWQgIzNmNDE0NlwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcImRldGFjaFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiRGV0YWNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtmb250U2l6ZTogXCIxMHB4XCIsIG1hcmdpbkxlZnQ6IFwiNXB4XCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVW5zYXZlZCBjaGFuZ2VzIGFyZSBsb3N0IG9uIGRldGFjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImhlbHAtdGV4dFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiUHJlc3MgXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjb2RlXCIsIHtjbGFzc05hbWU6IFwiaW5saW5lXCJ9LCBcImN0cmxcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIitcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJpbmxpbmVcIn0sIFwiLFwiKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIHdpdGggdGhlIGVkaXRvciBmb2N1c2VkIHRvIGFjY2VzcyB0aGUgZWRpdG9yJ3Mgc2V0dGluZ3MuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKGFyZykge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHN3aXRjaCAoYXJnKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcclxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQ3NzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInNhdmVcIjpcclxuICAgICAgICAgICAgICAgIHNlbGYuc2F2ZUNzcygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJkZXRhY2hcIjpcclxuICAgICAgICAgICAgICAgIHNlbGYuZGV0YWNoKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UoaWQsIGNoZWNrZWQpIHtcclxuICAgICAgICBzd2l0Y2ggKGlkKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJsaXZlLXVwZGF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl0gPSBjaGVja2VkO1xyXG4gICAgICAgICAgICAgICAgU2V0dGluZ3Muc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlQ3NzKCkge1xyXG4gICAgICAgIERPTS5yZW1vdmVTdHlsZShcImN1c3RvbWNzc1wiKTtcclxuICAgICAgICBET00uYWRkU3R5bGUoXCJjdXN0b21jc3NcIiwgdGhpcy5lZGl0b3Iuc2Vzc2lvbi5nZXRWYWx1ZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBzYXZlQ3NzKCkge1xyXG4gICAgICAgIERhdGFTdG9yZS5zZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiLCBCdWZmZXIuZnJvbSh0aGlzLmVkaXRvci5zZXNzaW9uLmdldFZhbHVlKCksIFwidXRmLThcIikudG9TdHJpbmcoXCJiYXNlNjRcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIGRldGFjaCgpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgZGV0YWNoZWQ6IHRydWVcclxuICAgICAgICB9KTtcclxuICAgICAgICBjb25zdCBkcm9vdCA9IHNlbGYuZGV0YWNoZWRSb290O1xyXG4gICAgICAgIGlmICghZHJvb3QpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJGQUlMRUQgVE8gSU5KRUNUIFJPT1Q6IC5hcHBcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoc2VsZi5kZXRhY2hlZEVkaXRvciwgZHJvb3QpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkZXRhY2hlZFJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgX3Jvb3QgPSBET00ucXVlcnkoXCIjYmQtY3VzdG9tY3NzLWRldGFjaC1jb250YWluZXJcIik7XHJcbiAgICAgICAgaWYgKCFfcm9vdCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5qZWN0RGV0YWNoZWRSb290KCkpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXRhY2hlZFJvb3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfcm9vdDtcclxuICAgIH1cclxuXHJcbiAgICBpbmplY3REZXRhY2hlZFJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgYXBwID0gRE9NLnF1ZXJ5KFwiLmFwcCwgLlwiK1V0aWxzLnJlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLmFwcCAmJiBlLmxheWVycylbMF0uYXBwKSk7XHJcbiAgICAgICAgaWYgKCFhcHApIHJldHVybiBmYWxzZTtcclxuICAgICAgICBET00uaW5zZXJ0QWZ0ZXIoRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRhaW5lclwiPmApLCBhcHApO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaCgpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgZGV0YWNoZWQ6IGZhbHNlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IFNldHRpbmdzIGZyb20gXCIuLi9tb2R1bGVzL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi4vbW9kdWxlcy9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi4vbW9kdWxlcy9kb210b29sc1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4uL21vZHVsZXMvdXRpbHNcIlxyXG5cclxuaW1wb3J0IENoZWNrYm94IGZyb20gXCIuL2NoZWNrYm94XCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfQ3NzRWRpdG9yRGV0YWNoZWQgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLm9uQ2xpY2sgPSBzZWxmLm9uQ2xpY2suYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLnVwZGF0ZUNzcyA9IHNlbGYudXBkYXRlQ3NzLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi5zYXZlQ3NzID0gc2VsZi5zYXZlQ3NzLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi5vbkNoYW5nZSA9IHNlbGYub25DaGFuZ2UuYmluZChzZWxmKTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcclxuICAgICAgICBET00uYWRkQ2xhc3MoRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKSwgXCJiZC1kZXRhY2hlZC1lZGl0b3JcIik7XHJcbiAgICAgICAgQkRWMi5lZGl0b3JEZXRhY2hlZCA9IHRydWU7XHJcbiAgICAgICAgLy8gdGhpcy51cGRhdGVMaW5lQ291bnQoKTtcclxuICAgICAgICB0aGlzLmVkaXRvciA9IGFjZS5lZGl0KFwiYmQtY3VzdG9tY3NzLWVkaXRvci1kZXRhY2hlZFwiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRUaGVtZShcImFjZS90aGVtZS9kaXNjb3JkXCIpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNlc3Npb24uc2V0TW9kZShcImFjZS9tb2RlL2Nzc1wiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRTaG93UHJpbnRNYXJnaW4oZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNldEZvbnRTaXplKDE0KTtcclxuICAgICAgICB0aGlzLmVkaXRvci5vbihcImNoYW5nZVwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl0pIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy5zYXZlQ3NzKCk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ3NzKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xyXG4gICAgICAgIERPTS5yZW1vdmVDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkLWRldGFjaGVkLWVkaXRvclwiKTtcclxuICAgICAgICBCRFYyLmVkaXRvckRldGFjaGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5lZGl0b3IuZGVzdHJveSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUxpbmVDb3VudCgpIHtcclxuICAgICAgICBjb25zdCBsaW5lQ291bnQgPSB0aGlzLnJlZnMuZWRpdG9yLnZhbHVlLnNwbGl0KFwiXFxuXCIpLmxlbmd0aDtcclxuICAgICAgICBpZiAobGluZUNvdW50ID09IHRoaXMucHJvcHMubGluZXMpIHJldHVybjtcclxuICAgICAgICB0aGlzLnJlZnMubGluZXMudGV4dENvbnRlbnQgPSBBcnJheS5mcm9tKG5ldyBBcnJheShsaW5lQ291bnQpLCAoXywgaSkgPT4gaSArIDEpLmpvaW4oXCIuXFxuXCIpICsgXCIuXCI7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5saW5lcyA9IGxpbmVDb3VudDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgb3B0aW9ucygpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSxcclxuICAgICAgICAgICAgbW9kZTogXCJjc3NcIixcclxuICAgICAgICAgICAgaW5kZW50VW5pdDogNCxcclxuICAgICAgICAgICAgdGhlbWU6IFwibWF0ZXJpYWxcIixcclxuICAgICAgICAgICAgc2Nyb2xsYmFyU3R5bGU6IFwic2ltcGxlXCJcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjc3MoKSB7XHJcbiAgICAgICAgY29uc3QgX2Njc3MgPSBEYXRhU3RvcmUuZ2V0QkREYXRhKFwiYmRjdXN0b21jc3NcIik7XHJcbiAgICAgICAgbGV0IGNjc3MgPSBcIlwiO1xyXG4gICAgICAgIGlmIChfY2NzcyAmJiBfY2NzcyAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICBjY3NzID0gQnVmZmVyLmZyb20oX2Njc3MsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwidXRmOFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNjc3M7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgX3Jvb3QgPSBET00ucXVlcnkoXCIjYmQtY3VzdG9tY3NzLWRldGFjaC1jb250YWluZXJcIik7XHJcbiAgICAgICAgaWYgKCFfcm9vdCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5qZWN0Um9vdCgpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGV0YWNoZWRSb290O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX3Jvb3Q7XHJcbiAgICB9XHJcblxyXG4gICAgaW5qZWN0Um9vdCgpIHtcclxuICAgICAgICBjb25zdCBhcHAgPSBET00ucXVlcnkoXCIuYXBwLCAuXCIrVXRpbHMucmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuYXBwICYmIGUubGF5ZXJzKVswXS5hcHApKTtcclxuICAgICAgICBpZiAoIWFwcCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIERPTS5pbnNlcnRBZnRlcihET00uY3JlYXRlRWxlbWVudChgPGRpdiBpZD1cImJkLWN1c3RvbWNzcy1kZXRhY2gtY29udGFpbmVyXCI+YCksIGFwcCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiYmQtZGV0YWNoZWQtY3NzLWVkaXRvclwiLCBpZDogXCJiZC1jdXN0b21jc3MtZGV0YWNoLWVkaXRvclwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtpZDogXCJiZC1jdXN0b21jc3MtaW5uZXJwYW5lXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiZWRpdG9yLXdyYXBwZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogXCJiZC1jdXN0b21jc3MtZWRpdG9yLWRldGFjaGVkXCIsIGNsYXNzTmFtZTogXCJlZGl0b3JcIiwgcmVmOiBcImVkaXRvclwifSwgc2VsZi5jc3MpXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1hdHRhY2gtY29udHJvbHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInVsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3gtZ3JvdXBcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDaGVja2JveCwge2lkOiBcImxpdmUtdXBkYXRlXCIsIHRleHQ6IFwiTGl2ZSBVcGRhdGVcIiwgb25DaGFuZ2U6IHNlbGYub25DaGFuZ2UsIGNoZWNrZWQ6IHNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdfSlcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1kZXRhY2gtY29udHJvbHMtYnV0dG9uXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjNweCAwIDAgM3B4XCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjM2Y0MTQ2XCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwidXBkYXRlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVcGRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjBcIiwgYm9yZGVyTGVmdDogXCIxcHggc29saWQgIzJkMmQyZFwiLCBib3JkZXJSaWdodDogXCIxcHggc29saWQgIzJkMmQyZFwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcInNhdmVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNhdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjAgM3B4IDNweCAwXCIsIGJvcmRlckxlZnQ6IFwiMXB4IHNvbGlkICMzZjQxNDZcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJhdHRhY2hcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkF0dGFjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Zm9udFNpemU6IFwiMTBweFwiLCBtYXJnaW5MZWZ0OiBcIjVweFwifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVuc2F2ZWQgY2hhbmdlcyBhcmUgbG9zdCBvbiBhdHRhY2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZShpZCwgY2hlY2tlZCkge1xyXG4gICAgICAgIHN3aXRjaCAoaWQpIHtcclxuICAgICAgICAgICAgY2FzZSBcImxpdmUtdXBkYXRlXCI6XHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXSA9IGNoZWNrZWQ7XHJcbiAgICAgICAgICAgICAgICBTZXR0aW5ncy5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKGlkKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc3dpdGNoIChpZCkge1xyXG4gICAgICAgICAgICBjYXNlIFwiYXR0YWNoXCI6XHJcbiAgICAgICAgICAgICAgICBpZiAoRE9NLnF1ZXJ5KFwiI2VkaXRvci1kZXRhY2hlZFwiKSkgc2VsZi5wcm9wcy5hdHRhY2goKTtcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZShzZWxmLnJvb3QpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5yb290LnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcclxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQ3NzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInNhdmVcIjpcclxuICAgICAgICAgICAgICAgIHNlbGYuc2F2ZUNzcygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUNzcygpIHtcclxuICAgICAgICBET00ucmVtb3ZlU3R5bGUoXCJjdXN0b21jc3NcIik7XHJcbiAgICAgICAgRE9NLmFkZFN0eWxlKFwiY3VzdG9tY3NzXCIsIHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0VmFsdWUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZUNzcygpIHtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0QkREYXRhKFwiYmRjdXN0b21jc3NcIiwgQnVmZmVyLmZyb20odGhpcy5lZGl0b3Iuc2Vzc2lvbi5nZXRWYWx1ZSgpLCBcInV0Zi04XCIpLnRvU3RyaW5nKFwiYmFzZTY0XCIpKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCREVycm9yQm91bmRhcnkgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgdGhpcy5zdGF0ZSA9IHtoYXNFcnJvcjogZmFsc2V9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZENhdGNoKCkge1xyXG4gICAgICB0aGlzLnNldFN0YXRlKHtoYXNFcnJvcjogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgaWYgKHRoaXMuc3RhdGUuaGFzRXJyb3IpIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJyZWFjdC1lcnJvclwifSwgXCJDb21wb25lbnQgRXJyb3JcIik7ICBcclxuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47IFxyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBvcmlnaW5hbFJlbmRlciA9IEJERXJyb3JCb3VuZGFyeS5wcm90b3R5cGUucmVuZGVyO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQkRFcnJvckJvdW5kYXJ5LnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xyXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgc2V0OiBmdW5jdGlvbigpIHtjb25zb2xlLndhcm4oXCJBZGRvbiBwb2xpY3kgZm9yIHBsdWdpbnMgIzUgaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC93aWtpL0FkZG9uLVBvbGljaWVzI3BsdWdpbnNcIik7fSxcclxuICAgIGdldDogKCkgPT4gb3JpZ2luYWxSZW5kZXJcclxufSk7ICIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEZWxldGUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIyNHB4XCI7XHJcbiAgICAgICAgcmV0dXJuIDxzdmcgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSBmaWxsPVwidmFyKC0tdGV4dC1ub3JtYWwpXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19IG9uQ2xpY2s9e3RoaXMucHJvcHMub25DbGlja30+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGgyNHYyNEgwVjB6XCIvPjxwYXRoIGQ9XCJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyem0yLjQ2LTcuMTJsMS40MS0xLjQxTDEyIDEyLjU5bDIuMTItMi4xMiAxLjQxIDEuNDFMMTMuNDEgMTRsMi4xMiAyLjEyLTEuNDEgMS40MUwxMiAxNS40MWwtMi4xMiAyLjEyLTEuNDEtMS40MUwxMC41OSAxNGwtMi4xMy0yLjEyek0xNS41IDRsLTEtMWgtNWwtMSAxSDV2MmgxNFY0elwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwibm9uZVwiIGQ9XCJNMCAwaDI0djI0SDB6XCIvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvd25BcnJvdyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjE2cHhcIjtcclxuICAgICAgICByZXR1cm4gPHN2ZyBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IGZpbGw9XCJ2YXIoLS10ZXh0LW5vcm1hbClcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgc3R5bGU9e3t3aWR0aDogc2l6ZSwgaGVpZ2h0OiBzaXplfX0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjEyIDkuMjlMMTIgMTMuMTdsMy44OC0zLjg4Yy4zOS0uMzkgMS4wMi0uMzkgMS40MSAwIC4zOS4zOS4zOSAxLjAyIDAgMS40MWwtNC41OSA0LjU5Yy0uMzkuMzktMS4wMi4zOS0xLjQxIDBMNi43IDEwLjdjLS4zOS0uMzktLjM5LTEuMDIgMC0xLjQxLjM5LS4zOCAxLjAzLS4zOSAxLjQyIDB6XCIvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVkaXQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIyNHB4XCI7XHJcbiAgICAgICAgcmV0dXJuIDxzdmcgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cInZhcigtLXRleHQtbm9ybWFsKVwiIHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19IG9uQ2xpY2s9e3RoaXMucHJvcHMub25DbGlja30+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC0yLjM0LTIuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0xLjgzIDEuODMgMy43NSAzLjc1IDEuODMtMS44M3pcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiIC8+XHJcbiAgICAgICAgICAgICAgIDwvc3ZnPjtcclxuICAgIH1cclxufSIsInsvKiA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIndoaXRlXCIgd2lkdGg9XCIxOHB4XCIgaGVpZ2h0PVwiMThweFwiPlxyXG4gICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiLz5cclxuICAgIDxwYXRoIGQ9XCJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyelwiLz5cclxuPC9zdmc+ICovfVxyXG5cclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhpc3RvcnkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIxOHB4XCI7XHJcbiAgICAgICAgcmV0dXJuIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ2YXIoLS10ZXh0LW5vcm1hbClcIiBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19IG9uQ2xpY2s9e3RoaXMucHJvcHMub25DbGlja30+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCIgZmlsbD1cIm5vbmVcIi8+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyelwiLz5cclxuICAgICAgICA8L3N2Zz47XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VhcmNoIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IFwiMTZweFwiO1xyXG4gICAgICAgIHJldHVybiA8c3ZnIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gZmlsbD1cInZhcigtLXRleHQtbm9ybWFsKVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fT5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwibm9uZVwiIGQ9XCJNMCAwaDI0djI0SDBWMHpcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNS41IDE0aC0uNzlsLS4yOC0uMjdDMTUuNDEgMTIuNTkgMTYgMTEuMTEgMTYgOS41IDE2IDUuOTEgMTMuMDkgMyA5LjUgM1MzIDUuOTEgMyA5LjUgNS45MSAxNiA5LjUgMTZjMS42MSAwIDMuMDktLjU5IDQuMjMtMS41N2wuMjcuMjh2Ljc5bDUgNC45OUwyMC40OSAxOWwtNC45OS01em0tNiAwQzcuMDEgMTQgNSAxMS45OSA1IDkuNVM3LjAxIDUgOS41IDUgMTQgNy4wMSAxNCA5LjUgMTEuOTkgMTQgOS41IDE0elwiLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPjtcclxuICAgIH1cclxufSIsImxldCBtYXJnaW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Ub3A2MClbMF1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hcmdpblRvcCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBpZighbWFyZ2luTW9kdWxlKW1hcmdpbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpblRvcDYwKVswXVxyXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17bWFyZ2luTW9kdWxlLm1hcmdpblRvcDYwfT48L2Rpdj5cclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBWMkNfU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi9zZXR0aW5nc1RpdGxlXCI7XHJcbmltcG9ydCBWMkNfU2V0dGluZ3NHcm91cCBmcm9tIFwiLi9zZXR0aW5nc0dyb3VwXCI7XHJcbmltcG9ydCBkYXRhU3RvcmUgZnJvbSBcIi4uL21vZHVsZXMvZGF0YVN0b3JlXCI7XHJcbmltcG9ydCB7IGRlZmF1bHRSUEMsIHNldHRpbmdzUlBDIH0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDdXN0b21SaWNoUHJlc2VuY2UgZnJvbSBcIi4uL21vZHVsZXMvQ3VzdG9tUmljaFByZXNlbmNlXCJcclxuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSBcImVsZWN0cm9uXCI7XHJcbmltcG9ydCBNYXJnaW5Ub3AgZnJvbSBcIi4vbWFyZ2ludG9wXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxubGV0IFYyQ19QcmVzZW5jZVNldHRpbmdzTW9kdWxlc1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfUHJlc2VuY2VTZXR0aW5ncyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgZGF0YTogZGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInJwY1wiKSB8fCBkZWZhdWx0UlBDLFxyXG4gICAgICAgICAgICBhc3NldHM6IFtdXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnByZXZpZXcgPSBudWxsXHJcbiAgICAgICAgdGhpcy5pc2ZldGNoaW5nID0gZmFsc2VcclxuICAgICAgICBpZih0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQpe1xyXG4gICAgICAgICAgICB0aGlzLmZldGNoQXNzZXRzKClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYXNzZXRDb21wb25lbnRzID0gbmV3IFNldCgpXHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlV2hlbkZldGNoZWQoY29tcCl7XHJcbiAgICAgICAgdGhpcy5hc3NldENvbXBvbmVudHMuYWRkKGNvbXApXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7SW5wdXRUZXh0fSBzZXR0aW5nIFxyXG4gICAgICovXHJcbiAgICBvbkNoYW5nZShzZXR0aW5nLCB2YWx1ZSl7XHJcbiAgICAgICAgbGV0IGRlZmF1bHRTZXR0aW5nID0gUlBDUHJvcHMuZmluZChlID0+IGUuaWQgPT09IHNldHRpbmcucHJvcHMuaWQpXHJcblxyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBkYXRhOiBPYmplY3QuYXNzaWduKHNldHRpbmdzUlBDLCB0aGlzLnN0YXRlLmRhdGEsIHtcclxuICAgICAgICAgICAgICAgIFtkZWZhdWx0U2V0dGluZy5pZF06ICEhdmFsdWUgPyB2YWx1ZSA6IG51bGxcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIGFzc2V0czogdGhpcy5zdGF0ZS5hc3NldHNcclxuICAgICAgICB9KVxyXG4gICAgICAgIGlmKHNldHRpbmcucHJvcHMuaWQgPT09IFwiYXBwbGljYXRpb25faWRcIil7XHJcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hBc3NldHMoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInJwY1wiLCBzZXR0aW5nc1JQQyk7XHJcbiAgICAgICAgdGhpcy5wcmV2aWV3LmZvcmNlVXBkYXRlKClcclxuICAgICAgICBDdXN0b21SaWNoUHJlc2VuY2Uuc2V0KHNldHRpbmdzUlBDKVxyXG4gICAgfVxyXG5cclxuICAgIGZldGNoQXNzZXRzKCl7XHJcbiAgICAgICAgaWYodGhpcy5pc2ZldGNoaW5nID09PSB0cnVlKXtcclxuICAgICAgICAgICAgbGV0IGFwcCA9IHRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZFxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZCAhPT0gYXBwKXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2hBc3NldHMoKVxyXG4gICAgICAgICAgICB9LCA1MDAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIXRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZCl7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zdGF0ZS5kYXRhLFxyXG4gICAgICAgICAgICAgICAgYXNzZXRzOiBbXVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKClcclxuICAgICAgICAgICAgdGhpcy5hc3NldENvbXBvbmVudHMuZm9yRWFjaChlID0+IGUuZm9yY2VVcGRhdGUoKSlcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNmZXRjaGluZyA9IHRydWVcclxuICAgICAgICBDdXN0b21SaWNoUHJlc2VuY2UuZmV0Y2hBc3NldHModGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkKVxyXG4gICAgICAgIC50aGVuKGFzc2V0cyA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNmZXRjaGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zdGF0ZS5kYXRhLFxyXG4gICAgICAgICAgICAgICAgYXNzZXRzOiBPYmplY3Qua2V5cyhhc3NldHMpLm1hcChrID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYXNzZXQgPSBhc3NldHNba11cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogYXNzZXQuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGFzc2V0Lm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGFzc2V0LnR5cGVcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKClcclxuICAgICAgICAgICAgdGhpcy5hc3NldENvbXBvbmVudHMuZm9yRWFjaChlID0+IGUuZm9yY2VVcGRhdGUoKSlcclxuICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNmZXRjaGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zdGF0ZS5kYXRhLFxyXG4gICAgICAgICAgICAgICAgYXNzZXRzOiBbXVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKClcclxuICAgICAgICAgICAgdGhpcy5hc3NldENvbXBvbmVudHMuZm9yRWFjaChlID0+IGUuZm9yY2VVcGRhdGUoKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVByZXZpZXcoZGF0YSl7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGRhdGFcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIFYyQ19QcmVzZW5jZVNldHRpbmdzTW9kdWxlcyB8fCAoVjJDX1ByZXNlbmNlU2V0dGluZ3NNb2R1bGVzID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF1cclxuICAgICAgICBdKVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGVcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgPFYyQ19TZXR0aW5nc0dyb3VwIHRpdGxlPVwiUmljaFByZXNlbmNlIFNldHRpbmdzXCIgc2V0dGluZ3M9e3RoaXMucHJvcHMuc2V0dGluZ3N9IG9uQ2hhbmdlPXt0aGlzLnByb3BzLm9uQ2hhbmdlfS8+LFxyXG4gICAgICAgICAgICA8TWFyZ2luVG9wIC8+LFxyXG4gICAgICAgICAgICA8VjJDX1NldHRpbmdzVGl0bGUgdGV4dD1cIlJpY2hQcmVzZW5jZVwiLz4sXHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICB7LyoqIG9wdGlvbnMgKi99XHJcbiAgICAgICAgICAgICAgICB7dGhpcy5vcHRpb25zQ29tcG9uZW50c31cclxuICAgICAgICAgICAgPC9kaXY+LFxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPE1hcmdpblRvcCAvPlxyXG4gICAgICAgICAgICAgICAgPFYyQ19TZXR0aW5nc1RpdGxlIHRleHQ9XCJQcmV2aWV3XCIvPlxyXG4gICAgICAgICAgICAgICAgey8qKiBwcmV2aWV3ICovfVxyXG4gICAgICAgICAgICAgICAgPFJwY1ByZXZpZXcgc2V0dGluZ3M9e3RoaXN9Lz5cclxuICAgICAgICAgICAgPC9kaXY+LFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17bWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwfT48L2Rpdj4sXHJcbiAgICAgICAgICAgIDxidXR0b24gc3R5bGU9e3tvcGFjaXR5OiAwLjAxfX0gb25DbGljaz17d2luZG93Lm9oZ29kb2hmdWNrfT5cclxuICAgICAgICAgICAgICAgIE9oIGdvZCBPaCBmdWNrXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPixcclxuICAgICAgICAgICAgPGJ1dHRvbiBzdHlsZT17e29wYWNpdHk6IDAuMDF9fSBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZW1vdGUuc2hlbGwub3BlbkV4dGVybmFsKFwiaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1Ma1lhN3Jwc19nNFwiKVxyXG4gICAgICAgICAgICB9fT5cclxuICAgICAgICAgICAgICAgIFNlZSA/IEkgcHVsbGVkIGEgbGl0bGUgc25lYWt5IG9uIHlhXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgb3B0aW9uc0NvbXBvbmVudHMoKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9uc0NvbXBvbmVudHMgfHwgKHRoaXMuX29wdGlvbnNDb21wb25lbnRzID0gUlBDUHJvcHMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICBpZihlLnR5cGUgPT09IFwidGV4dFwiKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiA8SW5wdXRUZXh0IHNldHRpbmc9e2V9IG1hbmFnZXI9e3RoaXN9IGlkPXtlLmlkfS8+XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKGUudHlwZSA9PT0gXCJudW1iZXJcIil7XHJcbiAgICAgICAgICAgICAgICBsZXQgYXJyYXkgPSBbPElucHV0TnVtYmVyIHNldHRpbmc9e2V9IG1hbmFnZXI9e3RoaXN9IGlkPXtlLmlkfS8+XS8qXHJcbiAgICAgICAgICAgICAgICBpZihlLmlkID09PSBcInRpbWVzdGFtcHMuc3RhcnRcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyYXkudW5zaGlmdCg8RGlzY29yZEJ1dHRvbiB0aXRsZT1cIkNvcHkgQ3VycmVudCBUaW1lc3RhbXBcIiBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERpc2NvcmROYXRpdmUuY2xpcGJvYXJkLmNvcHkoRGF0ZS5ub3coKStcIlwiKVxyXG4gICAgICAgICAgICAgICAgICAgIH19IC8+KVxyXG4gICAgICAgICAgICAgICAgfSovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlcclxuICAgICAgICAgICAgfWVsc2UgaWYoZS50eXBlID09PSBcImNob2ljZVwiKXtcclxuICAgICAgICAgICAgICAgIGlmKFtcImFzc2V0cy5zbWFsbFwiLCBcImFzc2V0cy5sYXJnZVwiXS5pbmNsdWRlcyhlLmlkKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxJbnB1dENob2ljZSBzZXR0aW5nPXtlfSBtYW5hZ2VyPXt0aGlzfSBpZD17ZS5pZH0gY2hvaWNlcz17W3t2YWx1ZTogXCJub25lXCIsIGxhYmVsOiBcIk5vIGFzc2V0c1wifV0uY29uY2F0KHRoaXMuc3RhdGUuYXNzZXRzLm1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBcImFzc2V0LVwiK2UuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogZS5uYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KSl9Lz5cclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlVua25vd24gY2hvaWNlLlwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSlcclxuICAgIH1cclxufVxyXG5jb25zdCBSUENQcm9wcyA9IFtcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJBcHBsaWNhdGlvbiBJRFwiLFxyXG4gICAgICAgIGlkOiBcImFwcGxpY2F0aW9uX2lkXCIsXHJcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcclxuICAgICAgICBwbGFjZWhvbGRlcjogXCI3MTE0MTY5NTc3MTg3NTc0MThcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJOYW1lXCIsXHJcbiAgICAgICAgaWQ6IFwibmFtZVwiLFxyXG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxyXG4gICAgICAgIHBsYWNlaG9sZGVyOiBcIkxpZ2h0Y29yZFwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIkRldGFpbHNcIixcclxuICAgICAgICBpZDogXCJkZXRhaWxzXCIsXHJcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXHJcbiAgICAgICAgcGxhY2Vob2xkZXI6IFwiQnJvd3NpbmcgRGlzY29yZFwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIlN0YXRlXCIsXHJcbiAgICAgICAgaWQ6IFwic3RhdGVcIixcclxuICAgICAgICB0eXBlOiBcInRleHRcIixcclxuICAgICAgICBwbGFjZWhvbGRlcjogXCJMaWdodGNvcmQgQ2xpZW50XCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiVGltZXN0YW1wIFN0YXJ0XCIsXHJcbiAgICAgICAgaWQ6IFwidGltZXN0YW1wcy5zdGFydFwiLFxyXG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXHJcbiAgICAgICAgZ2V0IHBsYWNlaG9sZGVyKCl7XHJcbiAgICAgICAgICAgIHJldHVybiBEYXRlLm5vdygpXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJMYXJnZUFzc2V0XCIsXHJcbiAgICAgICAgaWQ6IFwiYXNzZXRzLmxhcmdlXCIsXHJcbiAgICAgICAgdHlwZTogXCJjaG9pY2VcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJTbWFsbEFzc2V0XCIsXHJcbiAgICAgICAgaWQ6IFwiYXNzZXRzLnNtYWxsXCIsXHJcbiAgICAgICAgdHlwZTogXCJjaG9pY2VcIlxyXG4gICAgfSxcclxuXVxyXG5cclxubGV0IGlucHV0VGV4dE1vZHVsZXNcclxuY2xhc3MgSW5wdXRUZXh0IGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XHJcbiAgICBnZXQgbW9kdWxlcygpe1xyXG4gICAgICAgIGlmKGlucHV0VGV4dE1vZHVsZXMgJiYgaW5wdXRUZXh0TW9kdWxlc1swXSlyZXR1cm4gaW5wdXRUZXh0TW9kdWxlc1xyXG4gICAgICAgIHJldHVybiBpbnB1dFRleHRNb2R1bGVzID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5pbnB1dE1pbmkpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMTYgJiYgZS5zaXplMjApWzBdLFxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpXHJcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBkYXRhOiB0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuZGF0YVtzZXR0aW5nLmlkXVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pbnB1dCA9IDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5UZXh0SW5wdXQgcGxhY2Vob2xkZXI9e3NldHRpbmcucGxhY2Vob2xkZXJ9IG5hbWU9e3NldHRpbmcuaWR9IHZhbHVlPXt0aGlzLnN0YXRlLmRhdGF9IG9uQ2hhbmdlPXsodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB2YWx1ZVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBpZighdGhpcy5sYXN0RWRpdGVkIHx8IHRoaXMubGFzdEVkaXRlZCA8IERhdGUubm93KCkgLSA1MDApe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxyXG4gICAgICAgICAgICB9ZWxzZSBpZighdGhpcy5pc1RpbWluZyl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHRoaXMuc3RhdGUuZGF0YSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdEVkaXRlZCA9IERhdGUubm93KClcclxuICAgICAgICAgICAgICAgIH0sIDUwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9fSB0eXBlPVwidGV4dFwiLz5cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG5cclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICByb3dNb2R1bGUsXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZSxcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlMixcclxuICAgICAgICAgICAgY29sb3JNb2R1bGUsXHJcbiAgICAgICAgICAgIHNpemVNb2R1bGUsXHJcbiAgICAgICAgICAgIGZsZXhNb2R1bGUsXHJcbiAgICAgICAgICAgIGlucHV0TW9kdWxlLFxyXG4gICAgICAgICAgICBzaXplTW9kdWxlMixcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcblxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e3Jvd01vZHVsZS5yb3crXCIgXCIrbWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwfT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3Jvd01vZHVsZS5pdGVtfSAke2ZsZXhNb2R1bGUuZmxleENoaWxkfWB9PlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cclxuICAgICAgICAgICAgICAgICAgICB7c2V0dGluZy50aXRsZX1cclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICB7dGhpcy5pbnB1dH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxEaXZpZGVyLz5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCBJbnB1dE51bWJlck1vZHVsZXNcclxuY2xhc3MgSW5wdXROdW1iZXIgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIElucHV0TnVtYmVyTW9kdWxlcyB8fCAoSW5wdXROdW1iZXJNb2R1bGVzID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5pbnB1dE1pbmkpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMTYgJiYgZS5zaXplMjApWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclRyYW5zcGFyZW50KVswXSxcclxuICAgICAgICBdKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IHRoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5kYXRhW3NldHRpbmcuaWRdXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmlucHV0ID0gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLlRleHRJbnB1dCBwbGFjZWhvbGRlcj17c2V0dGluZy5wbGFjZWhvbGRlcn0gbmFtZT17c2V0dGluZy5pZH0gdmFsdWU9e3RoaXMuc3RhdGUuZGF0YX0gdHlwZT1cIm51bWJlclwiIG9uQ2hhbmdlPXsodmFsdWUsIG5hbWUsIGlucHV0KSA9PiB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvW15cXGRdKy9nLCBcIlwiKVxyXG4gICAgICAgICAgICBpZih2YWx1ZSA9PSB0aGlzLnN0YXRlLmRhdGEpe1xyXG4gICAgICAgICAgICAgICAgaW5wdXQuc2V0VmFsdWUodmFsdWUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYoIXRoaXMubGFzdEVkaXRlZCB8fCB0aGlzLmxhc3RFZGl0ZWQgPCBEYXRlLm5vdygpIC0gNTAwKXtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB2YWx1ZSlcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdEVkaXRlZCA9IERhdGUubm93KClcclxuICAgICAgICAgICAgfWVsc2UgaWYoIXRoaXMuaXNUaW1pbmcpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB0aGlzLnN0YXRlLmRhdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXHJcbiAgICAgICAgICAgICAgICB9LCA1MDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgZGF0YTogdmFsdWVcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9fSB0eXBlPVwidGV4dFwiLz5cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG5cclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICByb3dNb2R1bGUsXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZSxcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlMixcclxuICAgICAgICAgICAgY29sb3JNb2R1bGUsXHJcbiAgICAgICAgICAgIHNpemVNb2R1bGUsXHJcbiAgICAgICAgICAgIGZsZXhNb2R1bGUsXHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG5cclxuXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17cm93TW9kdWxlLnJvdytcIiBcIittYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YH0+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgIHtzZXR0aW5nLnRpdGxlfVxyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIHt0aGlzLmlucHV0fVxyXG4gICAgICAgICAgICAgICAge3NldHRpbmcuaWQgPT09IFwidGltZXN0YW1wcy5zdGFydFwiID8gXHJcbiAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24gb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIERpc2NvcmROYXRpdmUuY2xpcGJvYXJkLmNvcHkoRGF0ZS5ub3coKStcIlwiKVxyXG4gICAgICAgICAgICAgICAgfX0gY29sb3I9XCJicmFuZFwiPkNvcHkgY3VycmVudCB0aW1lc3RhbXA8L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uPiA6IG51bGx9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8RGl2aWRlci8+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgSW5wdXRDaG9pY2VNb2R1bGVzXHJcbmNsYXNzIElucHV0Q2hvaWNlIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpXHJcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBkYXRhOiB0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuZGF0YVtzZXR0aW5nLmlkXSA/IFwiYXNzZXQtXCIrdGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmRhdGFbc2V0dGluZy5pZF0gOiBcIm5vbmVcIlxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIudXBkYXRlV2hlbkZldGNoZWQodGhpcylcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZShkYXRhKXtcclxuICAgICAgICBsZXQgdmFsdWUgPSBkYXRhLnZhbHVlXHJcblxyXG4gICAgICAgIGlmKCF0aGlzLmxhc3RFZGl0ZWQgfHwgdGhpcy5sYXN0RWRpdGVkIDwgRGF0ZS5ub3coKSAtIDUwMCl7XHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB2YWx1ZSA9PT0gXCJub25lXCIgPyBudWxsIDogdmFsdWUucmVwbGFjZShcImFzc2V0LVwiLCBcIlwiKSlcclxuICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxyXG4gICAgICAgIH1lbHNlIGlmKCF0aGlzLmlzVGltaW5nKXtcclxuICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHRoaXMuc3RhdGUuZGF0YSA9PT0gXCJub25lXCIgPyBudWxsIDogdGhpcy5zdGF0ZS5kYXRhLnJlcGxhY2UoXCJhc3NldC1cIiwgXCJcIikpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxyXG4gICAgICAgICAgICB9LCA1MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgZGF0YTogdmFsdWVcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBnZXQgbW9kdWxlcygpe1xyXG4gICAgICAgIHJldHVybiBJbnB1dENob2ljZU1vZHVsZXMgfHwgKElucHV0Q2hvaWNlTW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUucmVtb3ZlS2V5YmluZClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLl9ob3Jpem9udGFsKVswXVxyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcclxuXHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgcm93TW9kdWxlLFxyXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGUsXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZTIsXHJcbiAgICAgICAgICAgIGNvbG9yTW9kdWxlLFxyXG4gICAgICAgICAgICBzaXplTW9kdWxlLFxyXG4gICAgICAgICAgICBmbGV4TW9kdWxlXHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmFzc2V0cy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogXCJhc3NldC1cIitlLmlkLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGUubmFtZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgb3B0aW9ucy51bnNoaWZ0KHtcclxuICAgICAgICAgICAgdmFsdWU6IFwibm9uZVwiLFxyXG4gICAgICAgICAgICBsYWJlbDogXCJObyBhc3NldHNcIlxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e3Jvd01vZHVsZS5yb3crXCIgXCIrbWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwfT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3Jvd01vZHVsZS5pdGVtfSAke2ZsZXhNb2R1bGUuZmxleENoaWxkfWB9PlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cclxuICAgICAgICAgICAgICAgICAgICB7c2V0dGluZy50aXRsZX1cclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuRHJvcGRvd24gdmFsdWU9e3RoaXMuc3RhdGUuZGF0YX0gb3B0aW9ucz17b3B0aW9uc30gb25DaGFuZ2U9e3RoaXMub25DaGFuZ2UuYmluZCh0aGlzKX0gLz5cclxuICAgICAgICAgICAgICAgIHsvKjxTZWxlY3QgdmFsdWU9e3RoaXMuc3RhdGUuZGF0YX0gb25DaGFuZ2U9e3RoaXMub25DaGFuZ2UuYmluZCh0aGlzKX0gb3B0aW9ucz17b3B0aW9uc30vPiovfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPERpdmlkZXIvPlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxubGV0IERpdmlkZXJNb2R1bGVzID0gW11cclxuY2xhc3MgRGl2aWRlciBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gRGl2aWRlck1vZHVsZXMmJkRpdmlkZXJNb2R1bGVzWzBdID8gRGl2aWRlck1vZHVsZXMgOiAoRGl2aWRlck1vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRpdmlkZXIgJiYgT2JqZWN0LmtleXMoZSkubGVuZ3RoID09PSAxKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGl2aWRlckRlZmF1bHQpWzBdXHJcbiAgICAgICAgXSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBkaXZpZGVyLFxyXG4gICAgICAgICAgICBkaXZpZGVyRGVmYXVsdFxyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuXHJcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3M9e2Ake2RpdmlkZXIuZGl2aWRlcn0gJHtkaXZpZGVyRGVmYXVsdC5kaXZpZGVyRGVmYXVsdH1gfT48L2Rpdj5cclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgRGlzY29yZEJ1dHRvbiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgcm93TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUucmVtb3ZlS2V5YmluZClbMF1cclxuICAgICAgICBsZXQgbWFyZ2luTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdXHJcbiAgICAgICAgbGV0IGZsZXhNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF1cclxuXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17cm93TW9kdWxlLnJvdytcIiBcIittYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YH0+XHJcbiAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24gb25DbGljaz17dGhpcy5wcm9wcy5vbkNsaWNrfSBjb2xvcj1cImJyYW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3RoaXMucHJvcHMudGl0bGV9XHJcbiAgICAgICAgICAgICAgICA8L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIFJwY1ByZXZpZXcgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMgPSB7fSl7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgYWN0aXZlOiBcInByb2ZpbGVcIlxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnRhYnMgPSBbXVxyXG5cclxuICAgICAgICB0aGlzLnByb3BzLnNldHRpbmdzLnByZXZpZXcgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlVGFiKHRhYil7XHJcbiAgICAgICAgbGV0IGFuY2llbnRUYWIgPSB0aGlzLnN0YXRlLmFjdGl2ZVxyXG4gICAgICAgIGlmKGFuY2llbnRUYWIgPT09IHRhYi5wcm9wcy5pZClyZXR1cm5cclxuXHJcbiAgICAgICAgdGhpcy50YWJzLmZvckVhY2goZSA9PiB7XHJcbiAgICAgICAgICAgIGUuc2V0QWN0aXZlKGZhbHNlKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGFiLnNldEFjdGl2ZSh0cnVlKVxyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBhY3RpdmU6IHRhYi5wcm9wcy5pZFxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT1cImxjLXRhYldyYXBwZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsYy10YWJuYXZcIiBzdHlsZT17e2ZsZXg6IFwiMCAxIGF1dG9cIn19PlxyXG4gICAgICAgICAgICAgICAgPFRhYiBwcmV2aWV3PXt0aGlzfSB0aXRsZT1cIkZ1bGwgUHJvZmlsZVwiIGlkPVwicHJvZmlsZVwiLz5cclxuICAgICAgICAgICAgICAgIDxUYWIgcHJldmlldz17dGhpc30gdGl0bGU9XCJVc2VyIFBvcG91dFwiIGlkPVwicG9wb3V0XCIvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPFByZXNlbmNlRXJyb3JDYXRjaGVyIHByZXZpZXc9e3RoaXMucHJldmlld30gc3RhdGU9e3RoaXMuc3RhdGUucnBjfSBwcm9wcz17e3ByZXZpZXc6IHRoaXN9fSBrZXk9e3RoaXMuc3RhdGUuYWN0aXZlfSAvPlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH0gICBcclxuXHJcbiAgICBpc0FjdGl2ZSh0YWIpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmFjdGl2ZSA9PT0gdGFiXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByZXZpZXcoKXtcclxuICAgICAgICBpZih0aGlzLnN0YXRlLmFjdGl2ZSA9PT0gXCJwcm9maWxlXCIpcmV0dXJuIFByb2ZpbGVcclxuICAgICAgICByZXR1cm4gUG9wb3V0XHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIFRhYiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpXHJcblxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGFjdGl2ZTogcHJvcHMucHJldmlldy5pc0FjdGl2ZShwcm9wcy5pZClcclxuICAgICAgICB9XHJcbiAgICAgICAgcHJvcHMucHJldmlldy50YWJzLnB1c2godGhpcylcclxuICAgIH1cclxuXHJcbiAgICBzZXRBY3RpdmUoaXNBY3RpdmUpe1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBhY3RpdmU6ICEhaXNBY3RpdmVcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBjbGFzc05hbWUgPSBgbGMtbmF2SXRlbWBcclxuICAgICAgICBpZih0aGlzLnN0YXRlLmFjdGl2ZSl7XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZSArPSBgIGxjLW5hdkl0ZW1BY3RpdmVgXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZSArPSBgIGxjLW5hdkl0ZW1JbmFjdGl2ZWBcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17Y2xhc3NOYW1lfSBvbkNsaWNrPXsoKT0+e1xyXG4gICAgICAgICAgICB0aGlzLnByb3BzLnByZXZpZXcuY2hhbmdlVGFiKHRoaXMpXHJcbiAgICAgICAgfX0+XHJcbiAgICAgICAgICAgIHt0aGlzLnByb3BzLnRpdGxlfVxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxubGV0IGVtcHR5Q2xhc3Nlc1xyXG5jbGFzcyBQcmVzZW5jZUVycm9yQ2F0Y2hlciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb21wb25lbnREaWRDYXRjaChlcnIsIGVyckluZm8pe1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLCBlcnJJbmZvKVxyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBlcnJvcjogdHJ1ZVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBpZighdGhpcy5zdGF0ZSl7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgICAgICBlcnJvcjogZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZighdGhpcy5zdGF0ZS5lcnJvcil7XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpZXcgPSBuZXcgdGhpcy5wcm9wcy5wcmV2aWV3KHRoaXMucHJvcHMucHJvcHMpXHJcbiAgICAgICAgICAgICAgICBwcmV2aWV3LnNldFN0YXRlKHRoaXMucHJvcHMuc3RhdGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlldy5yZW5kZXIoKVxyXG4gICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5lcnJvciA9IHRydWVcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlcigpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgZW1wdHlDbGFzc2VzID0gZW1wdHlDbGFzc2VzIHx8IEJEVjIuV2VicGFja01vZHVsZXMuZmluZChlID0+IGUuZW1wdHlTdGF0ZUltYWdlICYmIGUuZW1wdHlTdGF0ZSlcclxuICAgICAgICAgICAgaWYoIWVtcHR5Q2xhc3Nlcyl7XHJcbiAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkLiBQbGVhc2UgY2hlY2sgdGhlIGNvbnNvbGUgZm9yIG1vcmUgaW5mb3JtYXRpb25zLlwiKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gPGRpdiBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgbWFyZ2luOiBcIjIwcHhcIlxyXG4gICAgICAgICAgICB9fT5cclxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tYmFja2dyb3VuZC1wcmltYXJ5KVwiLCBcclxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIjMwcHggMzBweFwiLCBcclxuICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiOHB4XCJcclxuICAgICAgICAgICAgICAgIH19IGNsYXNzTmFtZT17YGxjLXRhYi1ib3gtc2hhZG93ICR7ZW1wdHlDbGFzc2VzLmVtcHR5U3RhdGV9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2VtcHR5Q2xhc3Nlcy5lbXB0eVN0YXRlSW1hZ2V9IHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpblRvcDogXCIyMHB4XCJcclxuICAgICAgICAgICAgICAgICAgICB9fT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2VtcHR5Q2xhc3Nlcy5lbXB0eVN0YXRlSGVhZGVyfT5BbiBlcnJvciBvY2N1cmVkPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPXtlbXB0eUNsYXNzZXMuZW1wdHlTdGF0ZVN1YnRleHR9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBQbGVhc2UgY2hlY2sgdGhlIGNvbnNvbGUgZm9yIG1vcmUgaW5mb3JtYXRpb25zLiBKb2luIG91ciDCrVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzc05hbWU9e2Ake0JEVjIuYW5jaG9yQ2xhc3Nlcy5hbmNob3J9ICR7QkRWMi5hbmNob3JDbGFzc2VzLmFuY2hvclVuZGVybGluZU9uSG92ZXJ9YH0gcm9sZT1cImJ1dHRvblwiIHRhYmluZGV4PXswfSBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLmpvaW5MQygpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCBzZXJ2ZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICDCrSBmb3IgaGVscC5cclxuICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgcG9wb3V0TW9kdWxlc1xyXG5sZXQgVXNlclBvcG91dENvbXBvbmVudFxyXG5sZXQgUG9wb3V0UHJvcHNcclxuY2xhc3MgUG9wb3V0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIHBvcG91dE1vZHVsZXMgfHwgKHBvcG91dE1vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJEVjIuV2VicGFja01vZHVsZXMuZmluZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUgPT09IFwiVXNlclBvcG91dFwiKSxcclxuICAgICAgICAgICAgQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilcclxuICAgICAgICBdKVxyXG4gICAgfVxyXG5cclxuICAgIGdldENvbXBvbmVudCgpe1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIFVzZXJQb3BvdXQsXHJcbiAgICAgICAgICAgIHVzZXJNb2R1bGVcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcblxyXG4gICAgICAgIGNvbnN0IHVzZXIgPSB1c2VyTW9kdWxlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KCgpID0+IHtcclxuICAgICAgICAgICAgbGV0IHJlbmRlcjEgPSBVc2VyUG9wb3V0LmRlZmF1bHQoe1xyXG4gICAgICAgICAgICAgICAgdXNlcklkOiB1c2VyLmlkLCBcclxuICAgICAgICAgICAgICAgIGd1aWxkSWQ6IG51bGwsIFxyXG4gICAgICAgICAgICAgICAgY2hhbm5lbElkOiBudWxsLCBcclxuICAgICAgICAgICAgICAgIGRpc2FibGVVc2VyUHJvZmlsZUxpbms6IHRydWVcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgVXNlclBvcG91dENvbXBvbmVudCA9IHJlbmRlcjEudHlwZVxyXG4gICAgICAgICAgICBQb3BvdXRQcm9wcyA9IHJlbmRlcjEucHJvcHNcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyKClcclxuICAgICAgICB9LCBudWxsKVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGlmKCFVc2VyUG9wb3V0Q29tcG9uZW50KXJldHVybiB0aGlzLmdldENvbXBvbmVudCgpXHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgX1VzZXJQb3BvdXQsXHJcbiAgICAgICAgICAgIHVzZXJNb2R1bGVcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcblxyXG4gICAgICAgIGNvbnN0IHVzZXIgPSB1c2VyTW9kdWxlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxyXG5cclxuICAgICAgICBsZXQgZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRSUEMsIHRoaXMucHJvcHMucHJldmlldy5wcm9wcy5zZXR0aW5ncy5zdGF0ZS5kYXRhKVxyXG4gICAgICAgIGNvbnN0IGFjdGl2aXR5ID0gKGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIGlmKCF0aGlzLmdhbWUpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgbGV0IGdhbWUgPSB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLmdhbWUubmFtZSB8fCBkZWZhdWx0UlBDLm5hbWUsXHJcbiAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbl9pZDogdGhpcy5nYW1lLmFwcGxpY2F0aW9uX2lkIHx8IGRlZmF1bHRSUEMuYXBwbGljYXRpb25faWQsXHJcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiB0aGlzLmdhbWUuZGV0YWlscyB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICBzdGF0ZTogdGhpcy5nYW1lLnN0YXRlIHx8IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcHM6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl0gPyB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl1cclxuICAgICAgICAgICAgICAgIH0gOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICBhc3NldHM6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSA/IHtcclxuICAgICAgICAgICAgICAgICAgICBsYXJnZV9pbWFnZTogdGhpcy5nYW1lW1wiYXNzZXRzLmxhcmdlXCJdLFxyXG4gICAgICAgICAgICAgICAgICAgIHNtYWxsX2ltYWdlOiB0aGlzLmdhbWVbXCJhc3NldHMuc21hbGxcIl0gfHwgdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICB9IDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogMFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBnYW1lXHJcbiAgICAgICAgfSkuY2FsbCh7XHJcbiAgICAgICAgICAgIGdhbWU6IGRhdGFcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICBjb25zdCBwb3BvdXQgPSBuZXcgVXNlclBvcG91dENvbXBvbmVudChPYmplY3QuYXNzaWduKHt9LCBQb3BvdXRQcm9wcywge1xyXG4gICAgICAgICAgICBhY3Rpdml0eTogYWN0aXZpdHksXHJcbiAgICAgICAgICAgIHVzZXJJZDogdXNlci5pZFxyXG4gICAgICAgIH0pKS5yZW5kZXIoKS5wcm9wcy5jaGlsZHJlbiAvLyBieXBhc3MgdHJhY2tpbmdcclxuXHJcbiAgICAgICAgLy8gcmVtb3ZlIHRoZSBzdG9wIHByb3BhZ2F0aW9uIHNoaXQuXHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gPGRpdiB7Li4ud2luZG93LkxpZ2h0Y29yZC5BcGkuXy5leGNsdWRlUHJvcGVydGllcyhwb3BvdXQucHJvcHMsIFtcIm9uQ2xpY2tcIiwgXCJvbkNvbnRleHRNZW51XCJdKX0gLz5cclxuXHJcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwibGMtdXNlclBvcG91dCBsYy10YWItYm94LXNoYWRvd1wiPlxyXG4gICAgICAgICAgICB7Y29udGFpbmVyfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgcHJvZmlsZU1vZHVsZXNcclxubGV0IFVzZXJQcm9maWxlQ29tcG9uZW50XHJcbmxldCBQcm9maWxlUHJvcHNcclxubGV0IGNvbm5lY3RlZFByb2ZpbGVTdG9yZVxyXG5jbGFzcyBQcm9maWxlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIHByb2ZpbGVNb2R1bGVzIHx8IChwcm9maWxlTW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJVc2VyUHJvZmlsZVwiKSxcclxuICAgICAgICAgICAgQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilcclxuICAgICAgICBdKVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIFVzZXJQcm9maWxlLFxyXG4gICAgICAgICAgICB1c2VyTW9kdWxlXHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG5cclxuICAgICAgICBjb25zdCB1c2VyID0gdXNlck1vZHVsZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKClcclxuICAgICAgICBpZighVXNlclByb2ZpbGVDb21wb25lbnQpe1xyXG4gICAgICAgICAgICBjb25zdCByZW5kZXIxID0gbmV3IFVzZXJQcm9maWxlLmRlZmF1bHQoe1xyXG4gICAgICAgICAgICAgICAgdXNlcjogdXNlclxyXG4gICAgICAgICAgICB9KS5yZW5kZXIoKVxyXG4gICAgICAgICAgICBjb25uZWN0ZWRQcm9maWxlU3RvcmUgPSByZW5kZXIxLnR5cGVcclxuICAgICAgICAgICAgY29uc3QgcmVuZGVyMiA9IG5ldyByZW5kZXIxLnR5cGUocmVuZGVyMS5wcm9wcykucmVuZGVyKClcclxuICAgICAgICAgICAgY29uc3QgcmVuZGVyMyA9IHJlbmRlcjIudHlwZS5yZW5kZXIocmVuZGVyMi5wcm9wcywgbnVsbClcclxuICAgICAgICAgICAgY29uc3QgcmVuZGVyNCA9IG5ldyByZW5kZXIzLnR5cGUocmVuZGVyMy5wcm9wcykucmVuZGVyKClcclxuICAgICAgICAgICAgVXNlclByb2ZpbGVDb21wb25lbnQgPSByZW5kZXI0LnR5cGVcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIVVzZXJQcm9maWxlQ29tcG9uZW50KXRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCB0aGUgVXNlclByb2ZpbGVDb21wb25lbnQgY29tcG9uZW50LmApXHJcblxyXG4gICAgICAgIGxldCBkYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFJQQywgdGhpcy5wcm9wcy5wcmV2aWV3LnByb3BzLnNldHRpbmdzLnN0YXRlLmRhdGEpXHJcbiAgICAgICAgY29uc3QgYWN0aXZpdHkgPSAoZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgaWYoIXRoaXMuZ2FtZSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICBsZXQgZ2FtZSA9IHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuZ2FtZS5uYW1lIHx8IGRlZmF1bHRSUEMubmFtZSxcclxuICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uX2lkOiB0aGlzLmdhbWUuYXBwbGljYXRpb25faWQgfHwgZGVmYXVsdFJQQy5hcHBsaWNhdGlvbl9pZCxcclxuICAgICAgICAgICAgICAgIGRldGFpbHM6IHRoaXMuZ2FtZS5kZXRhaWxzIHx8IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHN0YXRlOiB0aGlzLmdhbWUuc3RhdGUgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wczogdGhpcy5nYW1lW1widGltZXN0YW1wcy5zdGFydFwiXSA/IHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5nYW1lW1widGltZXN0YW1wcy5zdGFydFwiXVxyXG4gICAgICAgICAgICAgICAgfSA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIGFzc2V0czogdGhpcy5nYW1lW1wiYXNzZXRzLmxhcmdlXCJdID8ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxhcmdlX2ltYWdlOiB0aGlzLmdhbWVbXCJhc3NldHMubGFyZ2VcIl0sXHJcbiAgICAgICAgICAgICAgICAgICAgc21hbGxfaW1hZ2U6IHRoaXMuZ2FtZVtcImFzc2V0cy5zbWFsbFwiXSB8fCB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgIH0gOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiAwXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGdhbWVcclxuICAgICAgICB9KS5jYWxsKHtcclxuICAgICAgICAgICAgZ2FtZTogZGF0YVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIFByb2ZpbGVQcm9wcyA9IG5ldyBjb25uZWN0ZWRQcm9maWxlU3RvcmUoe1xyXG4gICAgICAgICAgICB1c2VyOiB1c2VyLFxyXG4gICAgICAgICAgICBjbG9zZTogKCkgPT4ge31cclxuICAgICAgICB9KS5yZW5kZXIoKS5wcm9wc1xyXG4gICAgICAgIGNvbnN0IHByb2ZpbGUgPSBuZXcgVXNlclByb2ZpbGVDb21wb25lbnQoT2JqZWN0LmFzc2lnbih7fSwgUHJvZmlsZVByb3BzLCB7XHJcbiAgICAgICAgICAgIGFjdGl2aXR5OiBhY3Rpdml0eVxyXG4gICAgICAgIH0pKS5yZW5kZXIoKS5wcm9wcy5jaGlsZHJlbiAvLyBieXBhc3MgdHJhY2tpbmdcclxuXHJcbiAgICAgICAgcHJvZmlsZS5wcm9wcy5zdHlsZSA9IHtcclxuICAgICAgICAgICAgd2lkdGg6IFwiYXV0b1wiXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJsYy10YWIgbGMtdGFiLWJveC1zaGFkb3dcIj5cclxuICAgICAgICAgICAge3Byb2ZpbGV9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuaW1wb3J0IFRvb2xzIGZyb20gXCIuLi90b29sc1wiO1xyXG5pbXBvcnQgU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi4vc2V0dGluZ3NUaXRsZVwiO1xyXG5pbXBvcnQgVGFiQmFyU2VwYXJhdG9yIGZyb20gXCIuLi90YWJCYXJTZXBhcmF0b3JcIjtcclxuaW1wb3J0IFRhYkJhckhlYWRlciBmcm9tIFwiLi4vdGFiQmFySGVhZGVyXCI7XHJcbmltcG9ydCBUYWJCYXJJdGVtIGZyb20gXCIuLi90YWJCYXJJdGVtXCI7XHJcblxyXG5pbXBvcnQgU2VydmVyQ2FyZCBmcm9tIFwiLi9zZXJ2ZXJDYXJkXCI7XHJcbmltcG9ydCBTaWRlYmFyVmlldyBmcm9tIFwiLi9zaWRlYmFyVmlld1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1B1YmxpY1NlcnZlcnMgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuY2xvc2UgPSB0aGlzLmNsb3NlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VDYXRlZ29yeSA9IHRoaXMuY2hhbmdlQ2F0ZWdvcnkuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNlYXJjaCA9IHRoaXMuc2VhcmNoLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hLZXlEb3duID0gdGhpcy5zZWFyY2hLZXlEb3duLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5jaGVja0Nvbm5lY3Rpb24gPSB0aGlzLmNoZWNrQ29ubmVjdGlvbi5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuam9pbiA9IHRoaXMuam9pbi5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuY29ubmVjdCA9IHRoaXMuY29ubmVjdC5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLkd1aWxkU3RvcmUgPSBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZ2V0R3VpbGRzXCJdKTtcclxuICAgICAgICB0aGlzLkF2YXRhckRlZmF1bHRzID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldFVzZXJBdmF0YXJVUkxcIiwgXCJERUZBVUxUX0FWQVRBUlNcIl0pO1xyXG4gICAgICAgIHRoaXMuSW52aXRlQWN0aW9ucyA9IEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJhY2NlcHRJbnZpdGVcIl0pO1xyXG4gICAgICAgIHRoaXMuU29ydGVkR3VpbGRTdG9yZSA9IEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJnZXRTb3J0ZWRHdWlsZHNcIl0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tDb25uZWN0aW9uKCk7XHJcbiAgICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBzZWxlY3RlZENhdGVnb3J5OiAtMSxcclxuICAgICAgICAgICAgdGl0bGU6IFwiTG9hZGluZy4uLlwiLFxyXG4gICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICBzZXJ2ZXJzOiBbXSxcclxuICAgICAgICAgICAgbmV4dDogbnVsbCxcclxuICAgICAgICAgICAgY29ubmVjdGlvbjoge1xyXG4gICAgICAgICAgICAgICAgc3RhdGU6IDAsXHJcbiAgICAgICAgICAgICAgICB1c2VyOiBudWxsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMuY2xvc2UoKVxyXG4gICAgfVxyXG5cclxuICAgIHNlYXJjaChxdWVyeSwgY2xlYXIpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBmZXRjaChgJHtzZWxmLmVuZFBvaW50fSR7cXVlcnl9JHtxdWVyeSA/IFwiJnNjaGVtYT1uZXdcIiA6IFwiP3NjaGVtYT1uZXdcIn1gLCB7XHJcbiAgICAgICAgICAgIG1ldGhvZDogXCJnZXRcIlxyXG4gICAgICAgIH0pLnRoZW4oYXN5bmMgcmVzID0+IHtcclxuICAgICAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXRocm93IGF3YWl0IHJlcy50ZXh0KClcclxuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBsZXQgc2VydmVycyA9IGRhdGEucmVzdWx0cy5yZWR1Y2UoKGFyciwgc2VydmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzZXJ2ZXIuam9pbmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBhcnIucHVzaChzZXJ2ZXIpO1xyXG4gICAgICAgICAgICAgICAgLy8gYXJyLnB1c2goPFNlcnZlckNhcmQgc2VydmVyPXtzZXJ2ZXJ9IGpvaW49e3NlbGYuam9pbn0vPik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgICAgICAgICB9LCBbXSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWNsZWFyKSB7XHJcbiAgICAgICAgICAgICAgICBzZXJ2ZXJzID0gc2VsZi5zdGF0ZS5zZXJ2ZXJzLmNvbmNhdChzZXJ2ZXJzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vc2VydmVycy51bnNoaWZ0KHNlbGYuYmRTZXJ2ZXIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgZW5kID0gZGF0YS5zaXplICsgZGF0YS5mcm9tO1xyXG4gICAgICAgICAgICBkYXRhLm5leHQgPSBgP2Zyb209JHtlbmR9YDtcclxuICAgICAgICAgICAgaWYgKHNlbGYuc3RhdGUudGVybSkgZGF0YS5uZXh0ICs9IGAmdGVybT0ke3NlbGYuc3RhdGUudGVybX1gO1xyXG4gICAgICAgICAgICBpZiAoc2VsZi5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5KSBkYXRhLm5leHQgKz0gYCZjYXRlZ29yeT0ke3NlbGYuY2F0ZWdvcnlCdXR0b25zW3NlbGYuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeV19YDtcclxuICAgICAgICAgICAgaWYgKGVuZCA+PSBkYXRhLnRvdGFsKSB7XHJcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLnRvdGFsO1xyXG4gICAgICAgICAgICAgICAgZGF0YS5uZXh0ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHRpdGxlID0gYFNob3dpbmcgMS0ke2VuZH0gb2YgJHtkYXRhLnRvdGFsfSByZXN1bHRzIGluICR7c2VsZi5jYXRlZ29yeUJ1dHRvbnNbc2VsZi5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5XX1gO1xyXG4gICAgICAgICAgICBpZiAoc2VsZi5zdGF0ZS50ZXJtKSB0aXRsZSArPSBgIGZvciAke3NlbGYuc3RhdGUudGVybX1gO1xyXG5cclxuICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcclxuICAgICAgICAgICAgICAgIHNlcnZlcnM6IHNlcnZlcnMsXHJcbiAgICAgICAgICAgICAgICBuZXh0OiBkYXRhLm5leHRcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2xlYXIpIHtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coc2VsZik7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnJlZnMuc2J2LnJlZnMuY29udGVudFNjcm9sbGVyLnNjcm9sbFRvcCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBcIkZhaWxlZCB0byBsb2FkIHNlcnZlcnMuIENoZWNrIGNvbnNvbGUgZm9yIGRldGFpbHNcIlxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGpvaW4oc2VydmVyQ2FyZCkge1xyXG4gICAgICAgIGlmIChzZXJ2ZXJDYXJkLnByb3BzLnBpbm5lZCkgcmV0dXJuIHRoaXMuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGUoc2VydmVyQ2FyZC5wcm9wcy5pbnZpdGVfY29kZSk7XHJcblxyXG4gICAgICAgIGF3YWl0IGZldGNoKGAke3RoaXMuam9pbkVuZFBvaW50fS8ke3NlcnZlckNhcmQucHJvcHMuc2VydmVyLmlkZW50aWZpZXJ9YCx7XHJcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcclxuICAgICAgICAgICAgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiLFxyXG4gICAgICAgICAgICBtb2RlOiBcImNvcnNcIixcclxuICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHNlcnZlckNhcmQuc2V0U3RhdGUoe2pvaW5lZDogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbm5lY3QoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHNlbGYud2luZG93T3B0aW9ucztcclxuICAgICAgICBvcHRpb25zLnggPSBNYXRoLnJvdW5kKHdpbmRvdy5zY3JlZW5YICsgd2luZG93LmlubmVyV2lkdGggLyAyIC0gb3B0aW9ucy53aWR0aCAvIDIpO1xyXG4gICAgICAgIG9wdGlvbnMueSA9IE1hdGgucm91bmQod2luZG93LnNjcmVlblkgKyB3aW5kb3cuaW5uZXJIZWlnaHQgLyAyIC0gb3B0aW9ucy5oZWlnaHQgLyAyKTtcclxuXHJcbiAgICAgICAgc2VsZi5qb2luV2luZG93ID0gbmV3ICh3aW5kb3cucmVxdWlyZShcImVsZWN0cm9uXCIpLnJlbW90ZS5Ccm93c2VyV2luZG93KShvcHRpb25zKTtcclxuICAgICAgICBjb25zdCB1cmwgPSBcImh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vY29ubmVjdD9zY29wZXM9Z3VpbGRzLmpvaW4mcHJldmlvdXNVcmw9aHR0cHM6Ly9hdXRoLmRpc2NvcmRzZXJ2ZXJzLmNvbS9pbmZvXCI7XHJcbiAgICAgICAgc2VsZi5qb2luV2luZG93LndlYkNvbnRlbnRzLm9uKFwiZGlkLW5hdmlnYXRlXCIsIChldmVudCwgdXJsKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh1cmwgIT0gXCJodHRwczovL2F1dGguZGlzY29yZHNlcnZlcnMuY29tL2luZm9cIikgcmV0dXJuO1xyXG4gICAgICAgICAgICBzZWxmLmpvaW5XaW5kb3cuY2xvc2UoKTtcclxuICAgICAgICAgICAgc2VsZi5jaGVja0Nvbm5lY3Rpb24oKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBzZWxmLmpvaW5XaW5kb3cubG9hZFVSTCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB3aW5kb3dPcHRpb25zKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHdpZHRoOiA1MDAsXHJcbiAgICAgICAgICAgIGhlaWdodDogNTUwLFxyXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiIzI4MmIzMFwiLFxyXG4gICAgICAgICAgICBzaG93OiB0cnVlLFxyXG4gICAgICAgICAgICByZXNpemFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBtYXhpbWl6YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIG1pbmltaXphYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgYWx3YXlzT25Ub3A6IHRydWUsXHJcbiAgICAgICAgICAgIGZyYW1lOiBmYWxzZSxcclxuICAgICAgICAgICAgY2VudGVyOiBmYWxzZSxcclxuICAgICAgICAgICAgd2ViUHJlZmVyZW5jZXM6IHtcclxuICAgICAgICAgICAgICAgIG5vZGVJbnRlZ3JhdGlvbjogZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGJkU2VydmVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNlcnZlciA9IHtcclxuICAgICAgICAgICAgbmFtZTogXCJCZXR0ZXJEaXNjb3JkXCIsXHJcbiAgICAgICAgICAgIG9ubGluZTogXCIzMDAwMCtcIixcclxuICAgICAgICAgICAgbWVtYmVyczogXCI3MDAwMCtcIixcclxuICAgICAgICAgICAgY2F0ZWdvcmllczogW1wiY29tbXVuaXR5XCIsIFwicHJvZ3JhbW1pbmdcIiwgXCJzdXBwb3J0XCJdLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJPZmZpY2lhbCBCZXR0ZXJEaXNjb3JkIHNlcnZlciBmb3Igc3VwcG9ydCBldGNcIixcclxuICAgICAgICAgICAgaWRlbnRpZmllcjogXCI4NjAwNDc0NDk2NjkxNDA0OFwiLFxyXG4gICAgICAgICAgICBpY29uVXJsOiBcImh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2ljb25zLzg2MDA0NzQ0OTY2OTE0MDQ4LzI5MmU3ZjZiZmZmMmI3MWRmZDEzZTUwOGE4NTlhZWRkLndlYnBcIixcclxuICAgICAgICAgICAgbmF0aXZlam9pbjogdHJ1ZSxcclxuICAgICAgICAgICAgaW52aXRlX2NvZGU6IFwiMFRtZm81WmJPUkNScWJBZFwiLFxyXG4gICAgICAgICAgICBwaW5uZWQ6IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHNlcnZlcjIgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiTGlnaHRjb3JkXCIsXHJcbiAgICAgICAgICAgIG9ubGluZTogXCIxMDArXCIsXHJcbiAgICAgICAgICAgIG1lbWJlcnM6IFwiMzAwK1wiLFxyXG4gICAgICAgICAgICBjYXRlZ29yaWVzOiBbXCJjb21tdW5pdHlcIiwgXCJwcm9ncmFtbWluZ1wiLCBcInN1cHBvcnRcIl0sXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk9mZmljaWFsIExpZ2h0Y29yZCBzZXJ2ZXIgZm9yIHN1cHBvcnQgZXRjXCIsXHJcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IFwiNzA1OTA4MzUwMjE4NjY2MTE3XCIsXHJcbiAgICAgICAgICAgIGljb25Vcmw6IFwiaHR0cHM6Ly9naXRodWIuY29tL2xpZ2h0Y29yZC5wbmdcIixcclxuICAgICAgICAgICAgbmF0aXZlam9pbjogdHJ1ZSxcclxuICAgICAgICAgICAgaW52aXRlX2NvZGU6IFwiN2VGZmYyQVwiLFxyXG4gICAgICAgICAgICBwaW5uZWQ6IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IGd1aWxkTGlzdCA9IHRoaXMuU29ydGVkR3VpbGRTdG9yZS5nZXRGbGF0dGVuZWRHdWlsZElkcygpO1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRMaXN0ID0gdGhpcy5BdmF0YXJEZWZhdWx0cy5ERUZBVUxUX0FWQVRBUlM7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNlcnZlckNhcmQsIHtzZXJ2ZXI6IHNlcnZlcjIsIHBpbm5lZDogdHJ1ZSwgam9pbjogdGhpcy5qb2luLCBndWlsZExpc3Q6IGd1aWxkTGlzdCwgZmFsbGJhY2s6IGRlZmF1bHRMaXN0W01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDUpXX0pLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VydmVyQ2FyZCwge3NlcnZlcjogc2VydmVyLCBwaW5uZWQ6IHRydWUsIGpvaW46IHRoaXMuam9pbiwgZ3VpbGRMaXN0OiBndWlsZExpc3QsIGZhbGxiYWNrOiBkZWZhdWx0TGlzdFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1KV19KVxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgZW5kUG9pbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiaHR0cHM6Ly9zZWFyY2guZGlzY29yZHNlcnZlcnMuY29tXCI7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGpvaW5FbmRQb2ludCgpIHtcclxuICAgICAgICByZXR1cm4gXCJodHRwczovL2ouZGlzY29yZHNlcnZlcnMuY29tXCI7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbm5lY3RFbmRQb2ludCgpIHtcclxuICAgICAgICByZXR1cm4gXCJodHRwczovL2pvaW4uZGlzY29yZHNlcnZlcnMuY29tL2Nvbm5lY3RcIjtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjaGVja0Nvbm5lY3Rpb24oKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9hdXRoLmRpc2NvcmRzZXJ2ZXJzLmNvbS9pbmZvYCx7XHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXHJcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXHJcbiAgICAgICAgICAgICAgICBtb2RlOiBcImNvcnNcIixcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKVxyXG4gICAgICAgICAgICBpZighdGV4dCl7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXCJOb3QgY29ubmVjdGVkIHRvIGRpc2NvcmRzZXJ2ZXJzLmNvbSFcIixcclxuICAgICAgICAgICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IC0xLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXI6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHRleHQpXHJcbiAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRDYXRlZ29yeTogMCxcclxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IHtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogMixcclxuICAgICAgICAgICAgICAgICAgICB1c2VyOiBkYXRhXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBzZWxmLnNlYXJjaChcIlwiLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXHJcbiAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6IFwiTm90IGNvbm5lY3RlZCB0byBkaXNjb3Jkc2VydmVycy5jb20hXCIsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRDYXRlZ29yeTogLTEsXHJcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcjogbnVsbFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBcInB1YnNsYXllcnJvb3RcIn0sIFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBcInB1YnNsYXllclwifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNpZGViYXJWaWV3LCB7cmVmOiBcInNidlwifSwgdGhpcy5jb21wb25lbnQpKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBzaWRlYmFyOiB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMuc2lkZWJhclxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjb250ZW50OiB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMuY29udGVudFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0b29sczoge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHMsIHtrZXk6IFwicHRcIiwgcmVmOiBcInRvb2xzXCIsIG9uQ2xpY2s6IHRoaXMuY2xvc2V9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2lkZWJhcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInNpZGViYXJcIiwga2V5OiBcInBzXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS10YWItYmFyIFNJREVcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLXRhYi1iYXItaGVhZGVyXCIsIHN0eWxlOiB7Zm9udFNpemU6IFwiMTZweFwifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgXCJQdWJsaWMgU2VydmVyc1wiXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhclNlcGFyYXRvciwgbnVsbCksXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhclNlcGFyYXRvciwgbnVsbCksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFySGVhZGVyLCB7dGV4dDogXCJDYXRlZ29yaWVzXCJ9KSxcclxuICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlCdXR0b25zLm1hcCgodmFsdWUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJJdGVtLCB7aWQ6IGluZGV4LCBvbkNsaWNrOiB0aGlzLmNoYW5nZUNhdGVnb3J5LCBrZXk6IGluZGV4LCB0ZXh0OiB2YWx1ZSwgc2VsZWN0ZWQ6IHRoaXMuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeSA9PT0gaW5kZXh9KTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhclNlcGFyYXRvciwgbnVsbCksXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvb3RlcixcclxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2VhcmNoSW5wdXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1mb3JtLWl0ZW1cIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLXRleHQtaW5wdXQgZmxleC12ZXJ0aWNhbFwiLCBzdHlsZToge3dpZHRoOiBcIjE3MnB4XCIsIG1hcmdpbkxlZnQ6IFwiMTBweFwifX0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCB7cmVmOiBcInNlYXJjaGlucHV0XCIsIG9uS2V5RG93bjogdGhpcy5zZWFyY2hLZXlEb3duLCBvbkNoYW5nZTogKCkgPT4ge30sIHR5cGU6IFwidGV4dFwiLCBjbGFzc05hbWU6IFwiaW5wdXQgZGVmYXVsdFwiLCBwbGFjZWhvbGRlcjogXCJTZWFyY2guLi5cIiwgbWF4TGVuZ3RoOiBcIjUwXCJ9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBzZWFyY2hLZXlEb3duKGUpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBpZiAoc2VsZi5zdGF0ZS5sb2FkaW5nIHx8IGUud2hpY2ggIT09IDEzKSByZXR1cm47XHJcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXHJcbiAgICAgICAgICAgIHRpdGxlOiBcIkxvYWRpbmcuLi5cIixcclxuICAgICAgICAgICAgdGVybTogZS50YXJnZXQudmFsdWVcclxuICAgICAgICB9KTtcclxuICAgICAgICBsZXQgcXVlcnkgPSBgP3Rlcm09JHtlLnRhcmdldC52YWx1ZX1gO1xyXG4gICAgICAgIGlmIChzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnkgIT09IDApIHtcclxuICAgICAgICAgICAgcXVlcnkgKz0gYCZjYXRlZ29yeT0ke3NlbGYuY2F0ZWdvcnlCdXR0b25zW3NlbGYuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeV19YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2VsZi5zZWFyY2gocXVlcnksIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjYXRlZ29yeUJ1dHRvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIFtcIkFsbFwiLCBcIkZQUyBHYW1lc1wiLCBcIk1NTyBHYW1lc1wiLCBcIlN0cmF0ZWd5IEdhbWVzXCIsIFwiTU9CQSBHYW1lc1wiLCBcIlJQRyBHYW1lc1wiLCBcIlRhYmxldG9wIEdhbWVzXCIsIFwiU2FuZGJveCBHYW1lc1wiLCBcIlNpbXVsYXRpb24gR2FtZXNcIiwgXCJNdXNpY1wiLCBcIkNvbW11bml0eVwiLCBcIkxhbmd1YWdlXCIsIFwiUHJvZ3JhbW1pbmdcIiwgXCJPdGhlclwiXTtcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VDYXRlZ29yeShpZCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGlmIChzZWxmLnN0YXRlLmxvYWRpbmcpIHJldHVybjtcclxuICAgICAgICBzZWxmLnJlZnMuc2VhcmNoaW5wdXQudmFsdWUgPSBcIlwiO1xyXG4gICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICBzZWxlY3RlZENhdGVnb3J5OiBpZCxcclxuICAgICAgICAgICAgdGl0bGU6IFwiTG9hZGluZy4uLlwiLFxyXG4gICAgICAgICAgICB0ZXJtOiBudWxsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGlkID09PSAwKSB7XHJcbiAgICAgICAgICAgIHNlbGYuc2VhcmNoKFwiXCIsIHRydWUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNlbGYuc2VhcmNoKGA/Y2F0ZWdvcnk9JHtzZWxmLmNhdGVnb3J5QnV0dG9uc1tpZF19YCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbnRlbnQoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgY29uc3QgZ3VpbGRMaXN0ID0gdGhpcy5Tb3J0ZWRHdWlsZFN0b3JlLmdldEZsYXR0ZW5lZEd1aWxkSWRzKCk7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdExpc3QgPSB0aGlzLkF2YXRhckRlZmF1bHRzLkRFRkFVTFRfQVZBVEFSUztcclxuICAgICAgICBpZiAoc2VsZi5zdGF0ZS5jb25uZWN0aW9uLnN0YXRlID09PSAxKSByZXR1cm4gc2VsZi5ub3RDb25uZWN0ZWQ7XHJcbiAgICAgICAgbGV0IGNvbHVtbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW5EZWZhdWx0KVswXVxyXG4gICAgICAgIHJldHVybiBbQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7cmVmOiBcImNvbnRlbnRcIiwga2V5OiBcInBjXCIsIGNsYXNzTmFtZTogY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgXCIrY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiBzZWxmLnN0YXRlLnRpdGxlfSksXHJcbiAgICAgICAgICAgIHNlbGYuYmRTZXJ2ZXIsXHJcbiAgICAgICAgICAgIHNlbGYuc3RhdGUuc2VydmVycy5tYXAoKHNlcnZlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXJ2ZXJDYXJkLCB7a2V5OiBzZXJ2ZXIuaWRlbnRpZmllciwgc2VydmVyOiBzZXJ2ZXIsIGpvaW46IHNlbGYuam9pbiwgZ3VpbGRMaXN0OiBndWlsZExpc3QsIGZhbGxiYWNrOiBkZWZhdWx0TGlzdFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1KV19KTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHNlbGYuc3RhdGUubmV4dCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAge3R5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuc3RhdGUubG9hZGluZykgcmV0dXJuO3NlbGYuc2V0U3RhdGUoe2xvYWRpbmc6IHRydWV9KTsgc2VsZi5zZWFyY2goc2VsZi5zdGF0ZS5uZXh0LCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgY2xhc3NOYW1lOiBcInVpLWJ1dHRvbiBmaWxsZWQgYnJhbmQgc21hbGwgZ3Jvd1wiLCBzdHlsZToge3dpZHRoOiBcIjEwMCVcIiwgbWFyZ2luVG9wOiBcIjEwcHhcIiwgbWFyZ2luQm90dG9tOiBcIjEwcHhcIn19LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZS5sb2FkaW5nID8gXCJMb2FkaW5nXCIgOiBcIkxvYWQgTW9yZVwiXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHNlbGYuc3RhdGUuc2VydmVycy5sZW5ndGggPiAwICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogc2VsZi5zdGF0ZS50aXRsZX0pXHJcbiAgICAgICAgKV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG5vdENvbm5lY3RlZCgpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICAvL3JldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwgeyB0ZXh0OiBzZWxmLnN0YXRlLnRpdGxlIH0pO1xyXG4gICAgICAgIGxldCBjb2x1bW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250ZW50Q29sdW1uRGVmYXVsdClbMF1cclxuICAgICAgICByZXR1cm4gW0JEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2tleTogXCJuY2NcIiwgcmVmOiBcImNvbnRlbnRcIiwgY2xhc3NOYW1lOiBjb2x1bW5Nb2R1bGUuY29udGVudENvbHVtbitcIiBcIitjb2x1bW5Nb2R1bGUuY29udGVudENvbHVtbitcIiBjb250ZW50LWNvbHVtbiBkZWZhdWx0XCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImgyXCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGl0bGUgaDIgbWFyZ2luLXJlc2V0IG1hcmdpbi1ib3R0b20tMjBcIn0sXHJcbiAgICAgICAgICAgICAgICBcIk5vdCBjb25uZWN0ZWQgdG8gZGlzY29yZHNlcnZlcnMuY29tIVwiLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBzZWxmLmNvbm5lY3QsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJ1aS1idXR0b24gZmlsbGVkIGJyYW5kIHNtYWxsIGdyb3dcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5IZWlnaHQ6IFwiMThweFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luTGVmdDogXCIxMHB4XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lSGVpZ2h0OiBcIjE0cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNvbm5lY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKSwgc2VsZi5iZFNlcnZlclxyXG4gICAgICAgICldO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBmb290ZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS10YWItYmFyLWhlYWRlclwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJhXCIsXHJcbiAgICAgICAgICAgICAgICB7aHJlZjogXCJodHRwczovL2Rpc2NvcmRzZXJ2ZXJzLmNvbVwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgXCJEaXNjb3Jkc2VydmVycy5jb21cIlxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29ubmVjdGlvbigpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBjb25zdCB7Y29ubmVjdGlvbn0gPSBzZWxmLnN0YXRlO1xyXG4gICAgICAgIGlmIChjb25uZWN0aW9uLnN0YXRlICE9PSAyKSByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJzcGFuXCIsXHJcbiAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJTZXBhcmF0b3IsIG51bGwpLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcInNwYW5cIixcclxuICAgICAgICAgICAgICAgIHtzdHlsZToge2NvbG9yOiBcIiNiOWJiYmVcIiwgZm9udFNpemU6IFwiMTBweFwiLCBtYXJnaW5MZWZ0OiBcIjEwcHhcIn19LFxyXG4gICAgICAgICAgICAgICAgXCJDb25uZWN0ZWQgYXM6IFwiLFxyXG4gICAgICAgICAgICAgICAgYCR7Y29ubmVjdGlvbi51c2VyLnVzZXJuYW1lfSMke2Nvbm5lY3Rpb24udXNlci5kaXNjcmltaW5hdG9yfWBcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtzdHlsZToge3BhZGRpbmc6IFwiNXB4IDEwcHggMCAxMHB4XCJ9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtzdHlsZToge3dpZHRoOiBcIjEwMCVcIiwgbWluSGVpZ2h0OiBcIjIwcHhcIn0sIHR5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJ1aS1idXR0b24gZmlsbGVkIGJyYW5kIHNtYWxsIGdyb3dcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wiLCBvbkNsaWNrOiBzZWxmLmNvbm5lY3R9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlJlY29ubmVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxufVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19TZXJ2ZXJDYXJkIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICBpZiAoIXRoaXMucHJvcHMuc2VydmVyLmljb25VcmwpIHRoaXMucHJvcHMuc2VydmVyLmljb25VcmwgPSB0aGlzLnByb3BzLmZhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGltYWdlRXJyb3I6IGZhbHNlLFxyXG4gICAgICAgICAgICBqb2luZWQ6IHRoaXMucHJvcHMuZ3VpbGRMaXN0LmluY2x1ZGVzKHRoaXMucHJvcHMuc2VydmVyLmlkZW50aWZpZXIpXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge3NlcnZlcn0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIGxldCBjYXJkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY2FyZCAmJiBlLmNhcmRQcmltYXJ5KVswXVxyXG4gICAgICAgIGxldCBmbGV4TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZmxleENoaWxkICYmIGUuX2hvcml6b250YWxSZXZlcnNlKVswXVxyXG4gICAgICAgIGxldCB3cmFwTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubm9XcmFwICYmICFlLnN0cmVhbWVyTW9kZUVuYWJsZWQpWzBdXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIiwgLy8gY2FyZFByaW1hcnktMUh2LXRvXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IGAke2NhcmRNb2R1bGUuY2FyZH0gJHtjYXJkTW9kdWxlLmNhcmRQcmltYXJ5fSAke0JETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTgpWzBdLm1hcmdpbkJvdHRvbTh9IGJkLXNlcnZlci1jYXJkJHtzZXJ2ZXIucGlubmVkID8gXCIgYmQtc2VydmVyLWNhcmQtcGlubmVkXCIgOiBcIlwifWB9LFxyXG4gICAgICAgICAgICAvLyBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAvLyBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgLy8geyBjbGFzc05hbWU6IFwiZmxleC0xeE1RZzUgZmxleC0xTzFHS1kgaG9yaXpvbnRhbC0xYWU5Y2kgaG9yaXpvbnRhbC0yRUVFblkgZmxleC0xTzFHS1kgZGlyZWN0aW9uUm93LTN2M3RmRyBqdXN0aWZ5U3RhcnQtMnlJWm8wIGFsaWduU3RyZXRjaC0xaHd4TWEgbm9XcmFwLTNqeW52NlwiIH0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwge3JlZjogXCJpbWdcIiwgY2xhc3NOYW1lOiBcImJkLXNlcnZlci1pbWFnZVwiLCBzcmM6IHNlcnZlci5pY29uVXJsLCBvbkVycm9yOiB0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcyksIGRyYWdnYWJsZTogZmFsc2V9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IGZsZXhNb2R1bGUuZmxleENoaWxkK1wiIGJkLXNlcnZlci1jb250ZW50XCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogZmxleE1vZHVsZS5ob3Jpem9udGFsK1wiIFwiK3dyYXBNb2R1bGUubm9XcmFwK1wiIGJkLXNlcnZlci1oZWFkZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiaDVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiaDUtMThfMW5kIGRlZmF1bHRDb2xvci0xX2FqWDAgbWFyZ2luLXJlc2V0IGJkLXNlcnZlci1uYW1lXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLm5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJoNVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJoNS0xOF8xbmQgZGVmYXVsdENvbG9yLTFfYWpYMCBtYXJnaW4tcmVzZXQgYmQtc2VydmVyLW1lbWJlci1jb3VudFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5tZW1iZXJzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgTWVtYmVyc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogZmxleE1vZHVsZS5ob3Jpem9udGFsK1wiIFwiK3dyYXBNb2R1bGUubm9XcmFwfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwic2Nyb2xsZXJXcmFwLTJsSkVrZCBzY3JvbGxlclRoZW1lZC0yb2VudXMgdGhlbWVHaG9zdEhhaXJsaW5lLURCRC0yZCBzY3JvbGxlckZhZGUtMUlqdzV5IGJkLXNlcnZlci1kZXNjcmlwdGlvbi1jb250YWluZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInNjcm9sbGVyLTJGS0ZQRyBzY3JvbGxlciBiZC1zZXJ2ZXItZGVzY3JpcHRpb25cIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5kZXNjcmlwdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiZmxleC0xeE1RZzUgZmxleC0xTzFHS1kgaG9yaXpvbnRhbC0xYWU5Y2kgaG9yaXpvbnRhbC0yRUVFblkgZGlyZWN0aW9uUm93LTN2M3RmRyBub1dyYXAtM2p5bnY2IGJkLXNlcnZlci1mb290ZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImZsZXhDaGlsZC1mYW9WVzMgYmQtc2VydmVyLXRhZ3NcIiwgc3R5bGU6IHtmbGV4OiBcIjEgMSBhdXRvXCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5jYXRlZ29yaWVzLmpvaW4oXCIsIFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmpvaW5lZCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3R5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJidXR0b24tMzhhU2NyIGxvb2tGaWxsZWQtMUd4MDBQIGNvbG9yQnJhbmQtM3BYcjkxIHNpemVNaW4tMW1KZDF4IGdyb3ctcTc3T05OIGNvbG9yR3JlZW4tMjlpQUtZXCIsIHN0eWxlOiB7bWluSGVpZ2h0OiBcIjEycHhcIiwgbWFyZ2luVG9wOiBcIjRweFwiLCBiYWNrZ3JvdW5kQ29sb3I6IFwiIzNhYzE1Y1wifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkpvaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5lcnJvciAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3R5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJidXR0b24tMzhhU2NyIGxvb2tGaWxsZWQtMUd4MDBQIGNvbG9yQnJhbmQtM3BYcjkxIHNpemVNaW4tMW1KZDF4IGdyb3ctcTc3T05OIGRpc2FibGVkLTlhRjJ1Z1wiLCBzdHlsZToge21pbkhlaWdodDogXCIxMnB4XCIsIG1hcmdpblRvcDogXCI0cHhcIiwgYmFja2dyb3VuZENvbG9yOiBcIiNjMTNhM2FcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJFcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICFzZXJ2ZXIuZXJyb3IgJiYgIXRoaXMuc3RhdGUuam9pbmVkICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dHlwZTogXCJidXR0b25cIiwgY2xhc3NOYW1lOiBcImJ1dHRvbi0zOGFTY3IgbG9va0ZpbGxlZC0xR3gwMFAgY29sb3JCcmFuZC0zcFhyOTEgc2l6ZU1pbi0xbUpkMXggZ3Jvdy1xNzdPTk5cIiwgc3R5bGU6IHttaW5IZWlnaHQ6IFwiMTJweFwiLCBtYXJnaW5Ub3A6IFwiNHB4XCJ9LCBvbkNsaWNrOiAoKSA9PiB7dGhpcy5qb2luKCk7fX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkpvaW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAvLyApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVFcnJvcigpIHtcclxuICAgICAgICB0aGlzLnByb3BzLnNlcnZlci5pY29uVXJsID0gdGhpcy5wcm9wcy5mYWxsYmFjaztcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtpbWFnZUVycm9yOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgam9pbigpIHtcclxuICAgICAgICB0aGlzLnByb3BzLmpvaW4odGhpcyk7XHJcbiAgICAgICAgLy90aGlzLnNldFN0YXRlKHtqb2luZWQ6IHRydWV9KTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5pbXBvcnQgU2Nyb2xsZXIgZnJvbSBcIi4uL3Njcm9sbGVyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2lkZWJhclZpZXcgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge3NpZGViYXIsIGNvbnRlbnQsIHRvb2xzfSA9IHRoaXMucHJvcHMuY2hpbGRyZW47XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJzdGFuZGFyZFNpZGViYXJWaWV3LTNGMUk3aSB1aS1zdGFuZGFyZC1zaWRlYmFyLXZpZXdcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInNpZGViYXJSZWdpb24tVkZUVWtOIHNpZGViYXItcmVnaW9uXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbGVyLCB7a2V5OiBcInNpZGViYXJTY3JvbGxlclwiLCByZWY6IFwic2lkZWJhclNjcm9sbGVyXCIsIHNpZGViYXI6IHRydWUsIGZhZGU6IHNpZGViYXIuZmFkZSB8fCB0cnVlLCBkYXJrOiBzaWRlYmFyLmRhcmsgfHwgdHJ1ZX0sIHNpZGViYXIuY29tcG9uZW50KVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJjb250ZW50UmVnaW9uLTNuRHVZeSBjb250ZW50LXJlZ2lvblwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImNvbnRlbnRUcmFuc2l0aW9uV3JhcC0zaHFPRVcgY29udGVudC10cmFuc2l0aW9uLXdyYXBcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwic2Nyb2xsZXJXcmFwLTJsSkVrZCBmaXJlZm94Rml4U2Nyb2xsRmxleC1jbkkyaXggY29udGVudFJlZ2lvblNjcm9sbGVyV3JhcC0zWVpYZG0gY29udGVudC1yZWdpb24tc2Nyb2xsZXItd3JhcCBzY3JvbGxlclRoZW1lZC0yb2VudXMgdGhlbWVHaG9zdC0yOE1TbjAgc2Nyb2xsZXJUcmFjay0xWklwc3ZcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInNjcm9sbGVyLTJGS0ZQRyBmaXJlZm94Rml4U2Nyb2xsRmxleC1jbkkyaXggY29udGVudFJlZ2lvblNjcm9sbGVyLTI2bmMxZSBjb250ZW50LXJlZ2lvbi1zY3JvbGxlciBzY3JvbGxlclwiLCByZWY6IFwiY29udGVudFNjcm9sbGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiY29udGVudENvbHVtbi0yaHJJWUggY29udGVudENvbHVtbkRlZmF1bHQtMVZRa0dNIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIn0sIGNvbnRlbnQuY29tcG9uZW50KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xzLmNvbXBvbmVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfUmVsb2FkSWNvbiBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xyXG4gICAgICAgICAgICAgICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcclxuICAgICAgICAgICAgICAgIHZpZXdCb3g6IFwiMCAwIDI0IDI0XCIsXHJcbiAgICAgICAgICAgICAgICBmaWxsOiBcIiNkY2RkZGVcIixcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1yZWxvYWQgXCIgKyB0aGlzLnByb3BzLmNsYXNzTmFtZSxcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6IHRoaXMucHJvcHMub25DbGljayxcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7d2lkdGg6IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjI0cHhcIiwgaGVpZ2h0OiB0aGlzLnByb3BzLnNpemUgfHwgXCIyNHB4XCJ9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2Q6IFwiTTE3LjY1IDYuMzVDMTYuMiA0LjkgMTQuMjEgNCAxMiA0Yy00LjQyIDAtNy45OSAzLjU4LTcuOTkgOHMzLjU3IDggNy45OSA4YzMuNzMgMCA2Ljg0LTIuNTUgNy43My02aC0yLjA4Yy0uODIgMi4zMy0zLjA0IDQtNS42NSA0LTMuMzEgMC02LTIuNjktNi02czIuNjktNiA2LTZjMS42NiAwIDMuMTQuNjkgNC4yMiAxLjc4TDEzIDExaDdWNGwtMi4zNSAyLjM1elwifSksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6IFwibm9uZVwiLCBkOiBcIk0wIDBoMjR2MjRIMHpcIn0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2Nyb2xsZXIgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgLy9zY3JvbGxlcldyYXAtMmxKRWtkIHNjcm9sbGVyVGhlbWVkLTJvZW51cyB0aGVtZUdob3N0SGFpcmxpbmUtREJELTJkIHNjcm9sbGVyRmFkZS0xSWp3NXlcclxuICAgICAgICBsZXQgc2Nyb2xsZXJNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsZXJIb3Jpem9udGFsKVswXVxyXG4gICAgICAgIGxldCBzY3JvbGxlck1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaWRlYmFyUmVnaW9uU2Nyb2xsZXIpWzBdXHJcbiAgICAgICAgbGV0IHdyYXBwZXJDbGFzcyA9IGAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcldyYXB9ICR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyVGhlbWVkfSAke3Njcm9sbGVyTW9kdWxlMS50aGVtZUdob3N0SGFpcmxpbmV9JHt0aGlzLnByb3BzLmZhZGUgPyBcIiBcIitzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJGYWRlIDogXCJcIn1gO1xyXG4gICAgICAgIGxldCBzY3JvbGxlckNsYXNzID0gc2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyK1wiIHNjcm9sbGVyXCI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVjayAqL1xyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLnNpZGViYXIpIHNjcm9sbGVyQ2xhc3MgKz0gYCAke3Njcm9sbGVyTW9kdWxlMi5zaWRlYmFyUmVnaW9uU2Nyb2xsZXJ9IHNpZGViYXItcmVnaW9uLXNjcm9sbGVyYFxyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLmNvbnRlbnRDb2x1bW4pIHtcclxuICAgICAgICAgICAgc2Nyb2xsZXJDbGFzcyArPSBcIiBcIitzY3JvbGxlck1vZHVsZTIuY29udGVudFJlZ2lvblNjcm9sbGVyK1wiIGNvbnRlbnQtcmVnaW9uLXNjcm9sbGVyXCI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWNrICovXHJcbiAgICAgICAgICAgIHdyYXBwZXJDbGFzcyA9IGAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcldyYXB9ICR7c2Nyb2xsZXJNb2R1bGUyLmNvbnRlbnRSZWdpb25TY3JvbGxlcldyYXB9IGNvbnRlbnQtcmVnaW9uLXNjcm9sbGVyLXdyYXAgICR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyVGhlbWVkfSAke3Njcm9sbGVyTW9kdWxlMS50aGVtZUdob3N0fSAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlclRyYWNrfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHtjaGlsZHJlbn0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtrZXk6IFwic2Nyb2xsZXJ3cmFwXCIsIGNsYXNzTmFtZTogd3JhcHBlckNsYXNzfSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtrZXk6IFwic2Nyb2xsZXJcIiwgcmVmOiBcInNjcm9sbGVyXCIsIGNsYXNzTmFtZTogc2Nyb2xsZXJDbGFzc30sXHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlblxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufVxyXG5cclxuY29uc3Qgb3JpZ2luYWxSZW5kZXIgPSBWMkNfU2Nyb2xsZXIucHJvdG90eXBlLnJlbmRlcjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFYyQ19TY3JvbGxlci5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHtcclxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcclxuICAgIHNldDogZnVuY3Rpb24oKSB7Y29uc29sZS53YXJuKFwiQWRkb24gcG9saWN5IGZvciBwbHVnaW5zICM1IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvd2lraS9BZGRvbi1Qb2xpY2llcyNwbHVnaW5zXCIpO30sXHJcbiAgICBnZXQ6ICgpID0+IG9yaWdpbmFsUmVuZGVyXHJcbn0pOyAiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuaW1wb3J0IFNldHRpbmdzR3JvdXAgZnJvbSBcIi4vc2V0dGluZ3NHcm91cFwiO1xyXG5pbXBvcnQgTWFyZ2luVG9wIGZyb20gXCIuL21hcmdpbnRvcFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1NlY3Rpb25lZFNldHRpbmdzUGFuZWwgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuc2VjdGlvbnMubWFwKChzZWN0aW9uLCBpKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgICAgICBpICE9PSAwID8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KE1hcmdpblRvcCwge30pIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc0dyb3VwLCBPYmplY3QuYXNzaWduKHt9LCBzZWN0aW9uLCB7b25DaGFuZ2U6IHRoaXMucHJvcHMub25DaGFuZ2V9KSlcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmltcG9ydCBTZXR0aW5nc1RpdGxlIGZyb20gXCIuL3NldHRpbmdzVGl0bGVcIjtcclxuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi9zd2l0Y2hcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19TZXR0aW5nc0dyb3VwIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHt0aXRsZSwgc2V0dGluZ3MsIGJ1dHRvbn0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIGNvbnN0IGJ1dHRvbkNvbXBvbmVudCA9IGJ1dHRvbiA/IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7a2V5OiBcInRpdGxlLWJ1dHRvblwiLCBjbGFzc05hbWU6IFwiYmQtcGZidG5cIiwgb25DbGljazogYnV0dG9uLm9uQ2xpY2t9LCBidXR0b24udGl0bGUpIDogbnVsbDtcclxuICAgICAgICByZXR1cm4gW0JEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogdGl0bGV9KSxcclxuICAgICAgICAgICAgICAgIGJ1dHRvbkNvbXBvbmVudCxcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzLm1hcChzZXR0aW5nID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFN3aXRjaCwge2lkOiBzZXR0aW5nLmlkLCBrZXk6IHNldHRpbmcuaWQsIGRhdGE6IHNldHRpbmcsIGNoZWNrZWQ6IHNldHRpbmdzQ29va2llW3NldHRpbmcuaWRdLCBvbkNoYW5nZTogKGlkLCBjaGVja2VkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UoaWQsIGNoZWNrZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH19KTtcclxuICAgICAgICAgICAgICAgIH0pXTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2V0dGluZ3NUaXRsZSBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcbi8vaDItMmdXRS1vIHRpdGxlLTNzWldZUSBzaXplMTYtMTRjR3o1IGhlaWdodDIwLW1PMmVJTiB3ZWlnaHRTZW1pQm9sZC1OSmV4emkgZGEtaDIgZGEtdGl0bGUgZGEtc2l6ZTE2IGRhLWhlaWdodDIwIGRhLXdlaWdodFNlbWlCb2xkIGRlZmF1bHRDb2xvci0xX2FqWDAgZGEtZGVmYXVsdENvbG9yIG1hcmdpblRvcDYwLTNQR2J0SyBkYS1tYXJnaW5Ub3A2MCBtYXJnaW5Cb3R0b20yMC0zMnFJRDcgZGEtbWFyZ2luQm90dG9tMjBcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImgyXCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMiBtYXJnaW4tcmVzZXQgbWFyZ2luLWJvdHRvbS0yMFwifSxcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy50ZXh0XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBTd2l0Y2ggZnJvbSBcIi4vY29tcG9uZW50cy9zd2l0Y2hcIjtcclxuXHJcbmxldCBjbGFzc25hbWVzID0gW11cclxuZnVuY3Rpb24gZ2V0Q2xhc3NOYW1lKG5hbWUpe1xyXG4gICAgbGV0IGNsYXNzTmFtZSA9IGNsYXNzbmFtZXMuZmluZChlID0+IGUuc3RhcnRzV2l0aChuYW1lK1wiLVwiKSlcclxuICAgIGlmKGNsYXNzTmFtZSlyZXR1cm4gY2xhc3NOYW1lXHJcbiAgICBjbGFzc05hbWUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZVtuYW1lXSlbMF1bbmFtZV1cclxuICAgIGNsYXNzbmFtZXMucHVzaChjbGFzc05hbWUpXHJcbiAgICByZXR1cm4gY2xhc3NOYW1lXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN3aXRjaEl0ZW0gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMuY2hlY2tlZCA9ICF0aGlzLnByb3BzLmNoZWNrZWQ7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLmlkLCB0aGlzLnByb3BzLmNoZWNrZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBsZXQge3RleHQsIGluZm99ID0gdGhpcy5wcm9wcy5kYXRhO1xyXG4gICAgICAgIGlmKCFjbGFzc25hbWVzLmZpbmQoZSA9PiBlLnN0YXJ0c1dpdGgoXCJiZXRhLVwiKSkpe1xyXG4gICAgICAgICAgICBjbGFzc25hbWVzLnB1c2goQkRNb2R1bGVzLmdldChlID0+IGUuYmV0YSAmJiAoIWUuY29udGFpbmVyICYmICFlLnVzZXJTZXR0aW5nc1ZvaWNlKSlbMF0uYmV0YSlcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYodGhpcy5wcm9wcy5kYXRhLmV4cGVyaW1lbnRhbCl7XHJcbiAgICAgICAgICAgIGluZm8gPSBbXHJcbiAgICAgICAgICAgICAgICBpbmZvLFxyXG4gICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInN1cFwiLCB7Y2xhc3NOYW1lOiBnZXRDbGFzc05hbWUoXCJiZXRhXCIpfSwgXCIoRVhQRVJJTUVOVEFMKVwiKVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJ1aS1mbGV4IGZsZXgtdmVydGljYWwgZmxleC1qdXN0aWZ5LXN0YXJ0IGZsZXgtYWxpZ24tc3RyZXRjaCBmbGV4LW5vd3JhcCB1aS1zd2l0Y2gtaXRlbVwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidWktZmxleCBmbGV4LWhvcml6b250YWwgZmxleC1qdXN0aWZ5LXN0YXJ0IGZsZXgtYWxpZ24tc3RyZXRjaCBmbGV4LW5vd3JhcFwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImgzXCIsIHtrZXk6IFwidGl0bGVcIiwgY2xhc3NOYW1lOiBcInVpLWZvcm0tdGl0bGUgaDMgbWFyZ2luLXJlc2V0IG1hcmdpbi1yZXNldCB1aS1mbGV4LWNoaWxkXCJ9LCB0ZXh0KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTd2l0Y2gsIHtrZXk6IFwic3dpdGNoXCIsIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLCBjaGVja2VkOiB0aGlzLnByb3BzLmNoZWNrZWR9KVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRleHQgc3R5bGUtZGVzY3JpcHRpb24gbWFyZ2luLXRvcC00XCIsIHN0eWxlOiB7ZmxleDogXCIxIDEgYXV0b1wifX0sIGluZm8pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfVGFiQmFySGVhZGVyIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6IFwidWktdGFiLWJhci1oZWFkZXJcIn0sIHRoaXMucHJvcHMudGV4dCwgdGhpcy5wcm9wcy5idXR0b24pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19UYWJCYXJJdGVtIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgICAgICB0aGlzLm9uQ2xpY2sgPSB0aGlzLm9uQ2xpY2suYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgc2VsZWN0ZWQ6IHRoaXMucHJvcHMuc2VsZWN0ZWQgfHwgZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBgdWktdGFiLWJhci1pdGVtJHt0aGlzLnByb3BzLnNlbGVjdGVkID8gXCIgc2VsZWN0ZWRcIiA6IFwiXCJ9YCwgb25DbGljazogdGhpcy5vbkNsaWNrfSxcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy50ZXh0XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uQ2xpY2spIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNsaWNrKHRoaXMucHJvcHMuaWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfVGFiQmFyU2VwYXJhdG9yIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLXRhYi1iYXItc2VwYXJhdG9yIG1hcmdpbi10b3AtOCBtYXJnaW4tYm90dG9tLThcIn0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmltcG9ydCBYU3ZnIGZyb20gXCIuL3hTdmdcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19Ub29scyBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMub25DbGljayA9IHRoaXMub25DbGljay5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBsZXQgdG9vbHNNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS50b29sc0NvbnRhaW5lcilbMF1cclxuICAgICAgICBsZXQgY29udGFpbmVyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29udGFpbmVyICYmIGUuY2xvc2VCdXR0b24gJiYgZS5jbG9zZUJ1dHRvbkJvbGQpWzBdXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInRvb2xzLWNvbnRhaW5lciBcIit0b29sc01vZHVsZS50b29sc0NvbnRhaW5lcn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInRvb2xzIFwiK3Rvb2xzTW9kdWxlLnRvb2xzfSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBjb250YWluZXJNb2R1bGUuY29udGFpbmVyfSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJidG4tY2xvc2UgXCIrY29udGFpbmVyTW9kdWxlLmNsb3NlQnV0dG9uLCBvbkNsaWNrOiB0aGlzLm9uQ2xpY2t9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoWFN2ZywgbnVsbClcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJlc2MtdGV4dCBcIitjb250YWluZXJNb2R1bGUua2V5YmluZH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRVNDXCJcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25DbGljaykge1xyXG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2xpY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY2xvc2VCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLlwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmNsb3NlQnV0dG9uICYmIGUua2V5YmluZEJvbGQpWzBdLmNsb3NlQnV0dG9uLnNwbGl0KFwiIFwiKVswXSk7XHJcbiAgICAgICAgaWYgKGNsb3NlQnV0dG9uKSBjbG9zZUJ1dHRvbi5jbGljaygpO1xyXG4gICAgfVxyXG59IiwiLyoqXHJcbiAqIFRvb2x0aXAgdGhhdCBhdXRvbWF0aWNhbGx5IHNob3cgYW5kIGhpZGUgdGhlbXNlbHZlcyBvbiBtb3VzZWVudGVyIGFuZCBtb3VzZWxlYXZlIGV2ZW50cy5cclxuICogV2lsbCBhbHNvIHJlbW92ZSB0aGVtc2VsdmVzIGlmIHRoZSBub2RlIHRvIHdhdGNoIGlzIHJlbW92ZWQgZnJvbSBET00gdGhyb3VnaFxyXG4gKiBhIE11dGF0aW9uT2JzZXJ2ZXIuXHJcbiAqXHJcbiAqIE5vdGUgdGhpcyBpcyBub3QgdXNpbmcgRGlzY29yZCdzIGludGVybmFscyBidXQgbm9ybWFsIERPTSBtYW5pcHVsYXRpb24gYW5kIGVtdWxhdGVzXHJcbiAqIERpc2NvcmQncyBvd24gdG9vbHRpcHMgYXMgY2xvc2VseSBhcyBwb3NzaWJsZS5cclxuICpcclxuICogQG1vZHVsZSBFbXVsYXRlZFRvb2x0aXBcclxuICogQHZlcnNpb24gMC4wLjFcclxuICovXHJcblxyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4uL21vZHVsZXMvdXRpbHNcIjtcclxuaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuLi9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzXCI7XHJcbmxldCBUb29sdGlwQ2xhc3Nlc1xyXG5mdW5jdGlvbiBnZXRUb29sdGlwQ2xhc3Nlcygpe1xyXG5cdGlmKFRvb2x0aXBDbGFzc2VzKXJldHVybiBUb29sdGlwQ2xhc3Nlc1xyXG5cdHJldHVybiBUb29sdGlwQ2xhc3NlcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwidG9vbHRpcFwiLCBcInRvb2x0aXBCbGFja1wiKTtcclxufVxyXG5sZXQgVG9vbHRpcExheWVyc1xyXG5mdW5jdGlvbiBnZXRUb29sdGlwTGF5ZXJzKCl7XHJcblx0aWYoVG9vbHRpcExheWVycylyZXR1cm4gVG9vbHRpcExheWVyc1xyXG5cdHJldHVybiBUb29sdGlwTGF5ZXJzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJsYXllclwiLCBcImxheWVyQ29udGFpbmVyXCIpO1xyXG59XHJcblxyXG5jb25zdCBnZXRDbGFzcyA9IGZ1bmN0aW9uKHNpZGVPckNvbG9yKSB7XHJcbiAgICBjb25zdCB1cHBlckNhc2UgPSBzaWRlT3JDb2xvclswXS50b1VwcGVyQ2FzZSgpICsgc2lkZU9yQ29sb3Iuc2xpY2UoMSk7XHJcbiAgICBjb25zdCB0b29sdGlwQ2xhc3MgPSBnZXRUb29sdGlwQ2xhc3NlcygpW2B0b29sdGlwJHt1cHBlckNhc2V9YF07XHJcbiAgICBpZiAodG9vbHRpcENsYXNzKSByZXR1cm4gdG9vbHRpcENsYXNzO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5jb25zdCBjbGFzc0V4aXN0cyA9IGZ1bmN0aW9uKHNpZGVPckNvbG9yKSB7XHJcbiAgICByZXR1cm4gZ2V0Q2xhc3Moc2lkZU9yQ29sb3IpID8gdHJ1ZSA6IGZhbHNlO1xyXG59O1xyXG5cclxuY29uc3QgdG9QeCA9IGZ1bmN0aW9uKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gYCR7dmFsdWV9cHhgO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW11bGF0ZWRUb29sdGlwIHtcclxuXHQvKipcclxuXHQgKlxyXG5cdCAqIEBjb25zdHJ1Y3RvclxyXG5cdCAqIEBwYXJhbSB7KEhUTUxFbGVtZW50fGpRdWVyeSl9IG5vZGUgLSBET00gbm9kZSB0byBtb25pdG9yIGFuZCBzaG93IHRoZSB0b29sdGlwIG9uXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRpcCAtIHN0cmluZyB0byBzaG93IGluIHRoZSB0b29sdGlwXHJcblx0ICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSB0b29sdGlwXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnN0eWxlPWJsYWNrXSAtIGNvcnJlbGF0ZXMgdG8gdGhlIGRpc2NvcmQgc3R5bGluZy9jb2xvcnMgKGJsYWNrLCBicmFuZCwgZ3JlZW4sIGdyZXksIHJlZCwgeWVsbG93KVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zaWRlPXRvcF0gLSBjYW4gYmUgYW55IG9mIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdFxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucHJldmVudEZsaXA9ZmFsc2VdIC0gcHJldmVudHMgbW92aW5nIHRoZSB0b29sdGlwIHRvIHRoZSBvcHBvc2l0ZSBzaWRlIGlmIGl0IGlzIHRvbyBiaWcgb3IgZ29lcyBvZmZzY3JlZW5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGlzYWJsZWQ9ZmFsc2VdIC0gd2hldGhlciB0aGUgdG9vbHRpcCBzaG91bGQgYmUgZGlzYWJsZWQgZnJvbSBzaG93aW5nIG9uIGhvdmVyXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmF0dGFjaEV2ZW50cz10cnVlXSAtIHdoZXRoZXIgdGhlIHRvb2x0aXAgc2hvdWxkIGxpc3RlbiB0byBtb3VzZWVudGVyIGFuZCBtb3VzZWxlYXZlIGV2ZW50cy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvcihub2RlLCB0ZXh0LCBvcHRpb25zID0ge30pIHtcclxuXHRcdGNvbnN0IHtzdHlsZSA9IFwiYmxhY2tcIiwgc2lkZSA9IFwidG9wXCIsIHByZXZlbnRGbGlwID0gZmFsc2UsIGRpc2FibGVkID0gZmFsc2UsIGF0dGFjaEV2ZW50cyA9IHRydWV9ID0gb3B0aW9ucztcclxuXHRcdHRoaXMubm9kZSA9IG5vZGUgaW5zdGFuY2VvZiBqUXVlcnkgPyBub2RlWzBdIDogbm9kZTtcclxuICAgICAgICB0aGlzLmxhYmVsID0gdGV4dDtcclxuICAgICAgICB0aGlzLnN0eWxlID0gc3R5bGUudG9Mb3dlckNhc2UoKTtcclxuXHRcdHRoaXMuc2lkZSA9IHNpZGUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICB0aGlzLnByZXZlbnRGbGlwID0gcHJldmVudEZsaXA7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkO1xyXG5cclxuICAgICAgICBpZiAoIWNsYXNzRXhpc3RzKHRoaXMuc2lkZSkpIHJldHVybiBVdGlscy5lcnIoXCJFbXVsYXRlZFRvb2x0aXBcIiwgYFNpZGUgJHt0aGlzLnNpZGV9IGRvZXMgbm90IGV4aXN0LmApO1xyXG5cdFx0aWYgKCFjbGFzc0V4aXN0cyh0aGlzLnN0eWxlKSkgcmV0dXJuIFV0aWxzLmVycihcIkVtdWxhdGVkVG9vbHRpcFwiLCBgU3R5bGUgJHt0aGlzLnN0eWxlfSBkb2VzIG5vdCBleGlzdC5gKTtcclxuXHRcdFxyXG5cdFx0dGhpcy5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHRcdHRoaXMuZWxlbWVudC5jbGFzc05hbWUgPSBnZXRUb29sdGlwTGF5ZXJzKCkubGF5ZXIgKyBcIiBcIiArIGdldFRvb2x0aXBMYXllcnMoKS5kaXNhYmxlZFBvaW50ZXJFdmVudHM7XHJcblxyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTmFtZSA9IGAke2dldFRvb2x0aXBDbGFzc2VzKCkudG9vbHRpcH0gJHtnZXRDbGFzcyh0aGlzLnN0eWxlKX1gO1xyXG5cclxuXHRcdHRoaXMubGFiZWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHRcdHRoaXMubGFiZWxFbGVtZW50LmNsYXNzTmFtZSA9IGdldFRvb2x0aXBDbGFzc2VzKCkudG9vbHRpcENvbnRlbnRcclxuXHJcblx0XHRjb25zdCBwb2ludGVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblx0XHRwb2ludGVyRWxlbWVudC5jbGFzc05hbWUgPSBnZXRUb29sdGlwQ2xhc3NlcygpLnRvb2x0aXBQb2ludGVyO1xyXG5cclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuYXBwZW5kKHBvaW50ZXJFbGVtZW50KTtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuYXBwZW5kKHRoaXMubGFiZWxFbGVtZW50KTtcclxuXHRcdHRoaXMuZWxlbWVudC5hcHBlbmQodGhpcy50b29sdGlwRWxlbWVudCk7XHJcblxyXG5cdFx0aWYoYXR0YWNoRXZlbnRzKXtcclxuXHRcdFx0dGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsICgpID0+IHtcclxuXHRcdFx0XHRpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG5cdFx0XHRcdHRoaXMuc2hvdygpO1xyXG5cdFxyXG5cdFx0XHRcdGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xyXG5cdFx0XHRcdFx0bXV0YXRpb25zLmZvckVhY2goKG11dGF0aW9uKSA9PiB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBkaXJlY3RNYXRjaCA9IG5vZGVzLmluZGV4T2YodGhpcy5ub2RlKSA+IC0xO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwYXJlbnRNYXRjaCA9IG5vZGVzLnNvbWUocGFyZW50ID0+IHBhcmVudC5jb250YWlucyh0aGlzLm5vZGUpKTtcclxuXHRcdFx0XHRcdFx0aWYgKGRpcmVjdE1hdGNoIHx8IHBhcmVudE1hdGNoKSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5oaWRlKCk7XHJcblx0XHRcdFx0XHRcdFx0b2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9KTtcclxuXHRcclxuXHRcdFx0XHRvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHtzdWJ0cmVlOiB0cnVlLCBjaGlsZExpc3Q6IHRydWV9KTtcclxuXHRcdFx0fSk7XHJcblx0XHJcblx0XHRcdHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCAoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5oaWRlKCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBDb250YWluZXIgd2hlcmUgdGhlIHRvb2x0aXAgd2lsbCBiZSBhcHBlbmRlZC4gKi9cclxuICAgIGdldCBjb250YWluZXIoKSB7IFxyXG5cdFx0cmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuXCIrVXRpbHMucmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUucG9wb3V0cylbMF0ucG9wb3V0cykrXCIgfiAuXCIrVXRpbHMucmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUubGF5ZXJDb250YWluZXIpWzBdLmxheWVyQ29udGFpbmVyKSk7IFxyXG5cdH1cclxuICAgIC8qKiBCb29sZWFuIHJlcHJlc2VudGluZyBpZiB0aGUgdG9vbHRpcCB3aWxsIGZpdCBvbiBzY3JlZW4gYWJvdmUgdGhlIGVsZW1lbnQgKi9cclxuICAgIGdldCBjYW5TaG93QWJvdmUoKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gdGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCA+PSAwOyB9XHJcbiAgICAvKiogQm9vbGVhbiByZXByZXNlbnRpbmcgaWYgdGhlIHRvb2x0aXAgd2lsbCBmaXQgb24gc2NyZWVuIGJlbG93IHRoZSBlbGVtZW50ICovXHJcbiAgICBnZXQgY2FuU2hvd0JlbG93KCkgeyByZXR1cm4gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHRoaXMubm9kZS5vZmZzZXRIZWlnaHQgKyB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0IDw9IFV0aWxzLnNjcmVlbkhlaWdodDsgfVxyXG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiB0byB0aGUgbGVmdCBvZiB0aGUgZWxlbWVudCAqL1xyXG4gICAgZ2V0IGNhblNob3dMZWZ0KCkgeyByZXR1cm4gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSB0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggPj0gMDsgfVxyXG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiB0byB0aGUgcmlnaHQgb2YgdGhlIGVsZW1lbnQgKi9cclxuXHRnZXQgY2FuU2hvd1JpZ2h0KCkgeyByZXR1cm4gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyB0aGlzLm5vZGUub2Zmc2V0V2lkdGggKyB0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggPD0gVXRpbHMuc2NyZWVuV2lkdGg7IH1cclxuXHJcbiAgICAvKiogSGlkZXMgdGhlIHRvb2x0aXAuIEF1dG9tYXRpY2FsbHkgY2FsbGVkIG9uIG1vdXNlbGVhdmUuICovXHJcblx0aGlkZSgpIHtcclxuICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy50b29sdGlwRWxlbWVudC5jbGFzc05hbWUgPSB0aGlzLl9jbGFzc05hbWU7XHJcblx0fVxyXG5cclxuICAgIC8qKiBTaG93cyB0aGUgdG9vbHRpcC4gQXV0b21hdGljYWxseSBjYWxsZWQgb24gbW91c2VlbnRlci4gV2lsbCBhdHRlbXB0IHRvIGZsaXAgaWYgcG9zaXRpb24gd2FzIHdyb25nLiAqL1xyXG5cdHNob3coKSB7XHJcbiAgICAgICAgdGhpcy50b29sdGlwRWxlbWVudC5jbGFzc05hbWUgPSBgJHtnZXRUb29sdGlwQ2xhc3NlcygpLnRvb2x0aXB9ICR7Z2V0Q2xhc3ModGhpcy5zdHlsZSl9YDtcclxuXHRcdHRoaXMubGFiZWxFbGVtZW50LnRleHRDb250ZW50ID0gdGhpcy5sYWJlbDtcclxuXHRcdHRoaXMuY29udGFpbmVyLmFwcGVuZCh0aGlzLmVsZW1lbnQpO1xyXG5cclxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJ0b3BcIikge1xyXG5cdFx0XHRpZiAodGhpcy5jYW5TaG93QWJvdmUgfHwgKCF0aGlzLmNhblNob3dBYm92ZSAmJiB0aGlzLnByZXZlbnRGbGlwKSkgdGhpcy5zaG93QWJvdmUoKTtcclxuXHRcdFx0ZWxzZSB0aGlzLnNob3dCZWxvdygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJib3R0b21cIikge1xyXG5cdFx0XHRpZiAodGhpcy5jYW5TaG93QmVsb3cgfHwgKCF0aGlzLmNhblNob3dCZWxvdyAmJiB0aGlzLnByZXZlbnRGbGlwKSkgdGhpcy5zaG93QmVsb3coKTtcclxuXHRcdFx0ZWxzZSB0aGlzLnNob3dBYm92ZSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJsZWZ0XCIpIHtcclxuXHRcdFx0aWYgKHRoaXMuY2FuU2hvd0xlZnQgfHwgKCF0aGlzLmNhblNob3dMZWZ0ICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dMZWZ0KCk7XHJcblx0XHRcdGVsc2UgdGhpcy5zaG93UmlnaHQoKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5zaWRlID09IFwicmlnaHRcIikge1xyXG5cdFx0XHRpZiAodGhpcy5jYW5TaG93UmlnaHQgfHwgKCF0aGlzLmNhblNob3dSaWdodCAmJiB0aGlzLnByZXZlbnRGbGlwKSkgdGhpcy5zaG93UmlnaHQoKTtcclxuXHRcdFx0ZWxzZSB0aGlzLnNob3dMZWZ0KCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuICAgIC8qKiBGb3JjZSBzaG93aW5nIHRoZSB0b29sdGlwIGFib3ZlIHRoZSBub2RlLiAqL1xyXG5cdHNob3dBYm92ZSgpIHtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhcInRvcFwiKSk7XHJcblx0XHR0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJ0b3BcIiwgdG9QeCh0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gdGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCAtIDEwKSk7XHJcblx0XHR0aGlzLmNlbnRlckhvcml6b250YWxseSgpO1xyXG5cdH1cclxuXHJcbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCBiZWxvdyB0aGUgbm9kZS4gKi9cclxuXHRzaG93QmVsb3coKSB7XHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJib3R0b21cIikpO1xyXG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwidG9wXCIsIHRvUHgodGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHRoaXMubm9kZS5vZmZzZXRIZWlnaHQgKyAxMCkpO1xyXG5cdFx0dGhpcy5jZW50ZXJIb3Jpem9udGFsbHkoKTtcclxuXHR9XHJcblxyXG4gICAgLyoqIEZvcmNlIHNob3dpbmcgdGhlIHRvb2x0aXAgdG8gdGhlIGxlZnQgb2YgdGhlIG5vZGUuICovXHJcblx0c2hvd0xlZnQoKSB7XHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJsZWZ0XCIpKTtcclxuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcImxlZnRcIiwgdG9QeCh0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCAtIDEwKSk7XHJcblx0XHR0aGlzLmNlbnRlclZlcnRpY2FsbHkoKTtcclxuXHR9XHJcblxyXG4gICAgLyoqIEZvcmNlIHNob3dpbmcgdGhlIHRvb2x0aXAgdG8gdGhlIHJpZ2h0IG9mIHRoZSBub2RlLiAqL1xyXG5cdHNob3dSaWdodCgpIHtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhcInJpZ2h0XCIpKTtcclxuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcImxlZnRcIiwgdG9QeCh0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCArIHRoaXMubm9kZS5vZmZzZXRXaWR0aCArIDEwKSk7XHJcblx0XHR0aGlzLmNlbnRlclZlcnRpY2FsbHkoKTtcclxuXHR9XHJcblxyXG5cdGNlbnRlckhvcml6b250YWxseSgpIHtcclxuICAgICAgICBjb25zdCBub2RlY2VudGVyID0gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyAodGhpcy5ub2RlLm9mZnNldFdpZHRoIC8gMik7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwibGVmdFwiLCB0b1B4KG5vZGVjZW50ZXIgLSAodGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoIC8gMikpKTtcclxuXHR9XHJcblxyXG5cdGNlbnRlclZlcnRpY2FsbHkoKSB7XHJcblx0XHRjb25zdCBub2RlY2VudGVyID0gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArICh0aGlzLm5vZGUub2Zmc2V0SGVpZ2h0IC8gMik7XHJcblx0XHR0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJ0b3BcIiwgdG9QeChub2RlY2VudGVyIC0gKHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQgLyAyKSkpO1xyXG5cdH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBUb29sdGlwIGZyb20gXCIuL3Rvb2x0aXBcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIGNvbnN0IHtzdHlsZSA9IFwiYmxhY2tcIiwgc2lkZSA9IFwidG9wXCIsIHRleHQgPSBcIlwifSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgdGhpcy5ub2RlID0gQkRWMi5yZWFjdERvbS5maW5kRE9NTm9kZSh0aGlzKTtcclxuICAgICAgICB0aGlzLnRvb2x0aXAgPSBuZXcgVG9vbHRpcCh0aGlzLm5vZGUsIHRleHQsIHtzdHlsZSwgc2lkZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMudG9vbHRpcDtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1hTdmcgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcInN2Z1wiLFxyXG4gICAgICAgICAgICB7eG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgdmlld0JveDogXCIwIDAgMTIgMTJcIiwgc3R5bGU6IHt3aWR0aDogXCIxOHB4XCIsIGhlaWdodDogXCIxOHB4XCJ9fSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJnXCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJhY2tncm91bmRcIiwgZmlsbDogXCJub25lXCIsIGZpbGxSdWxlOiBcImV2ZW5vZGRcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtkOiBcIk0wIDBoMTJ2MTJIMFwifSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtjbGFzc05hbWU6IFwiZmlsbFwiLCBmaWxsOiBcIiNkY2RkZGVcIiwgZDogXCJNOS41IDMuMjA1TDguNzk1IDIuNSA2IDUuMjk1IDMuMjA1IDIuNWwtLjcwNS43MDVMNS4yOTUgNiAyLjUgOC43OTVsLjcwNS43MDVMNiA2LjcwNSA4Ljc5NSA5LjVsLjcwNS0uNzA1TDYuNzA1IDZcIn0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY3J5cHRvXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZWN0cm9uXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImV2ZW50c1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJmc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJtb2R1bGVcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibm9kZS1mZXRjaFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJwYXRoXCIpOyJdLCJzb3VyY2VSb290IjoiIn0=