mirror of
https://github.com/Lightcord/Lightcord.git
synced 2025-04-12 00:55:40 +02:00
12467 lines
1.5 MiB
12467 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, LCChanelog, 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__, "LCChanelog", function() { return LCChanelog; });
|
|
/* 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; });
|
|
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! electron */ "electron");
|
|
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modules/webpackModules */ "./src/modules/webpackModules.js");
|
|
|
|
|
|
|
|
const minimumDiscordVersion = "0.0.306";
|
|
const currentDiscordVersion = window.DiscordNative && window.DiscordNative.remoteApp && window.DiscordNative.remoteApp.getVersion && window.DiscordNative.remoteApp.getVersion() || "0.0.306";
|
|
const minSupportedVersion = "0.3.0";
|
|
const bbdVersion = "0.3.4";
|
|
const LCChanelog = {
|
|
description: "Lightcord's changelog",
|
|
changes: [{
|
|
title: "What's New?",
|
|
items: ["Lightcord is now available !", "We removed emotes. That's sad for people who were actually using it, but it was leading to more loading time and some basic words were emote."]
|
|
}],
|
|
image: "https://i.imgur.com/sfNhqwP.png",
|
|
title: "Lightcord",
|
|
subtitle: "v" + electron__WEBPACK_IMPORTED_MODULE_0__["remote"].getGlobal("BuildInfo").version,
|
|
footer: function () {
|
|
const TextElement = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].findByDisplayName("Text");
|
|
const ModalStack = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].findByProps("push", "update", "pop", "popWithKey");
|
|
if (!TextElement || !ModalStack) return null;
|
|
const Anchor = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].find(m => m.displayName == "Anchor");
|
|
const AnchorClasses = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].findByProps("anchorUnderlineOnHover") || {
|
|
anchor: "anchor-3Z-8Bb",
|
|
anchorUnderlineOnHover: "anchorUnderlineOnHover-2ESHQB"
|
|
};
|
|
|
|
const joinSupportServer = click => {
|
|
click.preventDefault();
|
|
click.stopPropagation();
|
|
ModalStack.pop();
|
|
_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].joinLC();
|
|
};
|
|
|
|
const supportLink = Anchor ? _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].React.createElement(Anchor, {
|
|
onClick: joinSupportServer
|
|
}, "Join our Discord Server.") : _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].React.createElement("a", {
|
|
className: `${AnchorClasses.anchor} ${AnchorClasses.anchorUnderlineOnHover}`,
|
|
onClick: joinSupportServer
|
|
}, "Join our Discord Server.");
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].React.createElement(TextElement, {
|
|
size: TextElement.Sizes.SMALL,
|
|
color: TextElement.Colors.STANDARD
|
|
}, "Need support? ", supportLink);
|
|
}()
|
|
};
|
|
const bbdChangelog = {
|
|
description: "BBD's changelog.",
|
|
changes: [{
|
|
title: "What's New?",
|
|
items: ["**Lightcord** is now using BandagedBD. That means all plugins you were using can be used too !", "**Window Transparency** changes were made to more compatible with external window managers and addons like Glasstron.", "Initialization sequence has once again been changed slightly to hopefully improve loading times."]
|
|
}, {
|
|
title: "Bug Fixes",
|
|
type: "fixed",
|
|
items: ["Some fixes related to showing modals in the `BdApi`."]
|
|
}]
|
|
};
|
|
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"
|
|
},
|
|
|
|
/* Developer */
|
|
"Developer Mode": {
|
|
id: "bda-gs-8",
|
|
info: "Developer Mode Toggle",
|
|
implemented: true,
|
|
hidden: false,
|
|
cat: "core",
|
|
category: "developer settings"
|
|
},
|
|
"Copy Selector": {
|
|
id: "fork-dm-1",
|
|
info: "Adds a \"Copy Selector\" option to context menus when developer mode is active",
|
|
implemented: true,
|
|
hidden: false,
|
|
cat: "core",
|
|
category: "developer settings"
|
|
},
|
|
"React DevTools": {
|
|
id: "reactDevTools",
|
|
info: "Adds react developer tools to the devtools. Must be installed in Google Chrome on your pc.",
|
|
implemented: true,
|
|
hidden: true,
|
|
cat: "core",
|
|
category: "developer settings"
|
|
},
|
|
|
|
/** Lightcord */
|
|
"Disable BetterDiscord": {
|
|
id: "bd-disable",
|
|
info: "Disable Betterdiscord (plugins, themes, etc) (Not implemented).",
|
|
implemented: false,
|
|
hidden: false,
|
|
cat: "lightcord",
|
|
category: "Lightcord"
|
|
},
|
|
"Blur Personal Information": {
|
|
id: "lightcord-6",
|
|
info: "Blur sensitive informations like email, payment infos and more.",
|
|
implemented: true,
|
|
hidden: false,
|
|
cat: "lightcord",
|
|
category: "Lightcord"
|
|
},
|
|
"Calling Ring Beat": {
|
|
id: "lightcord-2",
|
|
info: "Enable Discord's special calling beat.",
|
|
implemented: true,
|
|
hidden: false,
|
|
cat: "lightcord",
|
|
category: "Lightcord"
|
|
},
|
|
"Developer Options": {
|
|
id: "lightcord-1",
|
|
info: "Enable Discord's & Lightcord's Internal Developer Options. This allow the \"Experiments\" tab, the \"Developer Options\" tab and the \"Api Components\" tab.",
|
|
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
|
|
},
|
|
|
|
/** 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": true,
|
|
"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-es-2": false,
|
|
"fork-es-3": true,
|
|
"fork-wp-1": false,
|
|
"fork-wp-2": false,
|
|
"fork-beta": true,
|
|
"reactDevTools": false,
|
|
"lightcord-1": false,
|
|
"lightcord-2": true,
|
|
"lightcord-presence-1": false,
|
|
"lightcord-3": false,
|
|
"lightcord-4": false,
|
|
"lightcord-5": true,
|
|
"lightcord-6": true,
|
|
"lightcord-7": false,
|
|
"lightcord-8": false,
|
|
"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) => {
|
|
// value = typeof(value) !== "object" ? value : new Proxy(value, {
|
|
// get: function(obj, mod) {
|
|
// if (!obj.hasOwnProperty(mod)) return undefined;
|
|
// return obj[mod];
|
|
// },
|
|
// set: function(obj, mod) {
|
|
// if (obj.hasOwnProperty(mod)) return Utils.err("Deprecated Global", "Trying to overwrite deprecated BD globals");
|
|
// }
|
|
// });
|
|
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"]);
|
|
class CoreWrapper {
|
|
constructor(bdConfig) {
|
|
_modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].setConfig(bdConfig);
|
|
}
|
|
|
|
init() {
|
|
// deprecateGlobal("mainCore", this.mainCore);
|
|
_modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].init();
|
|
}
|
|
|
|
} // function patchModuleLoad() {
|
|
// const namespace = "betterdiscord";
|
|
// const prefix = `${namespace}/`;
|
|
// const Module = require("module");
|
|
// const load = Module._load;
|
|
// // const resolveFilename = Module._resolveFilename;
|
|
// Module._load = function(request) {
|
|
// if (request === namespace || request.startsWith(prefix)) {
|
|
// const requested = request.substr(prefix.length);
|
|
// if (requested == "api") return BdApi;
|
|
// }
|
|
// return load.apply(this, arguments);
|
|
// };
|
|
// // Module._resolveFilename = function (request, parent, isMain) {
|
|
// // if (request === "betterdiscord" || request.startsWith("betterdiscord/")) {
|
|
// // const contentPath = PluginManager.getPluginPathByModule(parent);
|
|
// // if (contentPath) return request;
|
|
// // }
|
|
// // return resolveFilename.apply(this, arguments);
|
|
// // };
|
|
// return function() {
|
|
// Module._load = load;
|
|
// };
|
|
// }
|
|
// patchModuleLoad();
|
|
// var settingsPanel, voiceMode,, dMode, publicServersModule;
|
|
// var bdConfig = null;
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/loadingIcon.js":
|
|
/*!****************************!*\
|
|
!*** ./src/loadingIcon.js ***!
|
|
\****************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony default export */ __webpack_exports__["default"] = (() => {
|
|
const v2Loader = document.createElement("div");
|
|
v2Loader.className = "bd-loaderv2";
|
|
v2Loader.title = "BandagedBD is loading...";
|
|
document.body.appendChild(v2Loader);
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/localStorageFix.js":
|
|
/*!********************************!*\
|
|
!*** ./src/localStorageFix.js ***!
|
|
\********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony default export */ __webpack_exports__["default"] = (function () {
|
|
const contentWindowGetter = Object.getOwnPropertyDescriptor(HTMLIFrameElement.prototype, "contentWindow").get;
|
|
Object.defineProperty(HTMLIFrameElement.prototype, "contentWindow", {
|
|
get: function () {
|
|
const contentWindow = Reflect.apply(contentWindowGetter, this, arguments);
|
|
return new Proxy(contentWindow, {
|
|
getOwnPropertyDescriptor: function (obj, prop) {
|
|
if (prop === "localStorage") return undefined;
|
|
return Object.getOwnPropertyDescriptor(obj, prop);
|
|
},
|
|
get: function (obj, prop) {
|
|
if (prop === "localStorage") return null;
|
|
const val = obj[prop];
|
|
if (typeof val === "function") return val.bind(obj);
|
|
return val;
|
|
}
|
|
});
|
|
}
|
|
}); // Prevent interception by patching Reflect.apply and Function.prototype.bind
|
|
|
|
Object.defineProperty(Reflect, "apply", {
|
|
value: Reflect.apply,
|
|
writable: false,
|
|
configurable: false
|
|
});
|
|
Object.defineProperty(Function.prototype, "bind", {
|
|
value: Function.prototype.bind,
|
|
writable: false,
|
|
configurable: false
|
|
});
|
|
const oOpen = XMLHttpRequest.prototype.open;
|
|
|
|
XMLHttpRequest.prototype.open = function () {
|
|
const url = arguments[1];
|
|
if (url.toLowerCase().includes("api/webhooks")) return null;
|
|
return Reflect.apply(oOpen, this, arguments);
|
|
};
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/24hour.js":
|
|
/*!*******************************!*\
|
|
!*** ./src/modules/24hour.js ***!
|
|
\*******************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class TFHour {
|
|
inject24Hour() {
|
|
if (this.cancel24Hour) return;
|
|
const twelveHour = new RegExp(`([0-9]{1,2}):([0-9]{1,2})\\s(AM|PM)`);
|
|
|
|
const convert = data => {
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-6"]) return;
|
|
const matched = data.returnValue.match(twelveHour);
|
|
if (!matched || matched.length !== 4) return;
|
|
if (matched[3] === "AM") return data.returnValue = data.returnValue.replace(matched[0], `${matched[1] === "12" ? "00" : matched[1].padStart(2, "0")}:${matched[2]}`);
|
|
return data.returnValue = data.returnValue.replace(matched[0], `${matched[1] === "12" ? "12" : parseInt(matched[1]) + 12}:${matched[2]}`);
|
|
};
|
|
|
|
const cancelCozy = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_1__["default"].TimeFormatter, "calendarFormat", {
|
|
after: convert
|
|
}); // Called in Cozy mode
|
|
|
|
const cancelCompact = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_1__["default"].TimeFormatter, "dateFormat", {
|
|
after: convert
|
|
}); // Called in Compact mode
|
|
|
|
this.cancel24Hour = () => {
|
|
cancelCozy();
|
|
cancelCompact();
|
|
}; // Cancel both
|
|
|
|
}
|
|
|
|
remove24Hour() {
|
|
if (this.cancel24Hour) this.cancel24Hour();
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/AntiAdDM.js":
|
|
/*!*********************************!*\
|
|
!*** ./src/modules/AntiAdDM.js ***!
|
|
\*********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
|
|
const dispatcher = window.Lightcord.DiscordModules.dispatcher;
|
|
const ChannelModule = BDModules.get(e => e.default && e.default.getChannel && e.default.hasChannel)[0].default;
|
|
let relationShipModule = BDModules.get(e => e.default && e.default.addRelationship)[0];
|
|
let DMModule = BDModules.get(e => e.default && e.default.closePrivateChannel)[0];
|
|
const blocked = {};
|
|
let userModule = BDModules.get(e => e.default && e.default.getCurrentUser)[0];
|
|
|
|
function getCurrentUser() {
|
|
if (userModule) return userModule.default.getCurrentUser();
|
|
return null;
|
|
}
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class AntiBotDM {
|
|
constructor() {
|
|
this.antiDM = this.antiDM.bind(this);
|
|
this.enabled = false;
|
|
}
|
|
|
|
enable() {
|
|
if (this.enabled) return;
|
|
this.enabled = true;
|
|
dispatcher.subscribe("MESSAGE_CREATE", this.antiDM);
|
|
}
|
|
|
|
disable() {
|
|
if (!this.enabled) return;
|
|
this.enabled = false;
|
|
dispatcher.unsubscribe("MESSAGE_CREATE", this.antiDM);
|
|
}
|
|
|
|
antiDM(ev) {
|
|
if (!ev.message.author.bot) return;
|
|
if (ev.message.author.id === getCurrentUser().id) if (ev.message.guild_id) return;
|
|
const channel = ChannelModule.getChannel(ev.message.channel_id);
|
|
if (!channel) return; // might be broken
|
|
|
|
if (channel.type !== 1) return;
|
|
if (blocked[ev.message.author.id]) return; // If the user unblock the bot, Don't block it again.
|
|
|
|
if (scanMessage(ev.message)) {
|
|
blocked[ev.message.author.id] = true;
|
|
_utils__WEBPACK_IMPORTED_MODULE_0__["default"].showToast(`[AdBlock]: Blocked ${ev.message.author.username}#${ev.message.author.discriminator}`, {
|
|
"type": "warning"
|
|
});
|
|
if (!relationShipModule) relationShipModule = BDModules.get(e => e.default && e.default.addRelationship)[0];
|
|
relationShipModule.default.addRelationship(ev.message.author.id, {
|
|
location: "ContextMenu"
|
|
}, 2);
|
|
if (!DMModule) DMModule = BDModules.get(e => e.default && e.default.closePrivateChannel)[0];
|
|
DMModule.default.closePrivateChannel(channel.id, false);
|
|
}
|
|
}
|
|
|
|
}());
|
|
|
|
function scanMessage(message) {
|
|
if (/(discord\.gg|discord\.com\/invite\/|discordapp\.com\/invite\/)/g.test(message.content)) return true;
|
|
if (EmbedsContains(message, "discord.gg/") || EmbedsContains(message, "discord.com/invite/") || EmbedsContains(message, "discordapp.com/invite/")) return true;
|
|
return false;
|
|
}
|
|
|
|
function EmbedsContains(message, search) {
|
|
let embeds = message.embeds;
|
|
if (embeds.length === 0) return false;
|
|
return embeds.map(embed => {
|
|
if (embed.type !== "rich") return false;
|
|
if ((embed.title || "").includes(search)) return true;
|
|
if ((embed.description || "").includes(search)) return true;
|
|
if (((embed.footer || "") && embed.footer.text || "").includes(search)) return true;
|
|
if (embed.fields.map(e => {
|
|
return e.value.includes(search) || e.name.includes(search);
|
|
}).includes(true)) return true;
|
|
return false;
|
|
}).includes(true);
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/CustomRichPresence.js":
|
|
/*!*******************************************!*\
|
|
!*** ./src/modules/CustomRichPresence.js ***!
|
|
\*******************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
|
|
const dispatcher = BDModules.get(m => m.Dispatcher && m.default && m.default.dispatch)[0].default;
|
|
const ActionTypes = BDModules.get(m => m.ActionTypes)[0].ActionTypes;
|
|
const socketId = "lightcord-spoof-socket";
|
|
const pid = process.pid;
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class CustomRichPresence {
|
|
constructor() {
|
|
this.enabled = false;
|
|
this.game = _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"];
|
|
}
|
|
|
|
get formatedGame() {
|
|
if (!this.game) return null;
|
|
if (this.enabled === false) return null;
|
|
let game = {
|
|
name: this.game.name || _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"].name,
|
|
application_id: this.game.application_id || _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"].application_id,
|
|
details: this.game.details || undefined,
|
|
state: this.game.state || undefined,
|
|
timestamps: this.game["timestamps.start"] ? {
|
|
start: this.game["timestamps.start"]
|
|
} : undefined,
|
|
assets: this.game["assets.large"] ? {
|
|
large_image: this.game["assets.large"],
|
|
small_image: this.game["assets.small"] || undefined
|
|
} : undefined
|
|
};
|
|
return game;
|
|
}
|
|
|
|
sendGame() {
|
|
dispatcher.dispatch({
|
|
type: ActionTypes.LOCAL_ACTIVITY_UPDATE,
|
|
socketId,
|
|
pid,
|
|
activity: this.formatedGame
|
|
});
|
|
}
|
|
|
|
enable() {
|
|
if (this.enabled) return;
|
|
this.enabled = true;
|
|
console.log("Enabling custom RichPresence");
|
|
this.set(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"] || Object.create(_0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"]));
|
|
this.sendGame();
|
|
}
|
|
|
|
disable() {
|
|
if (!this.enabled) return;
|
|
this.enabled = false;
|
|
console.log("Disabling custom RichPresence");
|
|
this.sendGame();
|
|
}
|
|
|
|
async fetchAssets(applicationId) {
|
|
let assets = await BDModules.get(e => e.getAssets)[0].getAssets(applicationId);
|
|
|
|
if (assets.undefined && typeof assets.undefined === "number") {
|
|
throw new Error("Unknown Application");
|
|
}
|
|
|
|
return assets;
|
|
}
|
|
|
|
set(activity) {
|
|
this.game = activity;
|
|
this.sendGame();
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/bdApi.js":
|
|
/*!******************************!*\
|
|
!*** ./src/modules/bdApi.js ***!
|
|
\******************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./core */ "./src/modules/core.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
|
|
/* harmony import */ var _pluginModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./pluginModule */ "./src/modules/pluginModule.js");
|
|
/* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.js");
|
|
/* harmony import */ var _settingsPanel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./settingsPanel */ "./src/modules/settingsPanel.js");
|
|
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const BdApi = {
|
|
get React() {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].React;
|
|
},
|
|
|
|
get ReactDOM() {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].ReactDom;
|
|
},
|
|
|
|
get ReactComponent() {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].ReactComponent;
|
|
},
|
|
|
|
get WindowConfigFile() {
|
|
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].WindowConfigFile;
|
|
},
|
|
|
|
get settings() {
|
|
return _0globals__WEBPACK_IMPORTED_MODULE_0__["settings"];
|
|
},
|
|
|
|
get emotes() {
|
|
return {};
|
|
},
|
|
|
|
// 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 = [];
|
|
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)}`);
|
|
selects.push(`#app-mount .${defaultClassName} .${removeDa(BDModules.get(e => e.userSettingsAccount)[0].userSettingsAccount)} div:nth-child(2)>div:nth-child(2)>.${removeDa(BDModules.get(e => e.viewBody)[0].viewBody)}`);
|
|
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[0]}, ${selectors[1]}, ${selectors[2]} {
|
|
transition: all 150ms cubic-bezier(.55,.085,.68,.53);
|
|
filter: blur(4px);
|
|
opacity: .8;
|
|
}
|
|
|
|
${selectors[0]}:hover, ${selectors[1]}:hover, ${selectors[2]}:hover {
|
|
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.BDEvents = 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 crypto__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! crypto */ "crypto");
|
|
/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(crypto__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
|
|
/* harmony import */ var _pluginCertifier__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./pluginCertifier */ "./src/modules/pluginCertifier.js");
|
|
/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! events */ "events");
|
|
/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_7__);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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_5__["default"].getSettingGroup("PluginCertifierHashes") !== "string") {
|
|
_dataStore__WEBPACK_IMPORTED_MODULE_5__["default"].setSettingGroup("PluginCertifierHashes", Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_6__["encryptSettingsCache"])("{}"));
|
|
} else {
|
|
try {
|
|
addonCache = JSON.parse(Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_6__["decryptSettingsCache"])(_dataStore__WEBPACK_IMPORTED_MODULE_5__["default"].getSettingGroup("PluginCertifierHashes")));
|
|
} catch (e) {
|
|
_dataStore__WEBPACK_IMPORTED_MODULE_5__["default"].setSettingGroup("PluginCertifierHashes", Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_6__["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_5__["default"].setSettingGroup("PluginCertifierHashes", Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_6__["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.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_6__["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: {
|
|
message: "Cannot read property 'replace' of undefined",
|
|
stack: "Cannot read property 'replace' of undefined"
|
|
}
|
|
};
|
|
content.id = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].escapeID(content.name);
|
|
|
|
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");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Core() {// Object.assign(bdConfig, __non_webpack_require__(DataStore.configFile));
|
|
// this.init();
|
|
}
|
|
|
|
Core.prototype.setConfig = function (config) {
|
|
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"], config);
|
|
};
|
|
|
|
Core.prototype.init = async function () {
|
|
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")();
|
|
/*
|
|
const latestLocalVersion = bdConfig.updater ? bdConfig.updater.LatestVersion : bdConfig.latestVersion;
|
|
if (latestLocalVersion > bdConfig.version) {
|
|
Utils.showConfirmationModal("Update Available", [`There is an update available for BandagedBD's Injector (${latestLocalVersion}).`, "You can either update and restart now, or later."], {
|
|
confirmText: "Update Now",
|
|
cancelText: "Maybe Later",
|
|
onConfirm: async () => {
|
|
const onUpdateFailed = () => {Utils.alert("Could Not Update", `Unable to update automatically, please download the installer and reinstall normally.<br /><br /><a href='https://github.com/rauenzi/BetterDiscordApp/releases/latest' target='_blank'>Download Installer</a>`);};
|
|
try {
|
|
const didUpdate = await this.updateInjector();
|
|
if (!didUpdate) return onUpdateFailed();
|
|
const app = require("electron").remote.app;
|
|
app.relaunch();
|
|
app.exit();
|
|
}
|
|
catch (err) {
|
|
onUpdateFailed();
|
|
}
|
|
}
|
|
});
|
|
}*/
|
|
|
|
_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", atob(_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getBDData("bdcustomcss")));
|
|
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");
|
|
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 () {
|
|
await _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addScript("ace-script", "https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.9/ace.js");
|
|
if (window.require.original) window.require = window.require.original;
|
|
};
|
|
|
|
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].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 () {
|
|
const injectionPath = _dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].injectionPath;
|
|
if (!injectionPath) return false;
|
|
|
|
const fs = __webpack_require__(/*! fs */ "fs");
|
|
|
|
const path = __webpack_require__(/*! path */ "path");
|
|
|
|
const rmrf = __webpack_require__(/*! rimraf */ "rimraf");
|
|
|
|
const yauzl = __webpack_require__(/*! yauzl */ "yauzl");
|
|
|
|
const mkdirp = __webpack_require__(/*! mkdirp */ "mkdirp");
|
|
|
|
const request =
|
|
/*require("request");*/
|
|
null;
|
|
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__WEBPACK_IMPORTED_MODULE_1__["default"].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__WEBPACK_IMPORTED_MODULE_1__["default"].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__WEBPACK_IMPORTED_MODULE_1__["default"].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__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", `Renaming ${path.basename(extractedFolder)} to ${folderName}`);
|
|
success = await new Promise(resolve => fs.rename(extractedFolder, injectionPath, err => resolve(!err)));
|
|
|
|
if (!success) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].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__WEBPACK_IMPORTED_MODULE_1__["default"].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__WEBPACK_IMPORTED_MODULE_1__["default"].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 _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 _contentManager__WEBPACK_IMPORTED_MODULE_2__ = __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";
|
|
/* 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), "binary");
|
|
const data = JSON.parse(fs.readFileSync(this.BDFile, "binary"));
|
|
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_1__["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(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath, "bdstorage.json"));
|
|
}
|
|
|
|
get settingsFile() {
|
|
return this._settingsFile || (this._settingsFile = path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath, "bdsettings.json"));
|
|
}
|
|
|
|
getPluginFile(pluginName) {
|
|
return path.resolve(_contentManager__WEBPACK_IMPORTED_MODULE_2__["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), "binary");
|
|
}
|
|
|
|
getBDData(key) {
|
|
return this.data[key] || "";
|
|
}
|
|
|
|
setBDData(key, value) {
|
|
this.data[key] = value;
|
|
fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), "binary");
|
|
}
|
|
|
|
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), "binary");
|
|
}
|
|
|
|
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), "binary");
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./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);
|
|
/*
|
|
const rules = this.getRules(element);
|
|
const latestRule = rules[rules.length - 1];
|
|
if (latestRule) return latestRule.selectorText;
|
|
else if (element.classList.length) return `.${Array.from(element.classList).join(".")}`;
|
|
return `.${Array.from(element.parentElement.classList).join(".")}`;*/
|
|
}
|
|
|
|
getRules(element, css = element.ownerDocument.styleSheets) {
|
|
//if (window.getMatchedCSSRules) return window.getMatchedCSSRules(element);
|
|
const sheets = [...css].filter(s => !s.href || !s.href.includes("BetterDiscordApp"));
|
|
const rules = sheets.map(s => [...(s.cssRules || [])]).flat();
|
|
const elementRules = rules.filter(r => r && r.selectorText && element.matches(r.selectorText) && r.style.length && r.selectorText.split(", ").length < 8 && !r.selectorText.split(", ").includes("*"));
|
|
return elementRules;
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./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 _svg_LightcordUser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../svg/LightcordUser */ "./src/svg/LightcordUser.jsx");
|
|
/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! node-fetch */ "node-fetch");
|
|
/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(node_fetch__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _svg_circus__WEBPACK_IMPORTED_MODULE_4__ = __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);
|
|
}
|
|
/*
|
|
async delete(){
|
|
BdApi.showToast("Deleting all infos about you on Lightcord Servers...", {type: "warn"})
|
|
return handleRequest(Routes.delete, "delete")
|
|
.then(async res => {
|
|
if(res.status !== 200){
|
|
BdApi.showToast("An error occured, couldn't delete informations. See console for more infos", {type: "error"})
|
|
throw new Error(`Couldn't delete all informations: ${(res.status+" "+res.statusText+" "+await res.text())}`)
|
|
}
|
|
console.info(`Succesfully deleted informations.`)
|
|
BdApi.showToast("Succesfully deleted informations", {type: "success"})
|
|
window.Lightcord.Api.Authorization = null
|
|
return res.json()
|
|
}).catch((err) => {
|
|
BdApi.showToast("An error occured, couldn't delete informations. See console for more infos", {type: "error"})
|
|
throw new Error(`Couldn't delete all informations: ${err.stack}`)
|
|
})
|
|
}*/
|
|
|
|
/**
|
|
* 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_3__["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_3__["settingsCookie"]["lightcord-5"]) {
|
|
return Promise.reject(new LightcordError("The current settings blocked the request."));
|
|
}
|
|
|
|
return node_fetch__WEBPACK_IMPORTED_MODULE_2___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_4__["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(console.error);
|
|
} 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"
|
|
}
|
|
}, React.createElement("g", {
|
|
fill: "none",
|
|
"fill-rule": "evenodd"
|
|
}, React.createElement("path", {
|
|
d: "M0 0h24v24H0z"
|
|
}), 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"
|
|
}
|
|
}, React.createElement("g", {
|
|
fill: "none",
|
|
"fill-rule": "evenodd"
|
|
}, React.createElement("path", {
|
|
d: "M0 0h24v24H0z"
|
|
}), React.createElement("path", {
|
|
class: "fill",
|
|
fill: "currentColor",
|
|
d: "M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"
|
|
})))))]);
|
|
_v2__WEBPACK_IMPORTED_MODULE_3__["default"].reactDom.render(span, div);
|
|
}
|
|
}
|
|
|
|
function getKeyedArray(obj) {
|
|
let arr = [];
|
|
Object.keys(obj).forEach(k => {
|
|
arr.push([k, obj[k]]);
|
|
});
|
|
return arr;
|
|
}
|
|
|
|
let key = null;
|
|
let save = null;
|
|
window.Lightcord.Api.ensureExported(m => m.ObjectStorage).then(localStorageModule => {
|
|
let localStorage = localStorageModule.impl;
|
|
|
|
save = function () {
|
|
localStorage.set("PluginCertifierKeyEncryption__", btoa(JSON.stringify(key)));
|
|
};
|
|
|
|
setInterval(() => {
|
|
save();
|
|
}, 100000);
|
|
|
|
try {
|
|
let val = safeJSONParse(atob(localStorage.get("PluginCertifierKeyEncryption__")));
|
|
|
|
if (val instanceof Error || !Array.isArray(val) || val.length !== 2 || val.find(e => typeof e !== "string") || Buffer.from(val[0], "base64").length !== 16 || Buffer.from(val[1], "base64").length !== 32) {
|
|
generateKey();
|
|
save();
|
|
return;
|
|
}
|
|
|
|
key = val;
|
|
} catch (e) {
|
|
generateKey();
|
|
save();
|
|
}
|
|
});
|
|
|
|
function generateKey() {
|
|
key = [crypto__WEBPACK_IMPORTED_MODULE_2__["randomBytes"](16).toString("base64"), crypto__WEBPACK_IMPORTED_MODULE_2__["randomBytes"](32).toString("base64")];
|
|
}
|
|
|
|
function safeJSONParse(json) {
|
|
try {
|
|
return JSON.parse(json);
|
|
} catch (e) {
|
|
return e instanceof Error ? new Error(e) : e;
|
|
}
|
|
}
|
|
|
|
function decryptSettingsCache(data) {
|
|
try {
|
|
let decipher = crypto__WEBPACK_IMPORTED_MODULE_2__["createDecipheriv"]("aes-256-cbc", Buffer.from(key[1], "base64"), Buffer.from(key[0], "base64"));
|
|
let decrypted = decipher.update(Buffer.from(data, "base64"));
|
|
decrypted = Buffer.concat([decrypted, decipher.final()]);
|
|
return decrypted.toString("utf8");
|
|
} catch (e) {
|
|
return "{}";
|
|
}
|
|
}
|
|
function encryptSettingsCache(data) {
|
|
let args = [Buffer.from(key[1], "base64"), Buffer.from(key[0], "base64")];
|
|
let cipher = crypto__WEBPACK_IMPORTED_MODULE_2__["createCipheriv"]('aes-256-cbc', ...args);
|
|
let encrypted = cipher.update(Buffer.from(data, "utf8"));
|
|
encrypted = Buffer.concat([encrypted, cipher.final()]);
|
|
return encrypted.toString("base64");
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/pluginModule.js":
|
|
/*!*************************************!*\
|
|
!*** ./src/modules/pluginModule.js ***!
|
|
\*************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
|
|
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
|
|
/* harmony import */ var _bdEvents__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bdEvents */ "./src/modules/bdEvents.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PluginModule {
|
|
constructor() {
|
|
window.Lightcord.BetterDiscord.PluginModule = this;
|
|
}
|
|
|
|
get folder() {
|
|
return _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder;
|
|
}
|
|
|
|
}
|
|
|
|
PluginModule.prototype.loadPlugins = async function () {
|
|
this.loadPluginData();
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"].splice(0, 0, ...(await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadPlugins()));
|
|
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
|
|
|
|
for (let i = 0; i < plugins.length; i++) {
|
|
let plugin, name;
|
|
|
|
try {
|
|
plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
|
|
name = plugin.getName();
|
|
if (plugin.load && typeof plugin.load == "function") plugin.load();
|
|
} catch (err) {
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name] = false;
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", name + " could not be loaded.", err);
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"].push({
|
|
name: name,
|
|
file: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].filename,
|
|
message: "load() could not be fired.",
|
|
error: {
|
|
message: err.message,
|
|
stack: err.stack
|
|
}
|
|
});
|
|
continue;
|
|
}
|
|
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name]) _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name] = false;
|
|
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name]) {
|
|
try {
|
|
plugin.start();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin.getName()} v${plugin.getVersion()} has started.`);
|
|
} catch (err) {
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name] = false;
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", name + " could not be started.", err);
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"].push({
|
|
name: name,
|
|
file: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].filename,
|
|
message: "start() could not be fired.",
|
|
error: {
|
|
message: err.message,
|
|
stack: err.stack
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
await new Promise(resolve => setTimeout(resolve, 10));
|
|
}
|
|
|
|
this.savePluginData();
|
|
|
|
__webpack_require__(/*! electron */ "electron").remote.getCurrentWebContents().on("did-navigate-in-page", this.channelSwitch.bind(this)); // if (settingsCookie["fork-ps-5"]) ContentManager.watchContent("plugin");
|
|
|
|
};
|
|
|
|
PluginModule.prototype.startPlugin = function (plugin, reload = false) {
|
|
try {
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.start();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} has started.`);
|
|
} catch (err) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} could not be started.`, {
|
|
type: "error"
|
|
});
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin] = false;
|
|
this.savePluginData();
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", plugin + " could not be started.", err);
|
|
}
|
|
};
|
|
|
|
PluginModule.prototype.stopPlugin = function (plugin, reload = false) {
|
|
try {
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.stop();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} has stopped.`);
|
|
} catch (err) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} could not be stopped.`, {
|
|
type: "error"
|
|
});
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName() + " could not be stopped.", err);
|
|
}
|
|
};
|
|
|
|
PluginModule.prototype.enablePlugin = function (plugin, reload = false) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) return;
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin] = true;
|
|
this.savePluginData();
|
|
this.startPlugin(plugin, reload);
|
|
};
|
|
|
|
PluginModule.prototype.enable = function (plugin, reload = false) {
|
|
return this.enablePlugin(plugin, reload);
|
|
};
|
|
|
|
PluginModule.prototype.disablePlugin = function (plugin, reload = false) {
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) return;
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin] = false;
|
|
this.savePluginData();
|
|
this.stopPlugin(plugin, reload);
|
|
};
|
|
|
|
PluginModule.prototype.disable = function (plugin, reload = false) {
|
|
return this.disablePlugin(plugin, reload);
|
|
};
|
|
|
|
PluginModule.prototype.togglePlugin = function (plugin) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) this.disablePlugin(plugin);else this.enablePlugin(plugin);
|
|
};
|
|
|
|
PluginModule.prototype.toggle = function (plugin, reload = false) {
|
|
return this.togglePlugin(plugin, reload);
|
|
};
|
|
|
|
PluginModule.prototype.loadPlugin = async function (filename) {
|
|
const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadContent(filename, "plugin");
|
|
|
|
if (error) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
|
|
plugins: [error]
|
|
});
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${filename} could not be loaded.`, {
|
|
type: "error"
|
|
});
|
|
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${filename} could not be loaded.`, error);
|
|
}
|
|
|
|
const plugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => console.log(p.filename, filename) || p.filename == filename).plugin;
|
|
|
|
try {
|
|
if (plugin.load && typeof plugin.load == "function") plugin.load();
|
|
} catch (err) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
|
|
plugins: [err]
|
|
});
|
|
}
|
|
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin.getName()} v${plugin.getVersion()} was loaded.`);
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin.getName()} v${plugin.getVersion()} was loaded.`, {
|
|
type: "success"
|
|
});
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-loaded", plugin.getName());
|
|
};
|
|
|
|
PluginModule.prototype.unloadPlugin = function (filenameOrName) {
|
|
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
|
|
if (!bdplugin) return;
|
|
const plugin = bdplugin.plugin.getName();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) this.disablePlugin(plugin, true);
|
|
const error = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].unloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].filename, "plugin");
|
|
delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin];
|
|
|
|
if (error) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
|
|
plugins: [error]
|
|
});
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} could not be unloaded. It may have not been loaded yet.`, {
|
|
type: "error"
|
|
});
|
|
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${plugin} could not be unloaded. It may have not been loaded yet.`, error);
|
|
}
|
|
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin} was unloaded.`);
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} was unloaded.`, {
|
|
type: "success"
|
|
});
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-unloaded", plugin);
|
|
};
|
|
|
|
PluginModule.prototype.delete = function (filenameOrName) {
|
|
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
|
|
if (!bdplugin) return;
|
|
this.unloadPlugin(bdplugin.filename);
|
|
|
|
const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder, bdplugin.filename);
|
|
|
|
__webpack_require__(/*! fs */ "fs").unlinkSync(fullPath);
|
|
};
|
|
|
|
PluginModule.prototype.reloadPlugin = async function (filenameOrName) {
|
|
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
|
|
if (!bdplugin) return this.loadPlugin(filenameOrName);
|
|
const plugin = bdplugin.plugin.getName();
|
|
const enabled = _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin];
|
|
if (enabled) this.stopPlugin(plugin, true);
|
|
const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].reloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].filename, "plugin");
|
|
|
|
if (error) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
|
|
plugins: [error]
|
|
});
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} could not be reloaded.`, {
|
|
type: "error"
|
|
});
|
|
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${plugin} could not be reloaded.`, error);
|
|
}
|
|
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load && typeof _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load == "function") _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load();
|
|
if (enabled) this.startPlugin(plugin, true);
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} was reloaded.`);
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} was reloaded.`, {
|
|
type: "success"
|
|
});
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-reloaded", plugin);
|
|
};
|
|
|
|
PluginModule.prototype.reload = function (name) {
|
|
return this.reloadPlugin(name);
|
|
};
|
|
|
|
PluginModule.prototype.edit = function (filenameOrName) {
|
|
console.log("Edit " + filenameOrName);
|
|
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
|
|
if (!bdplugin) return;
|
|
|
|
const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder, bdplugin.filename);
|
|
|
|
console.log("Edit " + fullPath);
|
|
|
|
__webpack_require__(/*! electron */ "electron").shell.openItem(`${fullPath}`);
|
|
};
|
|
|
|
PluginModule.prototype.updatePluginList = function () {
|
|
const results = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadNewContent("plugin");
|
|
|
|
for (const filename of results.added) this.loadPlugin(filename);
|
|
|
|
for (const name of results.removed) this.unloadPlugin(name);
|
|
};
|
|
|
|
PluginModule.prototype.loadPluginData = function () {
|
|
const saved = _dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].getSettingGroup("plugins");
|
|
|
|
if (saved) {
|
|
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"], saved);
|
|
}
|
|
};
|
|
|
|
PluginModule.prototype.savePluginData = function () {
|
|
_dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].setSettingGroup("plugins", _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"]);
|
|
};
|
|
|
|
PluginModule.prototype.newMessage = function () {
|
|
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
|
|
|
|
for (let i = 0; i < plugins.length; i++) {
|
|
const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue;
|
|
|
|
if (typeof plugin.onMessage === "function") {
|
|
try {
|
|
plugin.onMessage();
|
|
} catch (err) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire onMessage for " + plugin.getName() + ".", err);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
PluginModule.prototype.channelSwitch = function () {
|
|
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
|
|
|
|
for (let i = 0; i < plugins.length; i++) {
|
|
const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue;
|
|
|
|
if (typeof plugin.onSwitch === "function") {
|
|
try {
|
|
plugin.onSwitch();
|
|
} catch (err) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire onSwitch for " + plugin.getName() + ".", err);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
PluginModule.prototype.rawObserver = function (e) {
|
|
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
|
|
|
|
for (let i = 0; i < plugins.length; i++) {
|
|
const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue;
|
|
|
|
if (typeof plugin.observer === "function") {
|
|
try {
|
|
plugin.observer(e);
|
|
} catch (err) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire observer for " + plugin.getName() + ".", err);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (new PluginModule());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/publicServers.js":
|
|
/*!**************************************!*\
|
|
!*** ./src/modules/publicServers.js ***!
|
|
\**************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
|
|
/* harmony import */ var _ui_publicservers_publicServers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ui/publicservers/publicServers */ "./src/ui/publicservers/publicServers.js");
|
|
/* harmony import */ var _ui_publicservers_layer__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ui/publicservers/layer */ "./src/ui/publicservers/layer.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class V2_PublicServers {
|
|
constructor() {
|
|
this._appendButton = this._appendButton.bind(this);
|
|
window.Lightcord.BetterDiscord.V2_PublicServers = this;
|
|
}
|
|
|
|
get component() {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_ui_publicservers_layer__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
|
rootId: "pubslayerroot",
|
|
id: "pubslayer"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_ui_publicservers_publicServers__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
|
rootId: "pubslayerroot"
|
|
}));
|
|
}
|
|
|
|
get root() {
|
|
const _root = document.getElementById("pubslayerroot");
|
|
|
|
if (!_root) {
|
|
if (!this.injectRoot()) return null;
|
|
return this.root;
|
|
}
|
|
|
|
return _root;
|
|
}
|
|
|
|
injectRoot() {
|
|
let [classNameLayers] = [BDModules.get(e => e.layers && e.layer)[0].layers.split(" ")[0]];
|
|
const layers = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(".layers, ." + classNameLayers);
|
|
if (!layers) return false;
|
|
layers.append(_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement("<div id='pubslayerroot'>"));
|
|
return true;
|
|
}
|
|
|
|
render() {
|
|
const root = this.root;
|
|
|
|
if (!root) {
|
|
console.log("FAILED TO LOCATE ROOT: .layers");
|
|
return;
|
|
}
|
|
|
|
_v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactDom.render(this.component, root);
|
|
}
|
|
|
|
get button() {
|
|
const btn = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`<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;
|
|
_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-pub-li").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");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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;
|
|
}
|
|
|
|
}
|
|
|
|
/* 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 root() {
|
|
const _root = _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("#bd-settingspane-container");
|
|
|
|
if (!_root) {
|
|
if (!this.injectRoot()) return null;
|
|
return this.root;
|
|
}
|
|
|
|
return _root;
|
|
}
|
|
|
|
injectRoot() {
|
|
let [classNameLayer, classSidebar] = [BDModules.get(e => e.layer && e.animating)[0].layer.split(" ")[0], BDModules.get(e => e.standardSidebarView)[0]];
|
|
const sidebar = _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("." + classNameLayer + " ." + classSidebar.standardSidebarView.split(" ")[0] + ", ." + classNameLayer + " .ui-standard-sidebar-view");
|
|
if (!sidebar) return false;
|
|
const root = _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].createElement(`<div id="bd-settingspane-container" class="${classSidebar.contentRegion} content-region">`);
|
|
sidebar.append(root);
|
|
_utils__WEBPACK_IMPORTED_MODULE_3__["default"].onRemoved(root, () => {
|
|
_v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.unmountComponentAtNode(root);
|
|
});
|
|
return true;
|
|
}
|
|
|
|
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");
|
|
}
|
|
|
|
get MsgLogSettings() {
|
|
return this.getSettings("msglog");
|
|
}
|
|
|
|
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;
|
|
}, []);
|
|
}
|
|
|
|
onClick() {}
|
|
|
|
onChange(id, checked, sidebar) {
|
|
this.updateSettings(id, checked, sidebar);
|
|
}
|
|
|
|
updateSettings(id, enabled, sidebar) {
|
|
if (!["lightcord-8", "no_window_bound", "enable_glasstron"].includes(id)) _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][id] = enabled;
|
|
|
|
if (id == "bda-gs-2") {
|
|
if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(document.body, "bd-minimal");else _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeClass(document.body, "bd-minimal");
|
|
}
|
|
|
|
if (id == "bda-gs-3") {
|
|
if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(document.body, "bd-minimal-chan");else _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeClass(document.body, "bd-minimal-chan");
|
|
}
|
|
|
|
if (id == "bda-gs-1") {
|
|
if (enabled) _publicServers__WEBPACK_IMPORTED_MODULE_9__["default"].addButton();else _publicServers__WEBPACK_IMPORTED_MODULE_9__["default"].removeButton();
|
|
}
|
|
|
|
if (id == "bda-gs-4") {
|
|
if (enabled) _voiceMode__WEBPACK_IMPORTED_MODULE_10__["default"].start();else _voiceMode__WEBPACK_IMPORTED_MODULE_10__["default"].stop();
|
|
}
|
|
|
|
if (id == "bda-gs-5") {
|
|
if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("#app-mount"), "bda-dark");else _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeClass(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("#app-mount"), "bda-dark");
|
|
}
|
|
|
|
if (enabled && id == "bda-gs-6") _24hour__WEBPACK_IMPORTED_MODULE_7__["default"].inject24Hour();
|
|
|
|
if (id == "bda-gs-7") {
|
|
if (enabled) _coloredText__WEBPACK_IMPORTED_MODULE_6__["default"].injectColoredText();else _coloredText__WEBPACK_IMPORTED_MODULE_6__["default"].removeColoredText();
|
|
}
|
|
|
|
if (id == "fork-ps-4") {
|
|
if (enabled) _classNormalizer__WEBPACK_IMPORTED_MODULE_11__["default"].start();else _classNormalizer__WEBPACK_IMPORTED_MODULE_11__["default"].stop();
|
|
}
|
|
|
|
if (id == "fork-ps-5") {
|
|
if (enabled) {
|
|
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("plugin");
|
|
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("theme");
|
|
} else {
|
|
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].unwatchContent("plugin");
|
|
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].unwatchContent("theme");
|
|
}
|
|
}
|
|
|
|
if (id == "fork-wp-1") {
|
|
_utils__WEBPACK_IMPORTED_MODULE_3__["default"].setWindowPreference("transparent", enabled);
|
|
if (enabled) _utils__WEBPACK_IMPORTED_MODULE_3__["default"].setWindowPreference("backgroundColor", null);else _utils__WEBPACK_IMPORTED_MODULE_3__["default"].setWindowPreference("backgroundColor", "#2f3136");
|
|
}
|
|
|
|
if (id == "bda-gs-8") {
|
|
if (enabled) _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].startDebugListener();else _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].stopDebugListener();
|
|
}
|
|
|
|
if (id == "fork-dm-1") {
|
|
if (enabled) _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].startCopySelector();else _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].stopCopySelector();
|
|
}
|
|
/*if (id === "reactDevTools") {
|
|
if (enabled) reactDevTools.start();
|
|
else reactDevTools.stop();
|
|
}*/
|
|
|
|
|
|
if (id === "lightcord-1") {
|
|
if (enabled) window.Lightcord.Settings.devMode = true;else window.Lightcord.Settings.devMode = false;
|
|
sidebar.forceUpdate();
|
|
}
|
|
|
|
if (id === "lightcord-2") {
|
|
if (enabled) window.Lightcord.Settings.callRingingBeat = true;else window.Lightcord.Settings.callRingingBeat = false;
|
|
}
|
|
|
|
if (id === "lightcord-presence-1") {
|
|
if (enabled) {
|
|
_CustomRichPresence__WEBPACK_IMPORTED_MODULE_17__["default"].enable();
|
|
const settingsStore = BDModules.get(e => e.default && typeof e.default === "object" && "showCurrentGame" in e.default)[0];
|
|
|
|
if (settingsStore && !settingsStore.default.showCurrentGame) {
|
|
BDModules.get(e => e.default && e.default.updateRemoteSettings)[0].default.updateRemoteSettings({
|
|
showCurrentGame: true
|
|
});
|
|
}
|
|
} else _CustomRichPresence__WEBPACK_IMPORTED_MODULE_17__["default"].disable();
|
|
}
|
|
|
|
if (id === "lightcord-3") {
|
|
if (enabled) electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWindow().setAlwaysOnTop(true);else electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWindow().setAlwaysOnTop(false);
|
|
}
|
|
|
|
if (id === "lightcord-4") {
|
|
if (enabled) {
|
|
_AntiAdDM__WEBPACK_IMPORTED_MODULE_20__["default"].enable();
|
|
} else {
|
|
_AntiAdDM__WEBPACK_IMPORTED_MODULE_20__["default"].disable();
|
|
}
|
|
}
|
|
|
|
if (id === "lightcord-6") {
|
|
if (enabled) {
|
|
_blurPrivate__WEBPACK_IMPORTED_MODULE_21__["default"].enable();
|
|
} else {
|
|
_blurPrivate__WEBPACK_IMPORTED_MODULE_21__["default"].disable();
|
|
}
|
|
}
|
|
|
|
if (id === "lightcord-7") {
|
|
if (enabled) {
|
|
_disableTyping__WEBPACK_IMPORTED_MODULE_22__["default"].enable();
|
|
} else {
|
|
_disableTyping__WEBPACK_IMPORTED_MODULE_22__["default"].disable();
|
|
}
|
|
}
|
|
|
|
if (id === "lightcord-8") {
|
|
let appSettings = electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getGlobal("appSettings");
|
|
appSettings.set("isTabs", enabled);
|
|
appSettings.save();
|
|
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.relaunch();
|
|
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.exit();
|
|
}
|
|
|
|
if (id === "no_window_bound") {
|
|
let appSettings = electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getGlobal("appSettings");
|
|
appSettings.set("NO_WINDOWS_BOUND", enabled);
|
|
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 (settingsCookie.reactDevTools) reactDevTools.start();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-2"]) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(document.body, "bd-minimal");
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-3"]) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(document.body, "bd-minimal-chan");
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-1"]) _publicServers__WEBPACK_IMPORTED_MODULE_9__["default"].addButton();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-4"]) _voiceMode__WEBPACK_IMPORTED_MODULE_10__["default"].start();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-5"]) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("#app-mount"), "bda-dark");
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-6"]) _24hour__WEBPACK_IMPORTED_MODULE_7__["default"].inject24Hour();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-7"]) _coloredText__WEBPACK_IMPORTED_MODULE_6__["default"].injectColoredText();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-4"]) _classNormalizer__WEBPACK_IMPORTED_MODULE_11__["default"].start();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-1"]) window.Lightcord.Settings.devMode = true;
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-2"]) window.Lightcord.Settings.callRingingBeat = true;
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-presence-1"]) _CustomRichPresence__WEBPACK_IMPORTED_MODULE_17__["default"].enable();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-3"]) electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWindow().setAlwaysOnTop(true);
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-4"]) _AntiAdDM__WEBPACK_IMPORTED_MODULE_20__["default"].enable();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-6"]) _blurPrivate__WEBPACK_IMPORTED_MODULE_21__["default"].enable();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-7"]) _disableTyping__WEBPACK_IMPORTED_MODULE_22__["default"].enable();
|
|
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-5"]) {
|
|
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("plugin");
|
|
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("theme");
|
|
}
|
|
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-8"]) _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].startDebugListener();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-dm-1"]) _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].startCopySelector();
|
|
this.saveSettings();
|
|
}
|
|
|
|
saveSettings() {
|
|
_dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].setSettingGroup("settings", _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]);
|
|
_dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].setSettingGroup("rpc", _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"]);
|
|
}
|
|
|
|
loadSettings() {
|
|
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"], _dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].getSettingGroup("settings"));
|
|
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"], _dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].getSettingGroup("rpc"));
|
|
}
|
|
|
|
renderSidebar(sidebar) {
|
|
return this.sidebar.render(sidebar);
|
|
}
|
|
|
|
coreComponent() {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_sectionedSettingsPanel__WEBPACK_IMPORTED_MODULE_13__["default"], {
|
|
key: "cspanel",
|
|
onChange: this.onChange,
|
|
sections: this.coreSettings
|
|
});
|
|
}
|
|
|
|
lightcordComponent(sidebar) {
|
|
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);
|
|
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")];
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
}
|
|
|
|
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"
|
|
}];
|
|
if (window.Lightcord.Settings.devMode) items.push({
|
|
text: "Api 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)
|
|
};
|
|
}), {
|
|
section: "DIVIDER"
|
|
}, {
|
|
section: "CUSTOM",
|
|
element: this.getComponent("BDChangelogTitle")
|
|
}, ...this.items.map(e => {
|
|
return {
|
|
section: e.id,
|
|
label: e.text,
|
|
element: this.getComponent(e.id, sidebar)
|
|
};
|
|
}), {
|
|
section: "DIVIDER"
|
|
}];
|
|
}
|
|
|
|
}
|
|
/**
|
|
* No need to export settingsPanelSidebar on window
|
|
*/
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/themeModule.js":
|
|
/*!************************************!*\
|
|
!*** ./src/modules/themeModule.js ***!
|
|
\************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
|
|
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
|
|
/* harmony import */ var _bdEvents__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bdEvents */ "./src/modules/bdEvents.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ThemeModule {
|
|
constructor() {
|
|
window.Lightcord.BetterDiscord.ThemeModule = this;
|
|
}
|
|
|
|
get folder() {
|
|
return _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].themesFolder;
|
|
}
|
|
|
|
}
|
|
|
|
ThemeModule.prototype.loadThemes = async function () {
|
|
this.loadThemeData();
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemeErrors"].splice(0, 0, ...(await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadThemes()));
|
|
const themes = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]);
|
|
|
|
for (let i = 0; i < themes.length; i++) {
|
|
const theme = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][themes[i]];
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme.name]) _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme.name] = false;
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme.name]) _domtools__WEBPACK_IMPORTED_MODULE_5__["default"].addStyle(_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].escapeID(theme.id), unescape(theme.css));
|
|
await new Promise(resolve => setTimeout(resolve, 10));
|
|
}
|
|
|
|
for (const theme in _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"]) {
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme]) delete _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme];
|
|
}
|
|
|
|
this.saveThemeData(); // if (settingsCookie["fork-ps-5"]) ContentManager.watchContent("theme");
|
|
};
|
|
|
|
ThemeModule.prototype.enableTheme = function (name, reload = false) {
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][name] = true;
|
|
this.saveThemeData();
|
|
const theme = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][name];
|
|
_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].addStyle(_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].escapeID(theme.id), unescape(theme.css));
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme.name} v${theme.version} has been applied.`);
|
|
};
|
|
|
|
ThemeModule.prototype.enable = function (name, reload = false) {
|
|
return this.enableTheme(name, reload);
|
|
};
|
|
|
|
ThemeModule.prototype.disableTheme = function (name, reload = false) {
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][name] = false;
|
|
this.saveThemeData();
|
|
const theme = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][name];
|
|
_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].removeStyle(_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].escapeID(theme.id));
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme.name} v${theme.version} has been disabled.`);
|
|
};
|
|
|
|
ThemeModule.prototype.disable = function (name, reload = false) {
|
|
return this.disableTheme(name, reload);
|
|
};
|
|
|
|
ThemeModule.prototype.toggleTheme = function (theme) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme]) this.disableTheme(theme);else this.enableTheme(theme);
|
|
};
|
|
|
|
ThemeModule.prototype.toggle = function (name, reload = false) {
|
|
return this.toggleTheme(name, reload);
|
|
};
|
|
|
|
ThemeModule.prototype.loadTheme = async function (filename) {
|
|
const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadContent(filename, "theme");
|
|
|
|
if (error) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
|
|
themes: [error]
|
|
});
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${filename} could not be loaded. It may not have been loaded.`, {
|
|
type: "error"
|
|
});
|
|
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${filename} could not be loaded.`, error);
|
|
}
|
|
|
|
const theme = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filename);
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${theme.name} v${theme.version} was loaded.`);
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme.name} v${theme.version} was loaded.`, {
|
|
type: "success"
|
|
});
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("theme-loaded", theme.name);
|
|
};
|
|
|
|
ThemeModule.prototype.unloadTheme = function (filenameOrName) {
|
|
const bdtheme = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][filenameOrName];
|
|
if (!bdtheme) return;
|
|
const theme = bdtheme.name;
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme]) this.disableTheme(theme, true);
|
|
const error = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].unloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme].filename, "theme");
|
|
delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme];
|
|
|
|
if (error) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
|
|
themes: [error]
|
|
});
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme} could not be unloaded. It may have not been loaded yet.`, {
|
|
type: "error"
|
|
});
|
|
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${theme} could not be unloaded. It may have not been loaded yet.`, error);
|
|
}
|
|
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${theme} was unloaded.`);
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme} was unloaded.`, {
|
|
type: "success"
|
|
});
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("theme-unloaded", theme);
|
|
};
|
|
|
|
ThemeModule.prototype.delete = function (filenameOrName) {
|
|
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][filenameOrName];
|
|
if (!bdplugin) return;
|
|
this.unloadTheme(bdplugin.filename);
|
|
|
|
const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder, bdplugin.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("." + BDModules.get(e => e.channelTextArea && e.titleWrapper)[0].channelTextArea.split(" ")[0] + " 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();
|
|
}
|
|
}
|
|
|
|
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("." + BDModules.get(e => e.sidebar && e.hasNotice)[0].sidebar.split(" ")[9] + " + div") || null;
|
|
const memberlist = container ? container.querySelector("." + BDModules.get(e => e.membersWrap)[0].membersWrap) : null;
|
|
const form = container ? container.querySelector("form") : null;
|
|
const left = container ? container.getBoundingClientRect().left : 310;
|
|
const right = memberlist ? memberlist.getBoundingClientRect().left : 0;
|
|
const width = right ? right - container.getBoundingClientRect().left : Utils.screenWidth - left - 240;
|
|
const bottom = form ? form.offsetHeight : 80;
|
|
const toastWrapper = document.createElement("div");
|
|
toastWrapper.classList.add("bd-toasts");
|
|
toastWrapper.style.setProperty("left", left + "px");
|
|
toastWrapper.style.setProperty("width", width + "px");
|
|
toastWrapper.style.setProperty("bottom", bottom + "px");
|
|
document.querySelector("#app-mount").appendChild(toastWrapper);
|
|
}
|
|
|
|
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;
|
|
document.querySelector(".bd-toasts").appendChild(toastElem);
|
|
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 ModalStack = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("push", "update", "pop", "popWithKey");
|
|
const Markdown = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByDisplayName("Markdown");
|
|
const ConfirmationModal = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].find(m => m.defaultProps && m.key && m.key() == "confirm-modal");
|
|
if (!ModalStack || !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 ModalStack.push(ConfirmationModal, {
|
|
header: title,
|
|
children: content,
|
|
red: danger,
|
|
confirmText: confirmText,
|
|
cancelText: cancelText,
|
|
onConfirm: onConfirm,
|
|
onCancel: onCancel
|
|
}, key);
|
|
}
|
|
|
|
static 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/LightcordUser.jsx":
|
|
/*!***********************************!*\
|
|
!*** ./src/svg/LightcordUser.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 LightcordUserBadge; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.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); }
|
|
|
|
|
|
let profilModule = BDModules.get(e => e.default && e.default.open && e.default.fetchMutualFriends)[0];
|
|
class LightcordUserBadge extends React.Component {
|
|
render() {
|
|
const props = this.props;
|
|
delete props.href.target;
|
|
console.log(props);
|
|
return React.createElement(props.Anchor, _extends({
|
|
href: "/users/" + props.user.id
|
|
}, props.href, {
|
|
onClick: ev => {
|
|
ev.preventDefault();
|
|
if (!profilModule) profilModule = BDModules.get(e => e.default && e.default.open && e.default.fetchMutualFriends)[0];
|
|
profilModule.default.open(props.user.id);
|
|
}
|
|
}), React.createElement("svg", _extends({
|
|
viewBox: "0 0 31.3 29.5"
|
|
}, props.svg, {
|
|
height: "100%"
|
|
}), 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)"
|
|
}), 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/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 React.createElement("svg", _extends({
|
|
viewBox: "0 0 31.3 29.5"
|
|
}, props.svg, {
|
|
height: "100%"
|
|
}), 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)"
|
|
}), 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 React.createElement("svg", _extends({
|
|
xmlns: "http://www.w3.org/2000/svg",
|
|
viewBox: "0 0 36 36"
|
|
}, this.props.svg, {
|
|
height: "100%"
|
|
}), React.createElement("path", {
|
|
fill: "#DD2E44",
|
|
d: "M33 33a2 2 0 01-2 2H5a2 2 0 01-2-2l1-12h28l1 12z"
|
|
}), 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"
|
|
}), 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"
|
|
}), React.createElement("circle", {
|
|
cx: "14",
|
|
cy: "23",
|
|
r: "2",
|
|
fill: "#BE1931"
|
|
}), React.createElement("circle", {
|
|
cx: "22",
|
|
cy: "23",
|
|
r: "2",
|
|
fill: "#BE1931"
|
|
}), React.createElement("circle", {
|
|
cx: "10",
|
|
cy: "23",
|
|
r: "2",
|
|
fill: "#BE1931"
|
|
}), React.createElement("circle", {
|
|
cx: "26",
|
|
cy: "23",
|
|
r: "2",
|
|
fill: "#BE1931"
|
|
}), React.createElement("path", {
|
|
d: "M23 35H13s2-6 2-13h6c0 7 2 13 2 13zM17 2h2v7h-2z"
|
|
}), 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"
|
|
}), 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"
|
|
}), React.createElement("g", {
|
|
fill: "#F5F8FA"
|
|
}, 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"
|
|
}), 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 React.createElement("svg", _extends({
|
|
viewBox: "0 0 168 168.69"
|
|
}, props, {
|
|
height: "100%",
|
|
width: props.size
|
|
}), React.createElement("defs", null, 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"
|
|
}, React.createElement("stop", {
|
|
offset: 0,
|
|
stopColor: "#e30613"
|
|
}), React.createElement("stop", {
|
|
offset: 1,
|
|
stopColor: "#731a14"
|
|
})), 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"
|
|
}, React.createElement("stop", {
|
|
offset: 0,
|
|
stopColor: "#e20613"
|
|
}), React.createElement("stop", {
|
|
offset: 1,
|
|
stopColor: "#731a13"
|
|
})), 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"
|
|
}, React.createElement("stop", {
|
|
offset: 0,
|
|
stopColor: "#e30613"
|
|
}), React.createElement("stop", {
|
|
offset: 1,
|
|
stopColor: "#731a13"
|
|
}))), React.createElement("path", {
|
|
fill: "#fff",
|
|
d: "M14.9 35.3h139.2V133H14.9z"
|
|
}), 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)"
|
|
}), 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)"
|
|
}), 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 [React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], {
|
|
text: "Account Infos"
|
|
}), React.createElement("div", null, React.createElement("h5", {
|
|
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
|
|
}, "Profile"), React.createElement(CodeContent, {
|
|
content: this.getProfileValue(),
|
|
language: "diff"
|
|
}), React.createElement("h5", {
|
|
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
|
|
}, "Statistics"), React.createElement(CodeContent, {
|
|
content: this.getStatistics(),
|
|
language: "diff"
|
|
}), React.createElement("h5", {
|
|
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
|
|
}, "Connected Sessions"), React.createElement(CodeContent, {
|
|
content: this.getSessionValue(),
|
|
language: "diff"
|
|
})), React.createElement("div", {
|
|
className: BDModules.get(e => e.marginBottom20)[0].marginBottom20
|
|
})];
|
|
}
|
|
|
|
getSessionValue() {
|
|
const sessionsRaw = sessionModule.getSessions();
|
|
const sessions = Object.keys(sessionsRaw).filter(e => e !== "all").map(e => sessionsRaw[e]);
|
|
if (sessions.length === 0) return "- No session detected. Please try in a few seconds";
|
|
return sessions.map(e => {
|
|
return `+ id: ${e.sessionId}
|
|
+ os: ${e.clientInfo.os[0].toUpperCase() + e.clientInfo.os.slice(1)}
|
|
+ client: ${e.clientInfo.client}
|
|
+ status: ${e.status}
|
|
+ Activities: ${e.activities.length}`;
|
|
}).join("\n" + "-".repeat(38) + "\n");
|
|
}
|
|
|
|
getProfileValue() {
|
|
const user = userModule.getCurrentUser();
|
|
/**
|
|
* @type {Date}
|
|
*/
|
|
|
|
const createdAt = user.createdAt;
|
|
let avatarURL = user.avatarURL;
|
|
|
|
if (user.avatar && user.avatar.startsWith("a_")) {
|
|
avatarURL = user.getAvatarURL("gif");
|
|
}
|
|
|
|
if (avatarURL.startsWith("/")) {
|
|
avatarURL = "https://discord.com" + avatarURL;
|
|
}
|
|
|
|
if (avatarURL.endsWith("?size=128")) {
|
|
avatarURL = avatarURL.replace("?size=128", "?size=4096");
|
|
}
|
|
|
|
return `+ Username: ${user.username}
|
|
+ Discriminator: ${user.discriminator}
|
|
+ Tag: ${user.tag}
|
|
+ ID: ${user.id}
|
|
+ Avatar: ${user.avatar}
|
|
+ Avatar URL: ${avatarURL}
|
|
+ Creation Date: ${createdAt.getDate().toString().padStart(2, "0")}/${(createdAt.getMonth() + 1).toString().padStart(2, "0")}/${createdAt.getFullYear().toString().padStart(2, "0")} ${createdAt.getHours().toString().padStart(2, "0")}h ${createdAt.getMinutes().toString().padStart(2, "0")}min ${createdAt.getSeconds()}s
|
|
+ Flags: ${user.flags}
|
|
+ Has Nitro: ${user.hasPremiumSubscription ? "Yes" : "No"}
|
|
- Email: ${user.email}
|
|
- 2FA: ${user.mfaEnabled ? "Yes" : "No"}
|
|
- Has Been On Mobile: ${user.mobile ? "Yes" : "No"}
|
|
- Phone: ${user.phone || "None"}
|
|
- Verified: ${user.verified}`;
|
|
}
|
|
|
|
getStatistics() {
|
|
const guilds = Object.values(GuildModule.getGuilds());
|
|
const relations = Object.keys(relationShipModule.getRelationships());
|
|
const friends = relations.filter(e => relationShipModule.isFriend(e));
|
|
const blocked = relations.filter(e => relationShipModule.isBlocked(e));
|
|
return `+ Server Count: ${guilds.length} servers
|
|
+ Relations: ${relations.length} relations
|
|
+ Friends Count: ${friends.length} friends
|
|
- Blocked Users Count: ${blocked.length} blocked users`;
|
|
}
|
|
|
|
}
|
|
let hightlightJS = BDModules.get(e => e.highlight)[0];
|
|
let messageModule1 = BDModules.get(e => e.markup)[0];
|
|
let messageModule2 = BDModules.get(e => e.messageContent)[0];
|
|
|
|
class CodeContent extends React.Component {
|
|
render() {
|
|
if (!messageModule1) messageModule1 = BDModules.get(e => e.markup)[0];
|
|
if (!messageModule2) messageModule2 = BDModules.get(e => e.messageContent)[0];
|
|
if (!scrollbarModule1) scrollbarModule1 = BDModules.get(e => e.scrollbarGhostHairline)[0];
|
|
if (!hightlightJS) hightlightJS = BDModules.get(e => e.highlight)[0];
|
|
return React.createElement("div", {
|
|
class: `${messageModule1.markup} ${messageModule2.messageContent}`
|
|
}, React.createElement("pre", null, React.createElement("code", {
|
|
class: `${scrollbarModule1.scrollbarGhostHairline} hljs`,
|
|
dangerouslySetInnerHTML: {
|
|
__html: hightlightJS.highlight(this.props.language, this.props.content).value
|
|
}
|
|
})), 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.
|
|
|
|
|
|
|
|
|
|
|
|
const keys = {
|
|
settingTitle: Object(_modules_distant__WEBPACK_IMPORTED_MODULE_1__["uuidv4"])()
|
|
};
|
|
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 [React.createElement(formModule.FormSection, {
|
|
tag: "h2",
|
|
title: "Lightcord's Api Availlable components"
|
|
}, 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."), React.createElement(_margintop__WEBPACK_IMPORTED_MODULE_4__["default"], null), 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://github.com/lightcord/lightcord/wiki/Apis");
|
|
},
|
|
wrapper: false
|
|
}, "Documentation")), allComponents.map(comp => {
|
|
let AllPreviews = [];
|
|
if (comp.AllPreviews) AllPreviews = comp.AllPreviews;
|
|
|
|
let onChange = tab => {
|
|
setState({
|
|
tab
|
|
});
|
|
};
|
|
|
|
let setState = newState => {
|
|
this.setState({
|
|
states: [Object.assign(state, newState)].concat(this.state.states.filter(e => e.elem !== comp))
|
|
});
|
|
};
|
|
|
|
let state = this.state.states.find(e => e.elem === comp);
|
|
|
|
if (!state) {
|
|
state = {
|
|
tab: "preview",
|
|
elem: comp,
|
|
options: {}
|
|
};
|
|
this.state.states.push(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 React.createElement("div", {
|
|
style: {
|
|
margin: "20px"
|
|
}
|
|
}, React.createElement("div", {
|
|
style: {
|
|
backgroundColor: "var(--background-primary)",
|
|
padding: "30px 30px",
|
|
borderRadius: "8px"
|
|
},
|
|
className: "lc-tab-box-shadow"
|
|
}, React.createElement(comp, getProps())));
|
|
};
|
|
|
|
let renderCode = () => {
|
|
return React.createElement("div", {
|
|
style: {
|
|
margin: "20px"
|
|
}
|
|
}, React.createElement("div", {
|
|
style: {
|
|
backgroundColor: "var(--background-primary)",
|
|
padding: "30px 30px",
|
|
borderRadius: "8px"
|
|
},
|
|
className: "lc-tab-box-shadow"
|
|
}, React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle, null, "JSX"), React.createElement(window.Lightcord.Api.Components.general.CodeBlock, {
|
|
language: "jsx",
|
|
content: generateCode("jsx")
|
|
}), React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle, null, "React"), 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-primary)",
|
|
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-primary)",
|
|
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 ? React.createElement(window.Lightcord.Api.Components.general.AlertBox, {
|
|
type: "info"
|
|
}, help.info) : null;
|
|
let warn = help.warn ? React.createElement(window.Lightcord.Api.Components.general.AlertBox, {
|
|
type: "warn"
|
|
}, help.warn) : null;
|
|
let danger = help.danger ? React.createElement(window.Lightcord.Api.Components.general.AlertBox, {
|
|
type: "danger"
|
|
}, help.danger) : null;
|
|
let error = help.error ? React.createElement(window.Lightcord.Api.Components.general.AlertBox, {
|
|
type: "error"
|
|
}, help.error) : null;
|
|
let success = help.success ? React.createElement(window.Lightcord.Api.Components.general.AlertBox, {
|
|
type: "success"
|
|
}, help.success) : null;
|
|
return React.createElement("div", null, 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 [React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle, null, key), 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 => {
|
|
setState({
|
|
options: Object.assign({}, state.options, {
|
|
[key]: (value.value || "0").replace("opt-", "")
|
|
})
|
|
});
|
|
},
|
|
searchable: true
|
|
}), React.createElement("div", {
|
|
style: {
|
|
marginBottom: "8px"
|
|
}
|
|
})];
|
|
}), 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: onChange
|
|
}));
|
|
})];
|
|
}
|
|
|
|
get renders() {}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./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) => {
|
|
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*=\"scroller-\"]");
|
|
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 React.createElement(_tooltipWrap__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
|
color: "black",
|
|
side: "top",
|
|
text: title
|
|
}, 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", React.createElement(_icons_edit__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
|
className: "bd-icon"
|
|
}), this.edit), this.props.remove && this.makeButton("Delete", React.createElement(_icons_delete__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
|
className: "bd-icon"
|
|
}), this.delete), this.props.reload && this.makeButton("Reload", 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 _tools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools */ "./src/ui/tools.js");
|
|
/* harmony import */ var _reloadIcon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./reloadIcon */ "./src/ui/reloadIcon.js");
|
|
/* harmony import */ var _addoncard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./addoncard */ "./src/ui/addoncard.jsx");
|
|
/* harmony import */ var _scroller__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./scroller */ "./src/ui/scroller.js");
|
|
/* harmony import */ var _components_dropdown__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/dropdown */ "./src/ui/components/dropdown.jsx");
|
|
/* harmony import */ var _components_search__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/search */ "./src/ui/components/search.jsx");
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _modules_contentManager__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../modules/contentManager */ "./src/modules/contentManager.js");
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _modules_pluginModule__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../modules/pluginModule */ "./src/modules/pluginModule.js");
|
|
/* harmony import */ var _modules_themeModule__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../modules/themeModule */ "./src/modules/themeModule.js");
|
|
/* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../modules/webpackModules */ "./src/modules/webpackModules.js");
|
|
/* harmony import */ var _modules_bdApi__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../modules/bdApi */ "./src/modules/bdApi.js");
|
|
/* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var _tooltipWrap__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./tooltipWrap */ "./src/ui/tooltipWrap.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_13__["default"].findByDisplayName("Tooltip");
|
|
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_10__["default"].react;
|
|
class CardList extends _modules_v2__WEBPACK_IMPORTED_MODULE_10__["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_8__["pluginCookie"] : _0globals__WEBPACK_IMPORTED_MODULE_8__["themeCookie"];
|
|
this.manager = this.isPlugins ? _modules_pluginModule__WEBPACK_IMPORTED_MODULE_11__["default"] : _modules_themeModule__WEBPACK_IMPORTED_MODULE_12__["default"];
|
|
this.sort = this.sort.bind(this);
|
|
this.reverse = this.reverse.bind(this);
|
|
this.search = this.search.bind(this);
|
|
}
|
|
|
|
openFolder() {
|
|
__webpack_require__(/*! electron */ "electron").shell.openItem(this.isPlugins ? _modules_contentManager__WEBPACK_IMPORTED_MODULE_9__["default"].pluginsFolder : _modules_contentManager__WEBPACK_IMPORTED_MODULE_9__["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_14__["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: this.edit.bind(this),
|
|
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(bdplugins) : Object.values(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}`]()) : a[this.state.sort];
|
|
const second = b.plugin && b.plugin[`get${cap}`] ? this.getString(b.plugin[`get${cap}`]()) : 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(React.createElement(_errorBoundary__WEBPACK_IMPORTED_MODULE_0__["default"], null, React.createElement(_addoncard__WEBPACK_IMPORTED_MODULE_4__["default"], _extends({}, props, {
|
|
reload: !_0globals__WEBPACK_IMPORTED_MODULE_8__["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;
|
|
return React.createElement("tooltipWrap", {
|
|
text: "Checks for updates of plugins that support this feature. Right-click for a list."
|
|
}, React.createElement("span", {
|
|
style: {
|
|
marginLeft: "10px"
|
|
}
|
|
}, React.createElement(Lightcord.Api.Components.inputs.Button, {
|
|
color: "brand",
|
|
look: "filled",
|
|
size: "min",
|
|
hoverColor: "default",
|
|
onClick: () => {
|
|
try {
|
|
_modules_utils__WEBPACK_IMPORTED_MODULE_15__["default"].showToast("Plugin update check in progress.", {
|
|
type: "info"
|
|
});
|
|
window.PluginUpdates.checkAll().then(() => {
|
|
_modules_utils__WEBPACK_IMPORTED_MODULE_15__["default"].showToast("Plugin update check complete.", {
|
|
type: "success"
|
|
});
|
|
}).catch(err => {
|
|
console.error(err);
|
|
_modules_utils__WEBPACK_IMPORTED_MODULE_15__["default"].showToast("An error occured while checking update.", {
|
|
type: "error"
|
|
});
|
|
});
|
|
} catch (e) {
|
|
console.error(e);
|
|
_modules_utils__WEBPACK_IMPORTED_MODULE_15__["default"].showToast("An error occured while checking update.", {
|
|
type: "error"
|
|
});
|
|
}
|
|
},
|
|
wrapper: false,
|
|
disabled: false
|
|
}, "Check for Updates")));
|
|
}
|
|
|
|
render() {
|
|
const refreshIcon = React.createElement(Tooltip, {
|
|
color: "black",
|
|
position: "top",
|
|
text: "Reload List"
|
|
}, props => React.createElement(_reloadIcon__WEBPACK_IMPORTED_MODULE_3__["default"], _extends({}, props, {
|
|
className: "bd-icon bd-reload bd-reload-header",
|
|
size: "18px",
|
|
onClick: async () => {
|
|
if (this.isPlugins) _modules_pluginModule__WEBPACK_IMPORTED_MODULE_11__["default"].updatePluginList();else _modules_themeModule__WEBPACK_IMPORTED_MODULE_12__["default"].updateThemeList();
|
|
this.forceUpdate();
|
|
}
|
|
})));
|
|
const addonCards = this.getAddons();
|
|
return React.createElement(_contentColumn__WEBPACK_IMPORTED_MODULE_1__["default"], {
|
|
title: `${this.props.type.toUpperCase()}—${addonCards.length}`
|
|
}, React.createElement("button", {
|
|
key: "folder-button",
|
|
className: "bd-button bd-pfbtn",
|
|
onClick: this.openFolder.bind(this)
|
|
}, "Open ", this.isPlugins ? "Plugin" : "Theme", " Folder"), this.renderCheckUpdates(), !_0globals__WEBPACK_IMPORTED_MODULE_8__["settingsCookie"]["fork-ps-5"] && refreshIcon, React.createElement("div", {
|
|
className: "bd-controls bd-addon-controls"
|
|
}, React.createElement(_components_search__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
|
onChange: this.search,
|
|
placeholder: `Search ${this.props.type}...`
|
|
}), React.createElement("div", {
|
|
className: "bd-addon-dropdowns"
|
|
}, React.createElement("div", {
|
|
className: "bd-select-wrapper"
|
|
}, React.createElement("label", {
|
|
className: "bd-label"
|
|
}, "Sort by:"), React.createElement(_components_dropdown__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
|
options: this.sortOptions,
|
|
onChange: this.sort,
|
|
style: "transparent"
|
|
})), React.createElement("div", {
|
|
className: "bd-select-wrapper"
|
|
}, React.createElement("label", {
|
|
className: "bd-label"
|
|
}, "Order:"), React.createElement(_components_dropdown__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
|
options: this.directions,
|
|
onChange: this.reverse,
|
|
style: "transparent"
|
|
})))), 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 React.createElement("div", {
|
|
className: "bd-select-options"
|
|
}, this.props.options.map(opt => 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 React.createElement("div", {
|
|
className: `bd-select${style}${isOpen}`,
|
|
onClick: this.showMenu,
|
|
ref: this.dropdown
|
|
}, React.createElement("div", {
|
|
className: "bd-select-value"
|
|
}, this.selected.label), 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 {
|
|
render() {
|
|
return React.createElement("div", {
|
|
className: "bd-search-wrapper"
|
|
}, React.createElement("input", {
|
|
onChange: this.props.onChange,
|
|
onKeyDown: this.props.onKeyDown,
|
|
type: "text",
|
|
className: "bd-search",
|
|
placeholder: this.props.placeholder,
|
|
maxLength: "50"
|
|
}), 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);
|
|
}
|
|
|
|
onChange(value) {
|
|
if (this.props.disabled) return;
|
|
this.props.onChange(value);
|
|
this.setState({
|
|
checked: value
|
|
});
|
|
}
|
|
|
|
render() {
|
|
return React.createElement(Lightcord.Api.Components.inputs.Switch, {
|
|
onChange: this.onChange,
|
|
value: this.state.checked
|
|
});
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./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 _settingsTitle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js");
|
|
/* harmony import */ var _checkbox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./checkbox */ "./src/ui/checkbox.js");
|
|
/* harmony import */ var _cssEditorDetached__WEBPACK_IMPORTED_MODULE_7__ = __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_7__["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/monokai");
|
|
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 = atob(_ccss);
|
|
}
|
|
|
|
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_5__["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_5__["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_6__["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", btoa(this.editor.session.getValue()));
|
|
}
|
|
|
|
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, ." + BDModules.get(e => e.app && e.layers)[0].app.split(" ")[0]);
|
|
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 _checkbox__WEBPACK_IMPORTED_MODULE_5__ = __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/monokai");
|
|
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 = atob(_ccss);
|
|
}
|
|
|
|
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, ." + BDModules.get(e => e.app && e.layers)[0].app.split(" ")[0]);
|
|
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_5__["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", btoa(this.editor.session.getValue()));
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./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 React.createElement("svg", {
|
|
className: this.props.className || "",
|
|
fill: "#FFFFFF",
|
|
viewBox: "0 0 24 24",
|
|
style: {
|
|
width: size,
|
|
height: size
|
|
},
|
|
onClick: this.props.onClick
|
|
}, React.createElement("path", {
|
|
fill: "none",
|
|
d: "M0 0h24v24H0V0z"
|
|
}), 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"
|
|
}), 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 React.createElement("svg", {
|
|
className: this.props.className || "",
|
|
fill: "#FFFFFF",
|
|
viewBox: "0 0 24 24",
|
|
style: {
|
|
width: size,
|
|
height: size
|
|
}
|
|
}, 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 React.createElement("svg", {
|
|
className: this.props.className || "",
|
|
viewBox: "0 0 24 24",
|
|
fill: "#FFFFFF",
|
|
style: {
|
|
width: size,
|
|
height: size
|
|
},
|
|
onClick: this.props.onClick
|
|
}, 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"
|
|
}), 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 React.createElement("svg", {
|
|
viewBox: "0 0 24 24",
|
|
fill: "#FFFFFF",
|
|
className: this.props.className || "",
|
|
style: {
|
|
width: size,
|
|
height: size
|
|
},
|
|
onClick: this.props.onClick
|
|
}, React.createElement("path", {
|
|
d: "M0 0h24v24H0z",
|
|
fill: "none"
|
|
}), 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 React.createElement("svg", {
|
|
className: this.props.className || "",
|
|
fill: "#FFFFFF",
|
|
viewBox: "0 0 24 24",
|
|
style: {
|
|
width: size,
|
|
height: size
|
|
}
|
|
}, React.createElement("path", {
|
|
fill: "none",
|
|
d: "M0 0h24v24H0V0z"
|
|
}), 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 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 _timestampRender__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./timestampRender */ "./src/ui/timestampRender.js");
|
|
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! electron */ "electron");
|
|
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_7__);
|
|
/* harmony import */ var _margintop__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./margintop */ "./src/ui/margintop.jsx");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 [React.createElement(_settingsGroup__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
|
title: "RichPresence Settings",
|
|
settings: this.props.settings,
|
|
onChange: this.props.onChange
|
|
}), React.createElement(_margintop__WEBPACK_IMPORTED_MODULE_8__["default"], null), React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], {
|
|
text: "RichPresence"
|
|
}), React.createElement("div", null, this.optionsComponents), React.createElement("div", null, React.createElement(_margintop__WEBPACK_IMPORTED_MODULE_8__["default"], null), React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], {
|
|
text: "Preview"
|
|
}), React.createElement(RpcPreview, {
|
|
settings: this
|
|
})), React.createElement("div", {
|
|
className: marginModule.marginBottom20
|
|
}), React.createElement("button", {
|
|
style: {
|
|
opacity: 0.01
|
|
},
|
|
onClick: window.ohgodohfuck
|
|
}, "Oh god Oh fuck"), React.createElement("button", {
|
|
style: {
|
|
opacity: 0.01
|
|
},
|
|
onClick: () => {
|
|
electron__WEBPACK_IMPORTED_MODULE_7__["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 React.createElement(InputText, {
|
|
setting: e,
|
|
manager: this,
|
|
id: e.id
|
|
});
|
|
} else if (e.type === "number") {
|
|
let array = [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 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 = 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 React.createElement("div", {
|
|
className: rowModule.row + " " + marginModule.marginBottom20
|
|
}, React.createElement("div", {
|
|
className: `${rowModule.item} ${flexModule.flexChild}`
|
|
}, React.createElement("h5", {
|
|
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
|
|
}, setting.title), this.input), 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 = 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 React.createElement("div", {
|
|
className: rowModule.row + " " + marginModule.marginBottom20
|
|
}, React.createElement("div", {
|
|
className: `${rowModule.item} ${flexModule.flexChild}`
|
|
}, React.createElement("h5", {
|
|
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
|
|
}, setting.title), this.input, setting.id === "timestamps.start" ? React.createElement(Lightcord.Api.Components.inputs.Button, {
|
|
onClick: () => {
|
|
DiscordNative.clipboard.copy(Date.now() + "");
|
|
},
|
|
color: "brand"
|
|
}, "Copy current timestamp") : null), 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 React.createElement("div", {
|
|
className: rowModule.row + " " + marginModule.marginBottom20
|
|
}, React.createElement("div", {
|
|
className: `${rowModule.item} ${flexModule.flexChild}`
|
|
}, React.createElement("h5", {
|
|
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
|
|
}, setting.title), React.createElement(window.Lightcord.Api.Components.inputs.Dropdown, {
|
|
value: this.state.data,
|
|
options: options,
|
|
onChange: this.onChange.bind(this)
|
|
})), 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 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 React.createElement("div", {
|
|
className: rowModule.row + " " + marginModule.marginBottom20
|
|
}, React.createElement("div", {
|
|
className: `${rowModule.item} ${flexModule.flexChild}`
|
|
}, 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() {
|
|
let preview = new this.preview({
|
|
preview: this
|
|
});
|
|
preview.setState(this.state.rpc);
|
|
return React.createElement("div", {
|
|
className: "lc-tabWrapper"
|
|
}, React.createElement("div", {
|
|
className: "lc-tabnav",
|
|
style: {
|
|
flex: "0 1 auto"
|
|
}
|
|
}, React.createElement(Tab, {
|
|
preview: this,
|
|
title: "Full Profile",
|
|
id: "profile"
|
|
}), React.createElement(Tab, {
|
|
preview: this,
|
|
title: "User Popout",
|
|
id: "popout"
|
|
})), preview.render());
|
|
}
|
|
|
|
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 React.createElement("div", {
|
|
className: className,
|
|
onClick: () => {
|
|
this.props.preview.changeTab(this);
|
|
}
|
|
}, this.props.title);
|
|
}
|
|
|
|
}
|
|
|
|
let popoutModule;
|
|
|
|
class Popout extends React.Component {
|
|
// TODO: Probably use internal Components instead of making it from scratch.
|
|
get modules() {
|
|
return popoutModule || (popoutModule = [BDModules.get(e => e.userPopout)[0], BDModules.get(e => e._horizontal)[0], BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0], BDModules.get(e => e.bot)[0], BDModules.get(e => e.activityUserPopout)[0], BDModules.get(e => e.muted && e.wrapper && e.base)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e.themeGhostHairlineChannels)[0], BDModules.get(e => e.note && Object.keys(e).length === 1)[0], BDModules.get(e => e.pro && e.inline)[0], BDModules.get(e => e.colorStandard)[0], BDModules.get(e => e.default && e.default.Messages)[0].default.Messages, BDModules.get(e => e.pointerEvents)[0], BDModules.get(e => e.default && e.default.getCurrentUser)[0].default]);
|
|
}
|
|
|
|
render() {
|
|
let [rootModule1, flexModule1, stylingModule1, nameTagModule1, activityModule1, textModule1, sizeModule1, scrollerModule1, noteModule1, protipModule1, colorModule1, Messages, avatarModule1, userModule1] = this.modules;
|
|
let user = userModule1.getCurrentUser();
|
|
let avatarURL = user.avatarURL;
|
|
|
|
if (user.avatar && user.avatar.startsWith("a_")) {
|
|
avatarURL = user.getAvatarURL("gif");
|
|
}
|
|
|
|
let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"], this.props.preview.props.settings.state.data);
|
|
timestampClass = timestampClass || activityModule1.timestamp;
|
|
|
|
let images = (() => {
|
|
if (!data["assets.large"]) return null;
|
|
let images = [];
|
|
|
|
if (data["assets.large"]) {
|
|
images.push(React.createElement("img", {
|
|
alt: "",
|
|
src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.large"]}.png`,
|
|
class: `${activityModule1.assetsLargeImageUserPopout} ${data["assets.small"] ? activityModule1.assetsLargeMaskUserPopout : ""}`
|
|
}));
|
|
}
|
|
|
|
if (data["assets.small"]) {
|
|
images.push(React.createElement("img", {
|
|
alt: "",
|
|
src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.small"]}.png`,
|
|
class: activityModule1.assetsSmallImageUserPopout
|
|
}));
|
|
}
|
|
|
|
if (!images.length) return null;
|
|
return React.createElement("div", {
|
|
class: activityModule1.assets
|
|
}, images);
|
|
})();
|
|
|
|
return React.createElement("div", {
|
|
className: "lc-userPopout lc-tab-box-shadow"
|
|
}, React.createElement("div", {
|
|
class: rootModule1.userPopout,
|
|
role: "dialog",
|
|
tabindex: "-1"
|
|
}, React.createElement("div", {
|
|
class: rootModule1.headerPlaying
|
|
}, React.createElement("div", {
|
|
class: `${flexModule1.flex} ${stylingModule1.vertical} ${stylingModule1.justifyCenter} ${stylingModule1.alignCenter} ${stylingModule1.noWrap} ${rootModule1.headerTop}`,
|
|
style: {
|
|
flex: "1 1 auto"
|
|
}
|
|
}, React.createElement("div", {
|
|
class: rootModule1.avatarWrapperNormal,
|
|
role: "button",
|
|
tabindex: "0"
|
|
}, React.createElement("div", {
|
|
class: avatarModule1,
|
|
role: "img",
|
|
style: {
|
|
width: "80px",
|
|
height: "80px"
|
|
}
|
|
}, React.createElement("svg", {
|
|
width: "92",
|
|
height: "80",
|
|
viewBox: "0 0 92 80",
|
|
class: `${avatarModule1.mask} ${avatarModule1.svg}`
|
|
}, React.createElement("foreignObject", {
|
|
x: "0",
|
|
y: "0",
|
|
width: "80",
|
|
height: "80",
|
|
mask: "url(#svg-mask-avatar-status-round-80)"
|
|
}, React.createElement("img", {
|
|
src: avatarURL,
|
|
alt: " ",
|
|
class: avatarModule1.avatar
|
|
})), React.createElement(Status, null))), React.createElement("svg", {
|
|
width: "80",
|
|
height: "80",
|
|
class: rootModule1.avatarHint,
|
|
viewBox: "0 0 80 80"
|
|
}, React.createElement("foreignObject", {
|
|
x: "0",
|
|
y: "0",
|
|
width: "80",
|
|
height: "80",
|
|
mask: "url(#svg-mask-avatar-status-round-80)"
|
|
}, React.createElement("div", {
|
|
class: rootModule1.avatarHintInner
|
|
}, Messages.VIEW_PROFILE)))), React.createElement("div", {
|
|
class: rootModule1.headerText
|
|
}, React.createElement("div", {
|
|
class: `${flexModule1.flex} ${stylingModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignCenter} ${stylingModule1.noWrap}`,
|
|
style: {
|
|
flex: "1 1 auto"
|
|
}
|
|
}, React.createElement("div", {
|
|
class: `${rootModule1.headerTagNoNickname} ${nameTagModule1.nameTag}`
|
|
}, React.createElement("span", {
|
|
class: `${nameTagModule1.username} ${rootModule1.headerTagUsernameNoNickname}`
|
|
}, user.username), React.createElement("span", null, "#", user.discriminator))))), React.createElement("div", {
|
|
class: `${activityModule1.activityUserPopout} ${rootModule1.activity}`
|
|
}, React.createElement("h3", {
|
|
class: `${activityModule1.headerTextNormal} ${textModule1.base} ${sizeModule1.size12}`
|
|
}, Messages.USER_ACTIVITY_HEADER_PLAYING), React.createElement("div", {
|
|
class: activityModule1.bodyNormal
|
|
}, images, React.createElement("div", {
|
|
class: images ? activityModule1.contentImagesUserPopout : activityModule1.contentNoImagesUserPopout,
|
|
style: {
|
|
flex: "1 1 auto"
|
|
}
|
|
}, (() => {
|
|
if (!data.name) return null;
|
|
return React.createElement("h3", {
|
|
class: `${activityModule1.nameNormal} ${textModule1.base} ${sizeModule1.size14}`,
|
|
title: data.name
|
|
}, React.createElement("span", {
|
|
class: activityModule1.activityName
|
|
}, data.name));
|
|
})(), (() => {
|
|
if (!data.details) return null;
|
|
return React.createElement("div", {
|
|
title: data.title,
|
|
class: activityModule1.details
|
|
}, data.details);
|
|
})(), (() => {
|
|
if (!data.state) return null;
|
|
return React.createElement("div", {
|
|
class: activityModule1.state
|
|
}, React.createElement("span", {
|
|
title: data.state
|
|
}, data.state));
|
|
})(), (() => {
|
|
if (!data["timestamps.start"]) return null;
|
|
let timeComponent = Object(_timestampRender__WEBPACK_IMPORTED_MODULE_6__["default"])(Timestamp, Messages);
|
|
return React.createElement("div", {
|
|
class: activityModule1.timestamp
|
|
}, React.createElement(timeComponent, {
|
|
timestamps: {
|
|
end: null,
|
|
start: data["timestamps.start"]
|
|
}
|
|
}));
|
|
})())))), React.createElement("div", {
|
|
class: `${scrollerModule1.scrollerWrap} ${rootModule1.body} ${scrollerModule1.scrollerThemed} ${scrollerModule1.themeGhostHairline} ${scrollerModule1.scrollerFade}`
|
|
}, React.createElement("div", {
|
|
class: `${scrollerModule1.scroller} ${rootModule1.bodyInner}`
|
|
}, React.createElement("div", {
|
|
class: rootModule1.bodyTitle
|
|
}, Messages.NOTE), React.createElement("div", {
|
|
class: `${noteModule1.note} ${rootModule1.note}`
|
|
}, React.createElement("textarea", {
|
|
placeholder: Messages.NOTE_PLACEHOLDER,
|
|
maxlength: "256",
|
|
autocorrect: "off",
|
|
class: BDModules.get(e => e.scrollbarGhostHairline)[0].scrollbarGhostHairline,
|
|
style: {
|
|
height: "36px"
|
|
},
|
|
disabled: true
|
|
})))), React.createElement("div", {
|
|
class: rootModule1.footer
|
|
}, React.createElement("div", {
|
|
class: `${rootModule1.protip} ${protipModule1.inline}`
|
|
}, React.createElement("h3", {
|
|
class: `${protipModule1.pro} ${textModule1.base} ${sizeModule1.size12}`,
|
|
style: {
|
|
color: "rgb(67, 181, 129)"
|
|
}
|
|
}, Messages.PINNED_MESSAGES_PRO_TIP), React.createElement("div", {
|
|
class: `${colorModule1.colorStandard} ${sizeModule1.size14} ${protipModule1.tip}`
|
|
}, Messages.CONTEXT_MENU_HINT)))));
|
|
}
|
|
|
|
}
|
|
|
|
let StatusModules;
|
|
|
|
class Status extends React.Component {
|
|
get modules() {
|
|
return StatusModules || (StatusModules = [BDModules.get(e => e.default && e.default.getPresence)[0], BDModules.get(e => e.pointerEvents)[0].pointerEvents]);
|
|
}
|
|
|
|
render() {
|
|
let [getPresence, pointerEvents] = this.modules;
|
|
let status = getPresence.default.getPresence().status;
|
|
if (status === "invisible") status = "offline";
|
|
return React.createElement("rect", {
|
|
width: "16",
|
|
height: "16",
|
|
x: "60",
|
|
y: "60",
|
|
fill: "#ffffff",
|
|
mask: `url(#svg-mask-status-${status})`,
|
|
className: pointerEvents
|
|
});
|
|
}
|
|
|
|
}
|
|
|
|
let timestampClass = "";
|
|
let ProfileModules;
|
|
|
|
class Profile extends React.Component {
|
|
// TODO: Probably use internal Components instead of making it from scratch.
|
|
get modules() {
|
|
return ProfileModules || (ProfileModules = [BDModules.get(e => e.flex && e._horizontal)[0], BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0], BDModules.get(e => e.topSectionStreaming)[0], BDModules.get(e => e.pointerEvents)[0], BDModules.get(e => e.bot)[0], BDModules.get(e => e.activityProfile)[0], BDModules.get(e => e.muted && e.wrapper && e.base)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e.scrollerFade)[0], BDModules.get(e => e.note && Object.keys(e).length === 1)[0], BDModules.get(e => e.default && e.default.Messages)[0].default.Messages]);
|
|
}
|
|
|
|
render() {
|
|
let user = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default.getCurrentUser();
|
|
let avatarURL = user.avatarURL;
|
|
|
|
if (user.avatar && user.avatar.startsWith("a_")) {
|
|
avatarURL = user.getAvatarURL("gif");
|
|
}
|
|
|
|
let [flexModule1, stylingModule1, rootModule1, avatarModule1, nameTagModule1, activityModule1, textModule1, sizeModule1, scrollerModule1, noteModule1, Messages] = this.modules;
|
|
let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"], this.props.preview.props.settings.state.data);
|
|
timestampClass = timestampClass || activityModule1.timestamp;
|
|
|
|
let images = (() => {
|
|
if (!data["assets.large"]) return null;
|
|
let images = [];
|
|
|
|
if (data["assets.large"]) {
|
|
images.push(React.createElement("img", {
|
|
alt: "",
|
|
src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.large"]}.png`,
|
|
class: `${activityModule1.assetsLargeImageProfile} ${data["assets.small"] ? activityModule1.assetsLargeMaskProfile : ""}`
|
|
}));
|
|
}
|
|
|
|
if (data["assets.small"]) {
|
|
images.push(React.createElement("img", {
|
|
alt: "",
|
|
src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.small"]}.png`,
|
|
class: activityModule1.assetsSmallImageProfile
|
|
}));
|
|
}
|
|
|
|
if (!images.length) return null;
|
|
return React.createElement("div", {
|
|
class: activityModule1.assets
|
|
}, images);
|
|
})();
|
|
|
|
return [React.createElement("div", {
|
|
className: "lc-tab lc-tab-box-shadow"
|
|
}, React.createElement("div", {
|
|
class: `${flexModule1.flex} ${stylingModule1.vertical} ${stylingModule1.justifyStart} ${stylingModule1.alignStretch} ${stylingModule1.noWrap} ${rootModule1.root}`,
|
|
style: {
|
|
flex: "1 1 auto"
|
|
}
|
|
}, React.createElement("div", {
|
|
class: rootModule1.topSectionPlaying
|
|
}, React.createElement("header", {
|
|
class: rootModule1.header
|
|
}, React.createElement("div", {
|
|
class: `${rootModule1.avatar} ${avatarModule1.wrapper}`,
|
|
role: "img",
|
|
style: {
|
|
width: "80px",
|
|
height: "80px"
|
|
}
|
|
}, React.createElement("svg", {
|
|
width: "92",
|
|
height: "80",
|
|
viewBox: "0 0 92 80",
|
|
class: `${avatarModule1.mask} ${avatarModule1.svg}`
|
|
}, React.createElement("foreignObject", {
|
|
x: "0",
|
|
y: "0",
|
|
width: "80",
|
|
height: "80",
|
|
mask: "url(#svg-mask-avatar-status-round-80)"
|
|
}, React.createElement("img", {
|
|
src: avatarURL,
|
|
alt: " ",
|
|
class: avatarModule1.avatar
|
|
})), React.createElement(Status, null))), React.createElement("div", {
|
|
class: `${rootModule1.headerInfo}`
|
|
}, React.createElement("div", {
|
|
class: `${rootModule1.nameTag} ${nameTagModule1.nameTag}`
|
|
}, React.createElement("span", {
|
|
class: `${rootModule1.username} ${rootModule1.username}`
|
|
}, user.username), React.createElement("span", {
|
|
class: rootModule1.discriminator
|
|
}, "#", user.discriminator)), React.createElement("div", {
|
|
class: `${flexModule1.flex} ${flexModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignStretch} ${stylingModule1.noWrap} ${rootModule1.profileBadges}`,
|
|
style: {
|
|
flex: "1 1 auto"
|
|
}
|
|
}, React.createElement(Badges, null)))), React.createElement("div", {
|
|
class: rootModule1.headerFill
|
|
}, React.createElement("div", {
|
|
class: `${activityModule1.activityProfile} ${rootModule1.activity}`
|
|
}, React.createElement("h3", {
|
|
class: `${activityModule1.headerTextNormal} ${textModule1.base} ${sizeModule1.size12}`
|
|
}, Messages.USER_ACTIVITY_HEADER_PLAYING), React.createElement("div", {
|
|
class: activityModule1.bodyNormal
|
|
}, images, React.createElement("div", {
|
|
class: images ? activityModule1.contentImagesProfile : activityModule1.contentNoImagesUserPopout,
|
|
style: {
|
|
flex: "1 1 auto"
|
|
}
|
|
}, (() => {
|
|
if (!data.name) return null;
|
|
return React.createElement("h3", {
|
|
class: `${activityModule1.nameNormal} ${textModule1.base} ${sizeModule1.size14}`,
|
|
title: data.name
|
|
}, React.createElement("span", {
|
|
class: activityModule1.activityName
|
|
}, data.name));
|
|
})(), (() => {
|
|
if (!data.details) return null;
|
|
return React.createElement("div", {
|
|
title: data.title,
|
|
class: activityModule1.details
|
|
}, data.details);
|
|
})(), (() => {
|
|
if (!data.state) return null;
|
|
return React.createElement("div", {
|
|
class: activityModule1.state
|
|
}, React.createElement("span", {
|
|
title: data.state
|
|
}, data.state));
|
|
})(), (() => {
|
|
if (!data["timestamps.start"]) return null;
|
|
let timeComponent = Object(_timestampRender__WEBPACK_IMPORTED_MODULE_6__["default"])(Timestamp, Messages);
|
|
return React.createElement("div", {
|
|
class: activityModule1.timestamp
|
|
}, React.createElement(timeComponent, {
|
|
timestamps: {
|
|
end: null,
|
|
start: data["timestamps.start"]
|
|
}
|
|
}));
|
|
})()))))), React.createElement("div", {
|
|
class: rootModule1.body
|
|
}, React.createElement("div", {
|
|
class: `${scrollerModule1.scrollerWrap} ${scrollerModule1.scrollerFade}`
|
|
}, React.createElement("div", {
|
|
class: scrollerModule1.scroller
|
|
}, React.createElement("div", {
|
|
class: rootModule1.userInfoSection
|
|
}, React.createElement("div", {
|
|
class: rootModule1.userInfoSectionHeader
|
|
}, Messages.NOTE), React.createElement("div", {
|
|
class: `${rootModule1.note} ${noteModule1.note}`
|
|
}, React.createElement("textarea", {
|
|
placeholder: Messages.NOTE_PLACEHOLDER,
|
|
maxlength: "256",
|
|
autocorrect: "off",
|
|
class: BDModules.get(e => e.scrollbarGhostHairline)[0].scrollbarGhostHairline,
|
|
style: {
|
|
height: "40px"
|
|
},
|
|
disabled: true
|
|
}))), React.createElement(ConnectedAccounts, null))))))];
|
|
}
|
|
|
|
}
|
|
|
|
class ConnectedAccounts extends React.Component {
|
|
render() {
|
|
let accounts = [];
|
|
let rootModule1 = BDModules.get(e => e.topSectionStreaming)[0];
|
|
let AccountModule1 = BDModules.get(e => e.default && e.default.getAccounts)[0].default;
|
|
let accs = AccountModule1.getAccounts().filter(e => e.visibility === 1);
|
|
|
|
for (let acc of accs) {
|
|
accounts.push(React.createElement(ConnectedAccount, {
|
|
acc: acc
|
|
}));
|
|
}
|
|
|
|
if (accounts.length > 0) {
|
|
return React.createElement("div", {
|
|
class: rootModule1.userInfoSection
|
|
}, React.createElement("div", {
|
|
class: rootModule1.connectedAccounts
|
|
}, accounts));
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
}
|
|
|
|
class ConnectedAccount extends React.Component {
|
|
render() {
|
|
let [flexModule1, stylingModule1, rootModule1, flowerModule1, anchorModule1, SocialConstants] = [BDModules.get(e => e.flex && e._horizontal)[0], BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0], BDModules.get(e => e.topSectionStreaming)[0], BDModules.get(e => e.flowerStarContainer)[0], BDModules.get(e => e.anchor)[0], BDModules.get(e => e.default && e.default.get && e.default.map)[0].default];
|
|
let acc = this.props.acc;
|
|
let constantsSocial = SocialConstants.get(acc.type);
|
|
return React.createElement("div", {
|
|
class: `${flexModule1.flex} ${flexModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignCenter} ${stylingModule1.noWrap} ${rootModule1.connectedAccount}`,
|
|
style: {
|
|
flex: "0 1 auto"
|
|
}
|
|
}, React.createElement("img", {
|
|
alt: `Logo ${constantsSocial.name}`,
|
|
class: rootModule1.connectedAccountIcon,
|
|
src: constantsSocial.icon.color || constantsSocial.icon.white || constantsSocial.icon.grey
|
|
}), React.createElement("div", {
|
|
class: rootModule1.connectedAccountNameInner
|
|
}, React.createElement("div", {
|
|
class: rootModule1.connectedAccountName
|
|
}, acc.name), acc.verified ? React.createElement("span", null, React.createElement("div", {
|
|
class: `${flowerModule1.flowerStarContainer} ${rootModule1.connectedAccountVerifiedIcon}`,
|
|
style: {
|
|
width: "16px",
|
|
height: "16px"
|
|
}
|
|
}, React.createElement("svg", {
|
|
class: flowerModule1.flowerStar,
|
|
width: "16",
|
|
height: "16",
|
|
viewBox: "0 0 16 15.2"
|
|
}, 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"
|
|
})), React.createElement("div", {
|
|
class: flowerModule1.childContainer
|
|
}, React.createElement("svg", {
|
|
width: "16",
|
|
height: "16",
|
|
viewBox: "0 0 16 15.2"
|
|
}, React.createElement("path", {
|
|
d: "M7.4,11.17,4,8.62,5,7.26l2,1.53L10.64,4l1.36,1Z",
|
|
fill: "#ffffff"
|
|
}))))) : null), React.createElement("a", {
|
|
class: `${anchorModule1.anchor} ${anchorModule1.anchorUnderlineOnHover}`,
|
|
rel: "noreferrer noopener",
|
|
target: "_blank",
|
|
role: "button",
|
|
tabindex: "0"
|
|
}, React.createElement("svg", {
|
|
class: rootModule1.connectedAccountOpenIcon,
|
|
width: "24",
|
|
height: "24",
|
|
viewBox: "0 0 24 24"
|
|
}, React.createElement("path", {
|
|
fill: "currentColor",
|
|
d: "M10 5V3H5.375C4.06519 3 3 4.06519 3 5.375V18.625C3 19.936 4.06519 21 5.375 21H18.625C19.936 21 21 19.936 21 18.625V14H19V19H5V5H10Z"
|
|
}), React.createElement("path", {
|
|
fill: "currentColor",
|
|
d: "M21 2.99902H14V4.99902H17.586L9.29297 13.292L10.707 14.706L19 6.41302V9.99902H21V2.99902Z"
|
|
}))));
|
|
}
|
|
|
|
}
|
|
|
|
class Badges extends React.Component {
|
|
render() {
|
|
let user = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default.getCurrentUser();
|
|
let rootModule = BDModules.get(e => e.topSectionStreaming)[0];
|
|
let UserFlags = BDModules.get(e => e.UserFlags)[0].UserFlags;
|
|
let badges = [];
|
|
let serialized = [];
|
|
|
|
for (let flagName in UserFlags) {
|
|
if (user.hasFlag(UserFlags[flagName])) serialized.push(flagName);
|
|
}
|
|
|
|
for (let flagName of serialized) {
|
|
let searchable = `profileBadge${flagName.toLowerCase().replace(/_/g, " ").split(" ").map(e => e[0].toUpperCase() + e.slice(1)).join("")}`;
|
|
searchable = searchable.replace("HypesquadOnline", "HypeSquadOnline");
|
|
if (!rootModule[searchable]) continue;
|
|
badges.push(React.createElement(Badge, {
|
|
name: searchable
|
|
}));
|
|
}
|
|
|
|
if (user.hasPremiumSubscription) {
|
|
badges.push(React.createElement(Badge, {
|
|
name: "profileBadgePremium"
|
|
}));
|
|
}
|
|
|
|
return badges;
|
|
}
|
|
|
|
}
|
|
|
|
class Badge extends React.Component {
|
|
render() {
|
|
let rootModule1 = BDModules.get(e => e.topSectionStreaming)[0];
|
|
return React.createElement("div", {
|
|
class: rootModule1.profileBadgeWrapper
|
|
}, React.createElement("div", null, React.createElement("div", {
|
|
class: "",
|
|
role: "button",
|
|
tabindex: "0"
|
|
}, React.createElement("div", {
|
|
class: `${rootModule1.profileBadge} ${rootModule1[this.props.name]}`
|
|
}))));
|
|
}
|
|
|
|
}
|
|
|
|
class Timestamp extends React.Component {
|
|
render() {
|
|
return React.createElement("div", {
|
|
className: timestampClass
|
|
}, this.props.message);
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/publicservers/layer.js":
|
|
/*!***************************************!*\
|
|
!*** ./src/ui/publicservers/layer.js ***!
|
|
\***************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Layer; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _modules_domtools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../modules/domtools */ "./src/modules/domtools.js");
|
|
|
|
|
|
class V2C_Layer extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
this.keyupListener = this.keyupListener.bind(this);
|
|
}
|
|
|
|
keyupListener(e) {
|
|
if (e.which === 27) {
|
|
_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactDom.unmountComponentAtNode(this.refs.root.parentNode);
|
|
}
|
|
}
|
|
|
|
componentDidMount() {
|
|
window.addEventListener("keyup", this.keyupListener);
|
|
const thisNode = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query(`#${this.props.id}`);
|
|
_modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({
|
|
duration: 200,
|
|
update: function (progress) {
|
|
thisNode.style.transform = `scale(${1.1 - 0.1 * progress}) translateZ(0px)`;
|
|
thisNode.style.opacity = progress;
|
|
|
|
if (progress == 1) {
|
|
setImmediate(() => {
|
|
thisNode.style.transform = "";
|
|
thisNode.style.opacity = "";
|
|
});
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
window.removeEventListener("keyup", this.keyupListener);
|
|
const thisNode = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query(`#${this.props.id}`);
|
|
_modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({
|
|
duration: 200,
|
|
update: function (progress) {
|
|
thisNode.style.transform = `scale(${1.1 - 0.1 * (1 - progress)}) translateZ(0px)`;
|
|
thisNode.style.opacity = 1 - progress;
|
|
|
|
if (progress == 1) {
|
|
setImmediate(() => {
|
|
thisNode.remove();
|
|
});
|
|
}
|
|
}
|
|
});
|
|
const layer = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query(".publicServersOpen");
|
|
layer.classList.remove("publicServersOpen");
|
|
_modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({
|
|
duration: 200,
|
|
update: function (progress) {
|
|
layer.style.transform = `scale(${0.07 * progress + 0.93}) translateZ(0px)`;
|
|
layer.style.opacity = progress;
|
|
|
|
if (progress == 1) {
|
|
setImmediate(() => {
|
|
layer.style.transform = "";
|
|
layer.style.opacity = "";
|
|
});
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
componentWillMount() {
|
|
const layer = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query("[class*=\"layer-\"]");
|
|
layer.classList.add("publicServersOpen");
|
|
_modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({
|
|
duration: 200,
|
|
update: function (progress) {
|
|
layer.style.transform = `scale(${0.07 * (1 - progress) + 0.93}) translateZ(0px)`;
|
|
layer.style.opacity = 1 - progress;
|
|
}
|
|
});
|
|
}
|
|
|
|
render() {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "layer bd-layer " + BDModules.get(e => e.layer && e.animating)[0].layer,
|
|
id: this.props.id,
|
|
ref: "root",
|
|
style: {
|
|
opacity: 0,
|
|
transform: "scale(1.1) translateZ(0px)"
|
|
}
|
|
}, this.props.children);
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/publicservers/publicServers.js":
|
|
/*!***********************************************!*\
|
|
!*** ./src/ui/publicservers/publicServers.js ***!
|
|
\***********************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_PublicServers; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools */ "./src/ui/tools.js");
|
|
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../settingsTitle */ "./src/ui/settingsTitle.js");
|
|
/* harmony import */ var _tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../tabBarSeparator */ "./src/ui/tabBarSeparator.js");
|
|
/* harmony import */ var _tabBarHeader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../tabBarHeader */ "./src/ui/tabBarHeader.js");
|
|
/* harmony import */ var _tabBarItem__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../tabBarItem */ "./src/ui/tabBarItem.js");
|
|
/* harmony import */ var _serverCard__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./serverCard */ "./src/ui/publicservers/serverCard.js");
|
|
/* harmony import */ var _sidebarView__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./sidebarView */ "./src/ui/publicservers/sidebarView.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class V2C_PublicServers extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
this.setInitialState();
|
|
this.close = this.close.bind(this);
|
|
this.changeCategory = this.changeCategory.bind(this);
|
|
this.search = this.search.bind(this);
|
|
this.searchKeyDown = this.searchKeyDown.bind(this);
|
|
this.checkConnection = this.checkConnection.bind(this);
|
|
this.join = this.join.bind(this);
|
|
this.connect = this.connect.bind(this);
|
|
this.GuildStore = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["getGuilds"]);
|
|
this.AvatarDefaults = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["getUserAvatarURL", "DEFAULT_AVATARS"]);
|
|
this.InviteActions = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["acceptInvite"]);
|
|
this.SortedGuildStore = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["getSortedGuilds"]);
|
|
}
|
|
|
|
componentDidMount() {
|
|
this.checkConnection();
|
|
}
|
|
|
|
setInitialState() {
|
|
this.state = {
|
|
selectedCategory: -1,
|
|
title: "Loading...",
|
|
loading: true,
|
|
servers: [],
|
|
next: null,
|
|
connection: {
|
|
state: 0,
|
|
user: null
|
|
}
|
|
};
|
|
}
|
|
|
|
close() {
|
|
_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactDom.unmountComponentAtNode(document.getElementById(this.props.rootId));
|
|
}
|
|
|
|
search(query, clear) {
|
|
const self = this;
|
|
fetch(`${self.endPoint}${query}${query ? "&schema=new" : "?schema=new"}`, {
|
|
method: "get"
|
|
}).then(async res => {
|
|
if (res.status !== 200) throw await res.text();
|
|
let data = await res.json();
|
|
let servers = data.results.reduce((arr, server) => {
|
|
server.joined = false;
|
|
arr.push(server); // arr.push(<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: "7500+",
|
|
members: "20000+",
|
|
categories: ["community", "programming", "support"],
|
|
description: "Official BetterDiscord server for support etc",
|
|
identifier: "86004744966914048",
|
|
iconUrl: "https://cdn.discordapp.com/icons/86004744966914048/292e7f6bfff2b71dfd13e508a859aedd.webp",
|
|
nativejoin: true,
|
|
invite_code: "0Tmfo5ZbORCRqbAd",
|
|
pinned: true
|
|
};
|
|
const server2 = {
|
|
name: "Lightcord",
|
|
online: "30+",
|
|
members: "50+",
|
|
categories: ["community", "programming", "support"],
|
|
description: "Official Lightcord server for support etc",
|
|
identifier: "86004744966914048",
|
|
iconUrl: "https://avatars3.githubusercontent.com/u/65690058?s=200&v=4",
|
|
nativejoin: true,
|
|
invite_code: "7eFff2A",
|
|
pinned: true
|
|
};
|
|
const guildList = this.SortedGuildStore.getFlattenedGuildIds();
|
|
const defaultList = this.AvatarDefaults.DEFAULT_AVATARS;
|
|
return [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_serverCard__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
|
server: server2,
|
|
pinned: true,
|
|
join: this.join,
|
|
guildList: guildList,
|
|
fallback: defaultList[Math.floor(Math.random() * 5)]
|
|
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_serverCard__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
|
server: server,
|
|
pinned: true,
|
|
join: this.join,
|
|
guildList: guildList,
|
|
fallback: defaultList[Math.floor(Math.random() * 5)]
|
|
})];
|
|
}
|
|
|
|
get endPoint() {
|
|
return "https://search.discordservers.com";
|
|
}
|
|
|
|
get joinEndPoint() {
|
|
return "https://j.discordservers.com";
|
|
}
|
|
|
|
get connectEndPoint() {
|
|
return "https://join.discordservers.com/connect";
|
|
}
|
|
|
|
async checkConnection() {
|
|
const self = this;
|
|
|
|
try {
|
|
const response = await fetch(`https://auth.discordservers.com/info`, {
|
|
method: "GET",
|
|
credentials: "include",
|
|
mode: "cors",
|
|
headers: {
|
|
"Accept": "application/json",
|
|
"Content-Type": "application/json"
|
|
}
|
|
});
|
|
const data = await response.json();
|
|
self.setState({
|
|
selectedCategory: 0,
|
|
connection: {
|
|
state: 2,
|
|
user: data
|
|
}
|
|
});
|
|
self.search("", true);
|
|
} catch (error) {
|
|
console.error(error);
|
|
self.setState({
|
|
title: "Not connected to discordservers.com!",
|
|
loading: true,
|
|
selectedCategory: -1,
|
|
connection: {
|
|
state: 1,
|
|
user: null
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
render() {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_sidebarView__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
|
ref: "sbv"
|
|
}, this.component);
|
|
}
|
|
|
|
get component() {
|
|
return {
|
|
sidebar: {
|
|
component: this.sidebar
|
|
},
|
|
content: {
|
|
component: this.content
|
|
},
|
|
tools: {
|
|
component: _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tools__WEBPACK_IMPORTED_MODULE_1__["default"], {
|
|
key: "pt",
|
|
ref: "tools",
|
|
onClick: this.close
|
|
})
|
|
}
|
|
};
|
|
}
|
|
|
|
get sidebar() {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "sidebar",
|
|
key: "ps"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-tab-bar SIDE"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-tab-bar-header",
|
|
style: {
|
|
fontSize: "16px"
|
|
}
|
|
}, "Public Servers"), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), this.searchInput, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarHeader__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
|
text: "Categories"
|
|
}), this.categoryButtons.map((value, index) => {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarItem__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
|
id: index,
|
|
onClick: this.changeCategory,
|
|
key: index,
|
|
text: value,
|
|
selected: this.state.selectedCategory === index
|
|
});
|
|
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), this.footer, this.connection));
|
|
}
|
|
|
|
get searchInput() {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-form-item"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-text-input flex-vertical",
|
|
style: {
|
|
width: "172px",
|
|
marginLeft: "10px"
|
|
}
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("input", {
|
|
ref: "searchinput",
|
|
onKeyDown: this.searchKeyDown,
|
|
onChange: () => {},
|
|
type: "text",
|
|
className: "input default",
|
|
placeholder: "Search...",
|
|
maxLength: "50"
|
|
})));
|
|
}
|
|
|
|
searchKeyDown(e) {
|
|
const self = this;
|
|
if (self.state.loading || e.which !== 13) return;
|
|
self.setState({
|
|
loading: true,
|
|
title: "Loading...",
|
|
term: e.target.value
|
|
});
|
|
let query = `?term=${e.target.value}`;
|
|
|
|
if (self.state.selectedCategory !== 0) {
|
|
query += `&category=${self.categoryButtons[self.state.selectedCategory]}`;
|
|
}
|
|
|
|
self.search(query, true);
|
|
}
|
|
|
|
get categoryButtons() {
|
|
return ["All", "FPS Games", "MMO Games", "Strategy Games", "MOBA Games", "RPG Games", "Tabletop Games", "Sandbox Games", "Simulation Games", "Music", "Community", "Language", "Programming", "Other"];
|
|
}
|
|
|
|
changeCategory(id) {
|
|
const self = this;
|
|
if (self.state.loading) return;
|
|
self.refs.searchinput.value = "";
|
|
self.setState({
|
|
loading: true,
|
|
selectedCategory: id,
|
|
title: "Loading...",
|
|
term: null
|
|
});
|
|
|
|
if (id === 0) {
|
|
self.search("", true);
|
|
return;
|
|
}
|
|
|
|
self.search(`?category=${self.categoryButtons[id]}`, true);
|
|
}
|
|
|
|
get content() {
|
|
const self = this;
|
|
const guildList = this.SortedGuildStore.getFlattenedGuildIds();
|
|
const defaultList = this.AvatarDefaults.DEFAULT_AVATARS;
|
|
if (self.state.connection.state === 1) return self.notConnected;
|
|
let columnModule = BDModules.get(e => e.contentColumnDefault)[0];
|
|
return [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
ref: "content",
|
|
key: "pc",
|
|
className: columnModule.contentColumn + " " + columnModule.contentColumn + " content-column default"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
|
text: self.state.title
|
|
}), self.bdServer, self.state.servers.map(server => {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_serverCard__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
|
key: server.identifier,
|
|
server: server,
|
|
join: self.join,
|
|
guildList: guildList,
|
|
fallback: defaultList[Math.floor(Math.random() * 5)]
|
|
});
|
|
}), self.state.next && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
|
|
type: "button",
|
|
onClick: () => {
|
|
if (self.state.loading) return;
|
|
self.setState({
|
|
loading: true
|
|
});
|
|
self.search(self.state.next, false);
|
|
},
|
|
className: "ui-button filled brand small grow",
|
|
style: {
|
|
width: "100%",
|
|
marginTop: "10px",
|
|
marginBottom: "10px"
|
|
}
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-button-contents"
|
|
}, self.state.loading ? "Loading" : "Load More")), self.state.servers.length > 0 && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
|
text: self.state.title
|
|
}))];
|
|
}
|
|
|
|
get notConnected() {
|
|
const self = this; //return BDV2.react.createElement(SettingsTitle, { text: self.state.title });
|
|
|
|
let columnModule = BDModules.get(e => e.contentColumnDefault)[0];
|
|
return [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
key: "ncc",
|
|
ref: "content",
|
|
className: columnModule.contentColumn + " " + columnModule.contentColumn + " content-column default"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h2", {
|
|
className: "ui-form-title h2 margin-reset margin-bottom-20"
|
|
}, "Not connected to discordservers.com!", _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
|
|
onClick: self.connect,
|
|
type: "button",
|
|
className: "ui-button filled brand small grow",
|
|
style: {
|
|
display: "inline-block",
|
|
minHeight: "18px",
|
|
marginLeft: "10px",
|
|
lineHeight: "14px"
|
|
}
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-button-contents"
|
|
}, "Connect"))), self.bdServer)];
|
|
}
|
|
|
|
get footer() {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-tab-bar-header"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("a", {
|
|
href: "https://discordservers.com",
|
|
target: "_blank"
|
|
}, "Discordservers.com"));
|
|
}
|
|
|
|
get connection() {
|
|
const self = this;
|
|
const {
|
|
connection
|
|
} = self.state;
|
|
if (connection.state !== 2) return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null);
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", {
|
|
style: {
|
|
color: "#b9bbbe",
|
|
fontSize: "10px",
|
|
marginLeft: "10px"
|
|
}
|
|
}, "Connected as: ", `${connection.user.username}#${connection.user.discriminator}`), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
style: {
|
|
padding: "5px 10px 0 10px"
|
|
}
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
|
|
style: {
|
|
width: "100%",
|
|
minHeight: "20px"
|
|
},
|
|
type: "button",
|
|
className: "ui-button filled brand small grow"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-button-contents",
|
|
onClick: self.connect
|
|
}, "Reconnect"))));
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/publicservers/serverCard.js":
|
|
/*!********************************************!*\
|
|
!*** ./src/ui/publicservers/serverCard.js ***!
|
|
\********************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_ServerCard; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
|
|
|
|
class V2C_ServerCard extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
if (!this.props.server.iconUrl) this.props.server.iconUrl = this.props.fallback;
|
|
this.state = {
|
|
imageError: false,
|
|
joined: this.props.guildList.includes(this.props.server.identifier)
|
|
};
|
|
}
|
|
|
|
render() {
|
|
const {
|
|
server
|
|
} = this.props;
|
|
let cardModule = BDModules.get(e => e.card && e.cardPrimary)[0];
|
|
let flexModule = BDModules.get(e => e.flexChild && e._horizontalReverse)[0];
|
|
let wrapModule = BDModules.get(e => e.noWrap && !e.streamerModeEnabled)[0];
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", // cardPrimary-1Hv-to
|
|
{
|
|
className: `${cardModule.card} ${cardModule.cardPrimary} ${BDModules.get(e => e.marginBottom8)[0].marginBottom8} bd-server-card${server.pinned ? " bd-server-card-pinned" : ""}`
|
|
}, // BDV2.react.createElement(
|
|
// "div",
|
|
// { className: "flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY flex-1O1GKY directionRow-3v3tfG justifyStart-2yIZo0 alignStretch-1hwxMa noWrap-3jynv6" },
|
|
_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("img", {
|
|
ref: "img",
|
|
className: "bd-server-image",
|
|
src: server.iconUrl,
|
|
onError: this.handleError.bind(this),
|
|
draggable: false
|
|
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: flexModule.flexChild + " bd-server-content"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: flexModule.horizontal + " " + wrapModule.noWrap + " bd-server-header"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h5", {
|
|
className: "h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-name"
|
|
}, server.name), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h5", {
|
|
className: "h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-member-count"
|
|
}, server.members, " Members")), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: flexModule.horizontal + " " + wrapModule.noWrap
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "scrollerWrap-2lJEkd scrollerThemed-2oenus themeGhostHairline-DBD-2d scrollerFade-1Ijw5y bd-server-description-container"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "scroller-2FKFPG scroller bd-server-description"
|
|
}, server.description))), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY directionRow-3v3tfG noWrap-3jynv6 bd-server-footer"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "flexChild-faoVW3 bd-server-tags",
|
|
style: {
|
|
flex: "1 1 auto"
|
|
}
|
|
}, server.categories.join(", ")), this.state.joined && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
|
|
type: "button",
|
|
className: "button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN colorGreen-29iAKY",
|
|
style: {
|
|
minHeight: "12px",
|
|
marginTop: "4px",
|
|
backgroundColor: "#3ac15c"
|
|
}
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-button-contents"
|
|
}, "Joined")), server.error && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
|
|
type: "button",
|
|
className: "button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN disabled-9aF2ug",
|
|
style: {
|
|
minHeight: "12px",
|
|
marginTop: "4px",
|
|
backgroundColor: "#c13a3a"
|
|
}
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-button-contents"
|
|
}, "Error")), !server.error && !this.state.joined && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
|
|
type: "button",
|
|
className: "button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN",
|
|
style: {
|
|
minHeight: "12px",
|
|
marginTop: "4px"
|
|
},
|
|
onClick: () => {
|
|
this.join();
|
|
}
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-button-contents"
|
|
}, "Join")))) // )
|
|
);
|
|
}
|
|
|
|
handleError() {
|
|
this.props.server.iconUrl = this.props.fallback;
|
|
this.setState({
|
|
imageError: true
|
|
});
|
|
}
|
|
|
|
join() {
|
|
this.props.join(this); //this.setState({joined: true});
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/publicservers/sidebarView.js":
|
|
/*!*********************************************!*\
|
|
!*** ./src/ui/publicservers/sidebarView.js ***!
|
|
\*********************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SidebarView; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _scroller__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../scroller */ "./src/ui/scroller.js");
|
|
|
|
|
|
class V2C_SidebarView extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
}
|
|
|
|
render() {
|
|
const {
|
|
sidebar,
|
|
content,
|
|
tools
|
|
} = this.props.children;
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "standardSidebarView-3F1I7i ui-standard-sidebar-view"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "sidebarRegion-VFTUkN sidebar-region"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_scroller__WEBPACK_IMPORTED_MODULE_1__["default"], {
|
|
key: "sidebarScroller",
|
|
ref: "sidebarScroller",
|
|
sidebar: true,
|
|
fade: sidebar.fade || true,
|
|
dark: sidebar.dark || true
|
|
}, sidebar.component)), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "contentRegion-3nDuYy content-region"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "contentTransitionWrap-3hqOEW content-transition-wrap"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "scrollerWrap-2lJEkd firefoxFixScrollFlex-cnI2ix contentRegionScrollerWrap-3YZXdm content-region-scroller-wrap scrollerThemed-2oenus themeGhost-28MSn0 scrollerTrack-1ZIpsv"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "scroller-2FKFPG firefoxFixScrollFlex-cnI2ix contentRegionScroller-26nc1e content-region-scroller scroller",
|
|
ref: "contentScroller"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "contentColumn-2hrIYH contentColumnDefault-1VQkGM content-column default"
|
|
}, content.component), tools.component)))));
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/reloadIcon.js":
|
|
/*!******************************!*\
|
|
!*** ./src/ui/reloadIcon.js ***!
|
|
\******************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_ReloadIcon; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
|
|
class V2C_ReloadIcon extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
}
|
|
|
|
render() {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("svg", {
|
|
xmlns: "http://www.w3.org/2000/svg",
|
|
viewBox: "0 0 24 24",
|
|
fill: "#dcddde",
|
|
className: "bd-reload " + this.props.className,
|
|
onClick: this.props.onClick,
|
|
style: {
|
|
width: this.props.size || "24px",
|
|
height: this.props.size || "24px"
|
|
}
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
|
|
d: "M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"
|
|
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
|
|
fill: "none",
|
|
d: "M0 0h24v24H0z"
|
|
}));
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/scroller.js":
|
|
/*!****************************!*\
|
|
!*** ./src/ui/scroller.js ***!
|
|
\****************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Scroller; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
|
|
class V2C_Scroller extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
}
|
|
|
|
render() {
|
|
//scrollerWrap-2lJEkd scrollerThemed-2oenus themeGhostHairline-DBD-2d scrollerFade-1Ijw5y
|
|
let scrollerModule1 = BDModules.get(e => e.scrollerHorizontal)[0];
|
|
let scrollerModule2 = BDModules.get(e => e.sidebarRegionScroller)[0];
|
|
let wrapperClass = `${scrollerModule1.scrollerWrap} ${scrollerModule1.scrollerThemed} ${scrollerModule1.themeGhostHairline}${this.props.fade ? " " + scrollerModule1.scrollerFade : ""}`;
|
|
let scrollerClass = scrollerModule1.scroller + " scroller";
|
|
/* fuck */
|
|
|
|
if (this.props.sidebar) scrollerClass += ` ${scrollerModule2.sidebarRegionScroller} sidebar-region-scroller`;
|
|
|
|
if (this.props.contentColumn) {
|
|
scrollerClass += " " + scrollerModule2.contentRegionScroller + " content-region-scroller";
|
|
/* fuck */
|
|
|
|
wrapperClass = `${scrollerModule1.scrollerWrap} ${scrollerModule2.contentRegionScrollerWrap} content-region-scroller-wrap ${scrollerModule1.scrollerThemed} ${scrollerModule1.themeGhost} ${scrollerModule1.scrollerTrack}`;
|
|
}
|
|
|
|
const {
|
|
children
|
|
} = this.props;
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
key: "scrollerwrap",
|
|
className: wrapperClass
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
key: "scroller",
|
|
ref: "scroller",
|
|
className: scrollerClass
|
|
}, children));
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./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];
|
|
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", {
|
|
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"], {
|
|
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/timestampRender.js":
|
|
/*!***********************************!*\
|
|
!*** ./src/ui/timestampRender.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");
|
|
|
|
|
|
|
|
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react;
|
|
const intervalModule1 = BDModules.get(e => e.Interval)[0];
|
|
/* harmony default export */ __webpack_exports__["default"] = (function (component, Messages) {
|
|
class TimeRender extends React.PureComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
this._interval = new intervalModule1.Interval();
|
|
this.state = Object.assign({}, this.getUpdatedTime());
|
|
}
|
|
|
|
componentDidMount() {
|
|
let self = this;
|
|
|
|
this._interval.start(1e3, function () {
|
|
return self.setState(self.getUpdatedTime());
|
|
});
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
this._interval.stop();
|
|
}
|
|
|
|
componentDidUpdate(activity) {
|
|
if (activity.timestamps.end === this.props.timestamps.end && activity.timestamps.start === this.props.timestamps.start) return;
|
|
this.setState(this.getUpdatedTime());
|
|
}
|
|
|
|
getUpdatedTime() {
|
|
let timestamps = this.props.timestamps;
|
|
let now = Date.now() / 1e3;
|
|
|
|
if (null != timestamps.end) {
|
|
return this.getDiff(now, checkUnix(timestamps.end) / 1e3);
|
|
}
|
|
|
|
if (null != timestamps.start) {
|
|
return this.getDiff(checkUnix(timestamps.start) / 1e3, now);
|
|
}
|
|
|
|
return {
|
|
hours: 0,
|
|
minutes: 0,
|
|
seconds: 0
|
|
};
|
|
}
|
|
|
|
renderTime(number, removeZero) {
|
|
if (removeZero === undefined) removeZero = false;
|
|
if (removeZero && number <= 0) return -1;
|
|
if (number < 10) return "0" + number;
|
|
return number;
|
|
}
|
|
|
|
getDiff(timestamp, now) {
|
|
let hours = Math.max(now - timestamp, 0);
|
|
let seconds = Math.floor(hours) % 60;
|
|
let minutes = Math.floor(hours / 60) % 60;
|
|
return {
|
|
hours: Math.floor(hours / 3600) % 24,
|
|
minutes,
|
|
seconds
|
|
};
|
|
}
|
|
|
|
render() {
|
|
let props = this.props;
|
|
let timestamps = props.timestamps;
|
|
|
|
let usedProps = function (props, items) {
|
|
if (null == props) return {};
|
|
let timestamps = {};
|
|
let keys = Object.keys(props);
|
|
|
|
for (let i = 0; i < keys.length; i++) {
|
|
let key = keys[i];
|
|
|
|
if (!items.indexOf(key) >= 0) {
|
|
timestamps[key] = props[key];
|
|
}
|
|
}
|
|
|
|
return timestamps;
|
|
}(props, ["timestamps"]);
|
|
|
|
let state = this.state;
|
|
let hours = state.hours;
|
|
let minutes = state.minutes;
|
|
let seconds = state.seconds;
|
|
let data = {
|
|
hours: this.renderTime(hours, !0),
|
|
minutes: this.renderTime(minutes),
|
|
seconds: this.renderTime(seconds)
|
|
};
|
|
|
|
if (timestamps.end !== null) {
|
|
return React.createElement(component, Object.assign({}, usedProps, {
|
|
message: Messages.USER_ACTIVITY_TIMESTAMP_END.format(data)
|
|
}));
|
|
}
|
|
|
|
if (timestamps.start !== null) {
|
|
return React.createElement(component, Object.assign({}, usedProps, {
|
|
message: Messages.USER_ACTIVITY_TIMESTAMP_START.format(data)
|
|
}));
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
}
|
|
|
|
return TimeRender;
|
|
});
|
|
;
|
|
|
|
function checkUnix(e) {
|
|
return ("" + e).length < 13 ? 1e3 * e : e;
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./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
|
|
*/
|
|
|
|
//<div class="layer-v9HyYc disabledPointerEvents-1ptgTB" style="position: absolute; left: 237px; bottom: 51px;">
|
|
// <div class="tooltip-2QfLtc tooltipTop-XDDSxx tooltipBlack-PPG47z tooltipDisablePointerEvents-3eaBGN" style="opacity: 1; transform: none;">
|
|
// <div class="tooltipPointer-3ZfirK"></div>
|
|
// <div class="tooltipContent-bqVLWK">User Settings</div>
|
|
// </div>
|
|
//</div>
|
|
//<div class="layer-v9HyYc" style="top: 860px; left: 632.5px;">
|
|
// <div class="tooltip-2QfLtc tooltipBlack-PPG47z tooltipTop-XDDSxx">
|
|
// <div class="tooltipPointer-3ZfirK"></div>
|
|
// Changelog
|
|
// </div>
|
|
//</div>
|
|
|
|
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`;
|
|
};
|
|
/* <div class="layer-v9HyYc da-layer" style="left: 234.5px; bottom: 51px;">
|
|
<div class="tooltip-2QfLtc da-tooltip tooltipTop-XDDSxx tooltipBlack-PPG47z">
|
|
<div class="tooltipPointer-3ZfirK da-tooltipPointer"></div>
|
|
User Settings
|
|
</div>
|
|
</div> */
|
|
|
|
|
|
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
|
|
*/
|
|
constructor(node, text, options = {}) {
|
|
const {
|
|
style = "black",
|
|
side = "top",
|
|
preventFlip = false,
|
|
disabled = false
|
|
} = 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);
|
|
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("." + BDModules.get(e => e.popouts)[0].popouts.split(" ")[0] + " ~ ." + BDModules.get(e => e.layerContainer)[0].layerContainer.split(" ")[0]);
|
|
}
|
|
/** 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");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "mkdirp":
|
|
/*!*************************!*\
|
|
!*** external "mkdirp" ***!
|
|
\*************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("mkdirp");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "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");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "rimraf":
|
|
/*!*************************!*\
|
|
!*** external "rimraf" ***!
|
|
\*************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("rimraf");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "yauzl":
|
|
/*!************************!*\
|
|
!*** external "yauzl" ***!
|
|
\************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("yauzl");
|
|
|
|
/***/ })
|
|
|
|
/******/ });
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvMGdsb2JhbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL2xvYWRpbmdJY29uLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbG9jYWxTdG9yYWdlRml4LmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy8yNGhvdXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL0FudGlBZERNLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9DdXN0b21SaWNoUHJlc2VuY2UuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2JkQXBpLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9iZEV2ZW50cy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvYmx1clByaXZhdGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NsYXNzTm9ybWFsaXplci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvY29sb3JlZFRleHQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9jb3JlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9kYXRhU3RvcmUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rldk1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc2FibGVUeXBpbmcuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc3RhbnQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2RvbXRvb2xzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9lbW9qaU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvcGx1Z2luQ2VydGlmaWVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9wbHVnaW5Nb2R1bGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3B1YmxpY1NlcnZlcnMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWwuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWxTaWRlYmFyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy90aGVtZU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3YyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy92b2ljZU1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL0xpZ2h0Y29yZFVzZXIuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL2J1Z19odW50ZXIuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL2NpcmN1cy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9zdmcvbGlnaHRjb3JkLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL0FjY291bnRJbmZvcy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9BcGlQcmV2aWV3LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2FkZG9uY2FyZC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9hZGRvbmxpc3QuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvYmRMb2dvLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY2hlY2tib3guanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jb21wb25lbnRzL2Ryb3Bkb3duLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbXBvbmVudHMvc2VhcmNoLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbXBvbmVudHMvc3dpdGNoLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbnRlbnRDb2x1bW4uanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jc3NFZGl0b3IuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jc3NFZGl0b3JEZXRhY2hlZC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2Vycm9yQm91bmRhcnkuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9kZWxldGUuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvaWNvbnMvZG93bmFycm93LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2ljb25zL2VkaXQuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvaWNvbnMvaGlzdG9yeS5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9zZWFyY2guanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvbWFyZ2ludG9wLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3ByZXNlbmNlU2V0dGluZ3MuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcHVibGljc2VydmVycy9sYXllci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3B1YmxpY3NlcnZlcnMvcHVibGljU2VydmVycy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3B1YmxpY3NlcnZlcnMvc2VydmVyQ2FyZC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3B1YmxpY3NlcnZlcnMvc2lkZWJhclZpZXcuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9yZWxvYWRJY29uLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2Nyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zZWN0aW9uZWRTZXR0aW5nc1BhbmVsLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2V0dGluZ3NHcm91cC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3NldHRpbmdzVGl0bGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zd2l0Y2guanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90YWJCYXJIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90YWJCYXJJdGVtLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdGFiQmFyU2VwYXJhdG9yLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdGltZXN0YW1wUmVuZGVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdG9vbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90b29sdGlwLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdG9vbHRpcFdyYXAuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS94U3ZnLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJjcnlwdG9cIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwiZWxlY3Ryb25cIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwiZXZlbnRzXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcImZzXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcIm1rZGlycFwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJtb2R1bGVcIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwibm9kZS1mZXRjaFwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJwYXRoXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcInJpbXJhZlwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJ5YXV6bFwiIl0sIm5hbWVzIjpbIm1pbmltdW1EaXNjb3JkVmVyc2lvbiIsImN1cnJlbnREaXNjb3JkVmVyc2lvbiIsIndpbmRvdyIsIkRpc2NvcmROYXRpdmUiLCJyZW1vdGVBcHAiLCJnZXRWZXJzaW9uIiwibWluU3VwcG9ydGVkVmVyc2lvbiIsImJiZFZlcnNpb24iLCJMQ0NoYW5lbG9nIiwiZGVzY3JpcHRpb24iLCJjaGFuZ2VzIiwidGl0bGUiLCJpdGVtcyIsImltYWdlIiwic3VidGl0bGUiLCJyZW1vdGUiLCJnZXRHbG9iYWwiLCJ2ZXJzaW9uIiwiZm9vdGVyIiwiVGV4dEVsZW1lbnQiLCJXZWJwYWNrTW9kdWxlcyIsImZpbmRCeURpc3BsYXlOYW1lIiwiTW9kYWxTdGFjayIsImZpbmRCeVByb3BzIiwiQW5jaG9yIiwiZmluZCIsIm0iLCJkaXNwbGF5TmFtZSIsIkFuY2hvckNsYXNzZXMiLCJhbmNob3IiLCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyIiwiam9pblN1cHBvcnRTZXJ2ZXIiLCJjbGljayIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwicG9wIiwiQkRWMiIsImpvaW5MQyIsInN1cHBvcnRMaW5rIiwiUmVhY3QiLCJjcmVhdGVFbGVtZW50Iiwib25DbGljayIsImNsYXNzTmFtZSIsInNpemUiLCJTaXplcyIsIlNNQUxMIiwiY29sb3IiLCJDb2xvcnMiLCJTVEFOREFSRCIsImJiZENoYW5nZWxvZyIsInR5cGUiLCJzZXR0aW5ncyIsImlkIiwiaW5mbyIsImltcGxlbWVudGVkIiwiaGlkZGVuIiwiY2F0IiwiY2F0ZWdvcnkiLCJleHBlcmltZW50YWwiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJkZWZhdWx0Q29va2llIiwic2V0dGluZ3NDb29raWUiLCJzZXR0aW5nc1JQQyIsImRlZmF1bHRSUEMiLCJEYXRlIiwibm93IiwiYmRwbHVnaW5FcnJvcnMiLCJiZHRoZW1lRXJyb3JzIiwiYmRDb25maWciLCJPYmplY3QiLCJjcmVhdGUiLCJCZXR0ZXJEaXNjb3JkQ29uZmlnIiwiYmR0aGVtZXMiLCJiZHBsdWdpbnMiLCJwbHVnaW5Db29raWUiLCJ0aGVtZUNvb2tpZSIsImxvY2FsU3RvcmFnZUZpeCIsImxvYWRpbmdJY29uIiwiZGVwcmVjYXRlR2xvYmFsIiwia2V5IiwidmFsdWUiLCJkZWZpbmVQcm9wZXJ0eSIsImdldCIsIlV0aWxzIiwid2FybiIsImdsb2JhbEtleXMiLCJrZXlzIiwiR2xvYmFscyIsInBsdWdpbk1vZHVsZSIsInRoZW1lTW9kdWxlIiwiQkRFdmVudHMiLCJzZXR0aW5nc1BhbmVsIiwiRGF0YVN0b3JlIiwiQ29udGVudE1hbmFnZXIiLCJDbGFzc05vcm1hbGl6ZXIiLCJCZEFwaSIsIkNvcmUiLCJDb3JlV3JhcHBlciIsImNvbnN0cnVjdG9yIiwic2V0Q29uZmlnIiwiaW5pdCIsInYyTG9hZGVyIiwiZG9jdW1lbnQiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJjb250ZW50V2luZG93R2V0dGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiSFRNTElGcmFtZUVsZW1lbnQiLCJwcm90b3R5cGUiLCJjb250ZW50V2luZG93IiwiUmVmbGVjdCIsImFwcGx5IiwiYXJndW1lbnRzIiwiUHJveHkiLCJvYmoiLCJwcm9wIiwidW5kZWZpbmVkIiwidmFsIiwiYmluZCIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwiRnVuY3Rpb24iLCJvT3BlbiIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsInVybCIsInRvTG93ZXJDYXNlIiwiaW5jbHVkZXMiLCJURkhvdXIiLCJpbmplY3QyNEhvdXIiLCJjYW5jZWwyNEhvdXIiLCJ0d2VsdmVIb3VyIiwiUmVnRXhwIiwiY29udmVydCIsImRhdGEiLCJtYXRjaGVkIiwicmV0dXJuVmFsdWUiLCJtYXRjaCIsImxlbmd0aCIsInJlcGxhY2UiLCJwYWRTdGFydCIsInBhcnNlSW50IiwiY2FuY2VsQ296eSIsIm1vbmtleVBhdGNoIiwiVGltZUZvcm1hdHRlciIsImFmdGVyIiwiY2FuY2VsQ29tcGFjdCIsInJlbW92ZTI0SG91ciIsImRpc3BhdGNoZXIiLCJMaWdodGNvcmQiLCJEaXNjb3JkTW9kdWxlcyIsIkNoYW5uZWxNb2R1bGUiLCJCRE1vZHVsZXMiLCJlIiwiZGVmYXVsdCIsImdldENoYW5uZWwiLCJoYXNDaGFubmVsIiwicmVsYXRpb25TaGlwTW9kdWxlIiwiYWRkUmVsYXRpb25zaGlwIiwiRE1Nb2R1bGUiLCJjbG9zZVByaXZhdGVDaGFubmVsIiwiYmxvY2tlZCIsInVzZXJNb2R1bGUiLCJnZXRDdXJyZW50VXNlciIsIkFudGlCb3RETSIsImFudGlETSIsImVuYWJsZWQiLCJlbmFibGUiLCJzdWJzY3JpYmUiLCJkaXNhYmxlIiwidW5zdWJzY3JpYmUiLCJldiIsIm1lc3NhZ2UiLCJhdXRob3IiLCJib3QiLCJndWlsZF9pZCIsImNoYW5uZWwiLCJjaGFubmVsX2lkIiwic2Nhbk1lc3NhZ2UiLCJzaG93VG9hc3QiLCJ1c2VybmFtZSIsImRpc2NyaW1pbmF0b3IiLCJsb2NhdGlvbiIsInRlc3QiLCJjb250ZW50IiwiRW1iZWRzQ29udGFpbnMiLCJzZWFyY2giLCJlbWJlZHMiLCJtYXAiLCJlbWJlZCIsInRleHQiLCJmaWVsZHMiLCJuYW1lIiwiRGlzcGF0Y2hlciIsImRpc3BhdGNoIiwiQWN0aW9uVHlwZXMiLCJzb2NrZXRJZCIsInBpZCIsIkN1c3RvbVJpY2hQcmVzZW5jZSIsImdhbWUiLCJmb3JtYXRlZEdhbWUiLCJhcHBsaWNhdGlvbl9pZCIsImRldGFpbHMiLCJzdGF0ZSIsInRpbWVzdGFtcHMiLCJzdGFydCIsImFzc2V0cyIsImxhcmdlX2ltYWdlIiwic21hbGxfaW1hZ2UiLCJzZW5kR2FtZSIsIkxPQ0FMX0FDVElWSVRZX1VQREFURSIsImFjdGl2aXR5IiwiY29uc29sZSIsImxvZyIsInNldCIsImZldGNoQXNzZXRzIiwiYXBwbGljYXRpb25JZCIsImdldEFzc2V0cyIsIkVycm9yIiwiUmVhY3RET00iLCJSZWFjdERvbSIsIlJlYWN0Q29tcG9uZW50IiwiV2luZG93Q29uZmlnRmlsZSIsImVtb3RlcyIsInNjcmVlbldpZHRoIiwiTWF0aCIsIm1heCIsImRvY3VtZW50RWxlbWVudCIsImNsaWVudFdpZHRoIiwiaW5uZXJXaWR0aCIsInNjcmVlbkhlaWdodCIsImNsaWVudEhlaWdodCIsImlubmVySGVpZ2h0IiwiZ2V0QWxsV2luZG93UHJlZmVyZW5jZXMiLCJnZXRXaW5kb3dQcmVmZXJlbmNlIiwic2V0V2luZG93UHJlZmVyZW5jZSIsImluamVjdENTUyIsImNzcyIsIkRPTSIsImFkZFN0eWxlIiwiZXNjYXBlSUQiLCJjbGVhckNTUyIsInJlbW92ZVN0eWxlIiwibGlua0pTIiwiYWRkU2NyaXB0IiwidW5saW5rSlMiLCJyZW1vdmVTY3JpcHQiLCJnZXRQbHVnaW4iLCJoYXNPd25Qcm9wZXJ0eSIsInBsdWdpbiIsImdldENvcmUiLCJtYWluQ29yZSIsImFsZXJ0Iiwic2hvd0NvbmZpcm1hdGlvbk1vZGFsIiwiY2FuY2VsVGV4dCIsIm9wdGlvbnMiLCJmaW5kTW9kdWxlIiwiZmlsdGVyIiwiZmluZEFsbE1vZHVsZXMiLCJmaW5kQWxsIiwiZmluZE1vZHVsZUJ5UHJvcHMiLCJwcm9wcyIsImZpbmRCeVVuaXF1ZVByb3BlcnRpZXMiLCJmaW5kTW9kdWxlQnlQcm90b3R5cGVzIiwicHJvdG9zIiwiZmluZEJ5UHJvdG90eXBlcyIsImZpbmRNb2R1bGVCeURpc3BsYXlOYW1lIiwiZ2V0SW50ZXJuYWxJbnN0YW5jZSIsIm5vZGUiLCJqUXVlcnkiLCJFbGVtZW50IiwibG9hZERhdGEiLCJwbHVnaW5OYW1lIiwiZ2V0UGx1Z2luRGF0YSIsImdldERhdGEiLCJzYXZlRGF0YSIsInNldFBsdWdpbkRhdGEiLCJzZXREYXRhIiwiZGVsZXRlRGF0YSIsImRlbGV0ZVBsdWdpbkRhdGEiLCJ3aGF0IiwibWV0aG9kTmFtZSIsIm9uUmVtb3ZlZCIsImNhbGxiYWNrIiwic3VwcHJlc3NFcnJvcnMiLCJtZXRob2QiLCJ0ZXN0SlNPTiIsImlzUGx1Z2luRW5hYmxlZCIsImlzVGhlbWVFbmFibGVkIiwiaXNTZXR0aW5nRW5hYmxlZCIsImVuYWJsZVNldHRpbmciLCJvbkNoYW5nZSIsImRpc2FibGVTZXR0aW5nIiwidG9nZ2xlU2V0dGluZyIsImdldEJERGF0YSIsInNldEJERGF0YSIsIm1ha2VBZGRvbkFQSSIsImNvb2tpZSIsImxpc3QiLCJtYW5hZ2VyIiwiQWRkb25BUEkiLCJmb2xkZXIiLCJpc0VuYWJsZWQiLCJ0b2dnbGUiLCJyZWxvYWQiLCJnZXRBbGwiLCJrIiwiYSIsIlBsdWdpbnMiLCJUaGVtZXMiLCJCZXR0ZXJEaXNjb3JkIiwiRXZlbnRFbWl0dGVyIiwicmVxdWlyZSIsImV2ZW50TmFtZSIsImFyZ3MiLCJlbWl0Iiwib2ZmIiwiZXZlbnRBY3Rpb24iLCJyZW1vdmVMaXN0ZW5lciIsInNlbGVjdG9ycyIsInJlbW92ZURhIiwiZ2V0U2VsZWN0b3JzIiwic3RhbmRhcmRTaWRlYmFyVmlldyIsImRlZmF1bHRDbGFzc05hbWUiLCJzZWxlY3RzIiwicHVzaCIsInBheW1lbnRTb3VyY2VSb3ciLCJzdWJUZXh0IiwiZGVzY3JpcHRpb25XcmFwcGVyIiwidXNlclNldHRpbmdzQWNjb3VudCIsInZpZXdCb2R5IiwiQmx1clByaXZhdGUiLCJlcnJvciIsIkRPTVRvb2xzIiwibm9ybWFsaXplZFByZWZpeCIsInJhbmRDbGFzcyIsInN0b3AiLCJoYXNQYXRjaGVkIiwidW5wYXRjaENsYXNzTW9kdWxlcyIsIm1vZHVsZUZpbHRlciIsInJldmVydEVsZW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwicGF0Y2hDbGFzc01vZHVsZXMiLCJub3JtYWxpemVFbGVtZW50IiwicGF0Y2hET01NZXRob2RzIiwibW9kdWxlcyIsIm1vZHVsZSIsInBhdGNoQ2xhc3NNb2R1bGUiLCJ1bnBhdGNoQ2xhc3NNb2R1bGUiLCJzaG91bGRJZ25vcmUiLCJpc05hTiIsImVuZHNXaXRoIiwic3RhcnRzV2l0aCIsIkFycmF5IiwiaXNBcnJheSIsIl9fZXNNb2R1bGUiLCJiYXNlQ2xhc3NOYW1lIiwic3BsaXQiLCJjb21wb25lbnROYW1lIiwiY2xhc3NOYW1lcyIsImNsYXNzTGlzdCIsIm5vcm1hbENsYXNzIiwiY2FtZWxDYXNlIiwicyIsImkiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwiam9pbiIsIm5ld1N0cmluZyIsInRyaW0iLCJlbGVtZW50IiwiY2xhc3NlcyIsImMiLCJjbGVuIiwibmV3Q2xhc3MiLCJhZGQiLCJjaGlsZCIsImNoaWxkcmVuIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwidG9SZW1vdmUiLCJyZW1vdmUiLCJjb250YWlucyIsIkRPTVRva2VuTGlzdCIsInRva2VuIiwidG9rZW5zIiwidCIsIkNvbG9yZWRUZXh0IiwiaW5qZWN0Q29sb3JlZFRleHQiLCJjYW5jZWxDb2xvcmVkVGV4dCIsIk1lc3NhZ2VDb21wb25lbnQiLCJiZWZvcmUiLCJtZXRob2RBcmd1bWVudHMiLCJjaGlsZHJlbk1lc3NhZ2VDb250ZW50IiwibWVzc2FnZUNvbnRlbnQiLCJvcmlnaW5hbFR5cGUiLCJfX29yaWdpbmFsTWV0aG9kIiwicm9sZUNvbG9yIiwiY29sb3JTdHJpbmciLCJzdHlsZSIsImFzc2lnbiIsInJlbW92ZUNvbG9yZWRUZXh0IiwiY2xhc3NOYW1lTWFya3VwIiwibWFya3VwIiwicXVlcnlTZWxlY3RvckFsbCIsImZvckVhY2giLCJlbGVtIiwic2V0UHJvcGVydHkiLCJwYXRoIiwiZnMiLCJNb2R1bGUiLCJnbG9iYWxQYXRocyIsInJlc29sdmUiLCJhcHAiLCJnZXRBcHBQYXRoIiwiTWV0YUVycm9yIiwib3JpZ2luYWxKU1JlcXVpcmUiLCJfZXh0ZW5zaW9ucyIsIm9yaWdpbmFsQ1NTUmVxdWlyZSIsInNwbGl0UmVnZXgiLCJlc2NhcGVkQXRSZWdleCIsImFkZG9uQ2FjaGUiLCJ0aW1lQ2FjaGUiLCJ3YXRjaGVycyIsInBhdGNoRXh0ZW5zaW9ucyIsImdldENvbnRlbnRSZXF1aXJlIiwicGx1Z2luc0ZvbGRlciIsIl9wbHVnaW5zRm9sZGVyIiwicmVhbHBhdGhTeW5jIiwiZGF0YVBhdGgiLCJ0aGVtZXNGb2xkZXIiLCJfdGhlbWVzRm9sZGVyIiwibG9hZEFkZG9uQ2VydGlmaWVyQ2FjaGUiLCJkYXRhU3RvcmUiLCJnZXRTZXR0aW5nR3JvdXAiLCJzZXRTZXR0aW5nR3JvdXAiLCJlbmNyeXB0U2V0dGluZ3NDYWNoZSIsIkpTT04iLCJwYXJzZSIsImRlY3J5cHRTZXR0aW5nc0NhY2hlIiwiaGFzaCIsInJlc3VsdCIsInN1c3BlY3QiLCJzYXZlQWRkb25DYWNoZSIsInN0cmluZ2lmeSIsIndhdGNoQ29udGVudCIsImNvbnRlbnRUeXBlIiwiaXNQbHVnaW4iLCJiYXNlRm9sZGVyIiwiZmlsZUVuZGluZyIsIndhdGNoIiwicGVyc2lzdGVudCIsImV2ZW50VHlwZSIsImZpbGVuYW1lIiwiUHJvbWlzZSIsInIiLCJzZXRUaW1lb3V0Iiwic3RhdFN5bmMiLCJlcnIiLCJjb2RlIiwidW5sb2FkUGx1Z2luIiwidW5sb2FkVGhlbWUiLCJpc0ZpbGUiLCJzdGF0cyIsIm10aW1lIiwiZ2V0VGltZSIsImxvYWRQbHVnaW4iLCJsb2FkVGhlbWUiLCJyZWxvYWRQbHVnaW4iLCJyZWxvYWRUaGVtZSIsInVud2F0Y2hDb250ZW50IiwiY2xvc2UiLCJleHRyYWN0TWV0YSIsImZpcnN0TGluZSIsImhhc09sZE1ldGEiLCJwYXJzZU9sZE1ldGEiLCJoYXNOZXdNZXRhIiwicGFyc2VOZXdNZXRhIiwibWV0YSIsInJhd01ldGEiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsImluZGV4T2YiLCJwYXJzZWQiLCJmb3JtYXQiLCJibG9jayIsIm91dCIsImZpZWxkIiwiYWNjdW0iLCJsaW5lIiwiY2hhckF0IiwibCIsInN1YnN0ciIsInNlbGYiLCJvcmlnaW5hbFJlcXVpcmUiLCJwb3NzaWJsZVBhdGgiLCJiYXNlbmFtZSIsImV4aXN0c1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJzdHJpcEJPTSIsImFkZGVkIiwiYXRpbWVNcyIsIm1vZGlmaWVkIiwibXRpbWVNcyIsIl9jb21waWxlIiwiZGlkRXhwb3J0IiwiaXNFbXB0eSIsImV4cG9ydHMiLCJtYWtlUGxhY2Vob2xkZXJQbHVnaW4iLCJnZXROYW1lIiwiZ2V0QXV0aG9yIiwiZ2V0RGVzY3JpcHRpb24iLCJzb3VyY2UiLCJ3ZWJzaXRlIiwibG9hZENvbnRlbnQiLCJwcm9jZXNzRmlsZSIsInRpbWVzdGFtcCIsImZpbGUiLCJoYXJtIiwic3RhY2siLCJ1bmxvYWRDb250ZW50IiwiY2FjaGUiLCJpc0xvYWRlZCIsInJlbG9hZENvbnRlbnQiLCJjYW50VW5sb2FkIiwibG9hZE5ld0NvbnRlbnQiLCJiYXNlZGlyIiwiZmlsZXMiLCJyZWFkZGlyU3luYyIsImNvbnRlbnRMaXN0IiwidmFsdWVzIiwicmVtb3ZlZCIsImYiLCJsb2FkQWxsQ29udGVudCIsImVycm9ycyIsImxvYWRQbHVnaW5zIiwibG9hZFRoZW1lcyIsImNvbmZpZyIsImZsYXQiLCJFRCIsIldlYlNvY2tldCIsInBhdGNoQXR0cmlidXRlcyIsImluaXRTZXR0aW5ncyIsImNoZWNrRm9yR3VpbGRzIiwiaW5pdGlhbGl6ZSIsImluaXRpYWxpemVTZXR0aW5ncyIsImNvbnRlbnRNYW5hZ2VyIiwiYXRvYiIsImFkZEV2ZW50TGlzdGVuZXIiLCJQbHVnaW5DZXJ0aWZpZXIiLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwiaW5pdE9ic2VydmVyIiwic2hvd0NvbnRlbnRFcnJvcnMiLCJwbHVnaW5zIiwidGhlbWVzIiwicHJldmlvdXNWZXJzaW9uIiwic2hvd0NoYW5nZWxvZ01vZGFsIiwiRW1vamlNb2R1bGUiLCJwYXRjaFNvY2lhbCIsInBhdGNoR3VpbGRQaWxscyIsInBhdGNoR3VpbGRMaXN0SXRlbXMiLCJwYXRjaEd1aWxkU2VwYXJhdG9yIiwicGF0Y2hNZXNzYWdlSGVhZGVyIiwicGF0Y2hNZW1iZXJMaXN0IiwicGF0Y2hBdHRhY2htZW50IiwiaGF2ZUluc3RhbGxlZERlZmF1bHQiLCJvbkNsb3NlIiwibG9nbyIsInRvcCIsImlubmVySFRNTCIsImF0dHJpYnNQYXRjaHMiLCJjYW5jZWxQYXRjaEF0dHJpYnV0ZXMiLCJ2MiIsImVuc3VyZUV4cG9ydGVkIiwidGhlbiIsIkRpc2NvcmRUYWciLCJEaXNjb3JkVGFnQ29tcCIsInV1aWR2NCIsImJhZGdlRGl2IiwiZGlzcGxheSIsIm1hcmdpblRvcCIsInVzZXIiLCJUb29sdGlwV3JhcCIsInNpZGUiLCJocmVmIiwidGFyZ2V0IiwiQkRMb2dvIiwiTGlnaHRjb3JkTG9nbyIsImRpdiIsImFwcGx5QmFkZ2VzIiwidGltZXNDaGVja2VkIiwid3JhcHBlciIsImd1aWxkQ2xhc3NlcyIsImd1aWxkIiwibGlzdEl0ZW0iLCJibG9iIiwiYmxvYkNvbnRhaW5lciIsImRlZmVyTG9hZGVkIiwicmVhZHlTdGF0ZSIsImluamVjdEV4dGVybmFscyIsIm9yaWdpbmFsIiwic2F2ZVNldHRpbmdzIiwibG9hZFNldHRpbmdzIiwic2V0dGluZyIsIkFwaSIsImdldFByZWRpY2F0ZVNlY3Rpb25zIiwic2V0dGluZ01vZHVsZSIsImNhbGwiLCJzZWN0aW9uIiwicG9wZWQiLCJyZW5kZXJTaWRlYmFyIiwiY2xhc3NOYW1lTGF5ZXIiLCJjbGFzc05hbWVTb2NpYWxMaW5rcyIsImNsYXNzTmFtZU1vZGFsIiwibWFpbk9ic2VydmVyIiwiTXV0YXRpb25PYnNlcnZlciIsIm11dGF0aW9ucyIsIm1sZW4iLCJtdXRhdGlvbiIsInJhd09ic2VydmVyIiwiYWRkZWROb2RlcyIsImxheWVyIiwiYW5pbWF0aW5nIiwic29jaWFsTGlua3MiLCJtb2RhbCIsImlubmVyIiwicmVzcG9uc2l2ZVdpZHRoTW9iaWxlIiwiZ2V0QXR0cmlidXRlIiwic2V0QXR0cmlidXRlIiwicGFyZW50RWxlbWVudCIsIm9ic2VydmUiLCJjaGlsZExpc3QiLCJzdWJ0cmVlIiwic29jaWFsUGF0Y2giLCJUYWJCYXIiLCJ0b1N0cmluZyIsInNvY2lhbE1vZHVsZTEiLCJuZXdPbmUiLCJyZXR1cm5WYWwiLCJsaW5rIiwiY2xhc3NOYW1lQ29sb3JNdXRlZCIsInNpemVzIiwiY2xhc3NOYW1lVmVyc2lvbkhhc2giLCJjb2xvck11dGVkIiwic2l6ZTMyIiwidmVyc2lvbkhhc2giLCJicmFuY2giLCJhZGRpdGlvbmFsIiwicmVhY3QiLCJzaXplMTIiLCJlbGVjdHJvbiIsImNvbW1pdCIsIm9yaWdpbmFsVmVyc2lvbnMiLCJzcGxpY2UiLCJnZXRHdWlsZENsYXNzZXMiLCJndWlsZHNXcmFwcGVyIiwiZ3VpbGRzIiwicGlsbCIsImd1aWxkTGlzdEl0ZW1zUGF0Y2giLCJHdWlsZENsYXNzZXMiLCJsaXN0SXRlbUNsYXNzIiwiYmxvYkNsYXNzIiwicmVhY3RJbnN0YW5jZSIsIkd1aWxkQ29tcG9uZW50IiwicmV0dXJuIiwidGhpc09iamVjdCIsImd1aWxkRGF0YSIsInVucmVhZCIsInNlbGVjdGVkIiwiYXVkaW8iLCJ2aWRlbyIsImJhZGdlIiwiYW5pbWF0YWJsZSIsImd1aWxkUGlsbFBhdGNoIiwiZ3VpbGRQaWxsIiwiaG92ZXJlZCIsImd1aWxkU2VwYXJhdG9yUGF0Y2giLCJHdWlsZHMiLCJndWlsZENvbXBvbmVudHMiLCJHdWlsZFNlcGFyYXRvciIsIlNlcGFyYXRvciIsIkF0dGFjaG1lbnRQYXRjaCIsIkF0dGFjaG1lbnQiLCJhdHRhY2htZW50IiwiZ2V0TmVzdGVkUHJvcCIsInBhdGNoIiwibWVzc2FnZUhlYWRlclBhdGNoIiwiTWVzc2FnZUhlYWRlciIsImNoYXQiLCJuZXh0VGljayIsImdldEVsZW1lbnRCeUlkIiwiY2hpbGROb2RlcyIsImJsb2NrRGl2IiwiZGlzdGFudCIsImdldEJhZGdlcyIsImJhZGdlcyIsInN2ZyIsIndpZHRoIiwic2NvcGVzIiwic2NvcGUiLCJjb21wb25lbnQiLCJkaXYyIiwicmVhY3REb20iLCJyZW5kZXIiLCJtZW1iZXJMaXN0UGF0Y2giLCJNZW1iZXJMaXN0SXRlbSIsInJlbmRlckRlY29yYXRvcnMiLCJ1cGRhdGVJbmplY3RvciIsImluamVjdGlvblBhdGgiLCJybXJmIiwieWF1emwiLCJta2RpcnAiLCJyZXF1ZXN0IiwicGFyZW50UGF0aCIsImZvbGRlck5hbWUiLCJ6aXBMaW5rIiwic2F2ZWRaaXAiLCJleHRyYWN0ZWRGb2xkZXIiLCJzdWNjZXNzIiwiZW5jb2RpbmciLCJyZXNwb25zZSIsInN0YXR1c0NvZGUiLCJhbHJlYWR5RXhpc3RzIiwicmVzIiwiZXhpc3RzIiwicmVuYW1lIiwicm91bmQiLCJwZXJmb3JtYW5jZSIsIndyaXRlRmlsZSIsInppcGZpbGUiLCJsYXp5RW50cmllcyIsInppcCIsIm9uIiwiZW50cnkiLCJmaWxlTmFtZSIsInJlYWRFbnRyeSIsImZ1bGxQYXRoIiwic3luYyIsImRpcm5hbWUiLCJvcGVuUmVhZFN0cmVhbSIsInJlYWRTdHJlYW0iLCJwaXBlIiwiY3JlYXRlV3JpdGVTdHJlYW0iLCJvbmNlIiwiYmFja3VwRm9sZGVyIiwidW5saW5rIiwiX19ub25fd2VicGFja19yZXF1aXJlX18iLCJyZWxlYXNlQ2hhbm5lbCIsImdsb2JhbHMiLCJnZXRSZWxlYXNlQ2hhbm5lbCIsInN0YWJsZSIsImNhbmFyeSIsInB0YiIsInBsdWdpbkRhdGEiLCJCREZpbGUiLCJ3cml0ZUZpbGVTeW5jIiwic2V0dGluZ3NGaWxlIiwidW5saW5rU3luYyIsIl9pbmplY3Rpb25QYXRoIiwiYmFzZSIsInJvYW1pbmdCYXNlIiwiZ2V0UGF0aCIsInJvYW1pbmdMb2NhdGlvbiIsInJlYWxMb2NhdGlvbiIsImNvbmZpZ0ZpbGUiLCJfY29uZmlnRmlsZSIsIl9CREZpbGUiLCJfc2V0dGluZ3NGaWxlIiwiZ2V0UGx1Z2luRmlsZSIsIkRldk1vZGUiLCJkZWJ1Z0xpc3RlbmVyIiwiY29weVNlbGVjdG9yTGlzdGVuZXIiLCJzdGFydERlYnVnTGlzdGVuZXIiLCJzdGFydENvcHlTZWxlY3RvciIsInN0b3BEZWJ1Z0xpc3RlbmVyIiwic3RvcENvcHlTZWxlY3RvciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJ3aGljaCIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsInNlbGVjdG9yIiwiZ2V0U2VsZWN0b3IiLCJjbGFzc0xheWVyIiwiY2xhc3NJdGVtcyIsImRpc2FibGVkUG9pbnRlckV2ZW50cyIsIm1lbnUiLCJhdHRhY2giLCJjbSIsInF1ZXJ5IiwiY29udGFpbmVyIiwibGF5ZXJDb250YWluZXIiLCJjbVdyYXAiLCJzdHlsZUZsZXhpYmxlIiwiYWNjb21tb2RhdGVTY3JvbGxiYXIiLCJhcHBlbmQiLCJjbGllbnRZIiwibGVmdCIsImNsaWVudFgiLCJzY3JvbGxlckNsYXNzZXMiLCJzY3JvbGxlcldyYXAiLCJzY3JvbGxlclRoZW1lZCIsInRoZW1lR2hvc3RIYWlybGluZSIsInNjcm9sbGVyIiwicmVtb3ZlQ00iLCJrZXlDb2RlIiwiY21nIiwiY21pIiwiaXRlbSIsImxhYmVsQ29udGFpbmVyIiwiY29sb3JEZWZhdWx0IiwibGFiZWwiLCJOYXRpdmVNb2R1bGUiLCJjb3B5IiwiZWxlbWVudHMiLCJxdWVyeUFsbCIsImZvY3VzZWQiLCJzZXBhcmF0b3IiLCJzY3JvbGxIZWlnaHQiLCJlbCIsIm5hbWVzIiwicGFyZW50Tm9kZSIsInVuc2hpZnQiLCJvd25lckRvY3VtZW50IiwidGFnTmFtZSIsImZyb20iLCJlbnRyaWVzIiwicHJldmlvdXNFbGVtZW50U2libGluZyIsImdldFJ1bGVzIiwic3R5bGVTaGVldHMiLCJzaGVldHMiLCJydWxlcyIsImNzc1J1bGVzIiwiZWxlbWVudFJ1bGVzIiwic2VsZWN0b3JUZXh0IiwibWF0Y2hlcyIsIkRpc2FibGVUeXBpbmciLCJzdGFydFR5cGluZyIsInR5cGluZ01vZHVsZSIsImRpc2FibGVkIiwic3RvcFR5cGluZyIsInJhbmRvbSIsInYiLCJhd2FpdGluZ0JhZGdlc1Byb21pc2VzIiwiYmFkZ2VzVG9GZXRjaCIsIkRpc3RhbnRTZXJ2ZXIiLCJfY2FjaGUiLCJuZXdQcm9taXNlIiwiQ29uc3RhbnRzIiwiZGVmYXVsdFVzZXJzIiwiZmV0Y2hlZEJhZGdlcyIsInVzZXJzIiwiaGFuZGxlUmVxdWVzdCIsIlJvdXRlcyIsInN0YXR1cyIsInJlc3BvbnNlQm9keSIsImpzb24iLCJwcm9taXNlIiwidXNlcl9pZCIsImNhdGNoIiwiTGlnaHRjb3JkRXJyb3IiLCJyb3V0ZSIsInJlamVjdCIsIm5vZGVGZXRjaCIsIlNFUlZFUl9VUkwiLCJoZWFkZXJzIiwiQXV0aG9yaXphdGlvbiIsIkJ1Z0h1bnRlckJhZGdlIiwiQ2lyY3VzIiwiaGVhZCIsInNjcmlwdCIsInNyYyIsIm9ubG9hZCIsImFuaW1hdGUiLCJ0aW1pbmciLCJfIiwidXBkYXRlIiwiZHVyYXRpb24iLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJ0aW1lIiwidGltZUZyYWN0aW9uIiwicHJvZ3Jlc3MiLCJRIiwicGFyc2VIVE1MIiwiaXNIVE1MIiwiTm9kZUxpc3QiLCJzb21lIiwibiIsIm5vZGVUeXBlIiwiYmFzZUVsZW1lbnQiLCJodG1sIiwiZnJhZ21lbnQiLCJ0ZW1wbGF0ZSIsImNsb25lTm9kZSIsImVzY2FwZUhUTUwiLCJ0ZXh0Tm9kZSIsImNyZWF0ZVRleHROb2RlIiwic3BhbkVsZW1lbnQiLCJub2RlVmFsdWUiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwidG9nZ2xlQ2xhc3MiLCJjbGFzc25hbWUiLCJpbmRpY2F0b3IiLCJoYXNDbGFzcyIsImV2ZXJ5IiwicmVwbGFjZUNsYXNzIiwib2xkTmFtZSIsIm5ld05hbWUiLCJhcHBlbmRUbyIsInRoaXNOb2RlIiwidGhhdE5vZGUiLCJwcmVwZW5kVG8iLCJwcmVwZW5kIiwiaW5zZXJ0QWZ0ZXIiLCJ0YXJnZXROb2RlIiwiaW5zZXJ0QmVmb3JlIiwibmV4dFNpYmxpbmciLCJuZXdOb2RlIiwibmV4dCIsIm5leHRBbGwiLCJuZXh0VW50aWwiLCJwcmV2aW91cyIsInByZXZpb3VzQWxsIiwicHJldmlvdXNVbnRpbCIsImluZGV4SW5QYXJlbnQiLCJudW0iLCJpbmRleCIsInBhcmVudCIsImZpbmRDaGlsZCIsImZpbmRDaGlsZHJlbiIsInBhcmVudHMiLCJjbG9zZXN0IiwicGFyZW50c1VudGlsIiwic2libGluZ3MiLCJhdHRyaWJ1dGUiLCJnbG9iYWwiLCJnZXRDb21wdXRlZFN0eWxlIiwiaGVpZ2h0IiwidGV4dENvbnRlbnQiLCJvdXRlcldpZHRoIiwib2Zmc2V0V2lkdGgiLCJvdXRlckhlaWdodCIsIm9mZnNldEhlaWdodCIsIm9mZnNldCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImxpc3RlbmVycyIsIl9saXN0ZW5lcnMiLCJldmVudCIsImRlbGVnYXRlIiwibmFtZXNwYWNlIiwiaGFzRGVsZWdhdGUiLCJldmVudEZ1bmMiLCJjYW5jZWwiLCJuZXdDYW5jZWwiLCJmaW5kSW5kZXgiLCJfX29mZkFsbCIsIm1hdGNoRmlsdGVyIiwibGlzdGVuZXIiLCJkZWZhdWx0RmlsdGVyIiwib25Nb3VudENoYW5nZSIsIm9uTW91bnQiLCJ3cmFwcGVkQ2FsbGJhY2siLCJvYnNlcnZlciIsIm5vZGVzIiwicmVtb3ZlZE5vZGVzIiwiZGlyZWN0TWF0Y2giLCJwYXJlbnRNYXRjaCIsIm9uVW5tb3VudCIsIm9uQWRkZWQiLCJ3cmFwIiwiZG9tV3JhcHBlciIsInJlc29sdmVFbGVtZW50IiwiRW1vamlSZWdleCIsIkN1c3RvbUVtb2ppTW9kdWxlIiwiQ3VzdG9tRW1vamkiLCJFbW9qaU1vZHVsZUFwaSIsImdldEN1c3RvbUVtb2ppQnlJZCIsIkF1dG9jb21wbGV0ZU1vZHVsZSIsIkF1dG9Db21wbGV0aW9uVGVtcGxhdGVzIiwiZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyIsIkVtb2ppTW9kdWxlUXVlcnkiLCJxdWVyeUVtb2ppUmVzdWx0cyIsIk1lc3NhZ2VzIiwiRU1PSklfTUFUQ0hJTkciLCJndWlsZE1vZHVsZSIsImdldEd1aWxkIiwiZ2V0R3VpbGRzIiwiaXNGZXRjaGluZyIsImVtb2ppU2VhcmNoIiwiZ2V0RGlzYW1iaWd1YXRlZEVtb2ppQ29udGV4dCIsIkxJR0hUQ09SRF9FTU9KSVMiLCJhcmcxIiwiYXJnMiIsImNvbmRpdGlvbiIsInNldEVtb2ppVXNhYmxlIiwicXVlcnlSZXN1bHRzIiwicmVzdWx0cyIsInJlbmRlclJlc3VsdHMiLCJEIiwiZW1vamlzIiwiRU1PSkkiLCJFbW9qaSIsImVtb2ppIiwidW5pcXVlTmFtZSIsInNlbnRpbmVsIiwiZ3VpbGRJZCIsImdldFBsYWluVGV4dCIsImlzQW5pbWF0ZWQiLCJhbmltYXRlZCIsIm1hbmFnZWQiLCJvcmlnaW5hbE5hbWUiLCJnZXRSYXdUZXh0IiwiY2FuY2VsRW1vamlSZW5kZXIiLCJjYW5jZWxFbW90ZVJlbmRlciIsIm5ld0NvbnRlbnQiLCJoYXNQYXJzZWQiLCJleGVjIiwicmF3Iiwid29yZHMiLCJ3b3JkIiwiYXJyIiwiZW1vamlJZCIsImp1bWJvYWJsZSIsInJlZHVjZSIsImN1cnJlbnQiLCJzaGlmdCIsIm8iLCJ1IiwiZCIsIm9uSG92ZXIiLCJSIiwicHJlZml4IiwiVGl0bGUiLCJFbW9qaUZpbHRlck1vZHVsZSIsImlzRW1vamlEaXNhYmxlZCIsImlzVXNhYmxlIiwidXNhYmxlIiwic3Vycm9nYXRlcyIsImRpdmVyc2l0eSIsImNhY2hlMiIsInByb2Nlc3NBdHRhY2htZW50IiwiaXNUcnVzdGVkIiwiY2hlY2tWaXJ1c2VzIiwicmVzdWx0Q2FsbGJhY2siLCJyZW1vdmVDYWxsYmFjayIsImlzSGFybWZ1bCIsImtleXdvcmQiLCJvb2YiLCJub19jb21tZW50cyIsInJlZ2V4cHMiLCJyZWdleCIsImhhc2hUb1VybCIsImNoZWNrSGFzaCIsImdldEN1cnJlbnRXZWJDb250ZW50cyIsInVzZXJBZ2VudCIsIl9fcGF0aCIsImlzRnJvbUxvYWRlciIsImNyeXB0byIsIkJ1ZmZlciIsImFsbG9jIiwiY3JlYXRlUmVhZFN0cmVhbSIsImNodW5rIiwiY29uY2F0IiwiaGFzaFJlc3VsdCIsImRpZ2VzdCIsInJlbmRlclRvRWxlbWVudHMiLCJmbG93ZXJTdGFyTW9kdWxlIiwiZmxvd2VyU3RhckNvbnRhaW5lciIsImNoaWxkTW9kdWxlIiwiY2hpbGRDb250YWluZXIiLCJib3JkZXJDb2xvciIsIm5leHROb2RlIiwiY29uZmlybVRleHQiLCJkYW5nZXIiLCJvbkNhbmNlbCIsIm9uQ29uZmlybSIsInNoZWxsIiwib3BlbkV4dGVybmFsIiwidG9vbHRpcFdyYXAiLCJ2aWV3Qm94IiwieCIsInkiLCJtYXNrIiwiZmlsbCIsInBvaW50ZXJFdmVudHMiLCJvZmZpY2lhbCIsInNwYW4iLCJmbG9hdCIsImZsb3dlclN0YXIiLCJnZXRLZXllZEFycmF5IiwiYnVmZmVyIiwiaW5zdGFsbFBhdGgiLCJjdXJzb3IiLCJzdHJva2UiLCJzYXZlIiwiT2JqZWN0U3RvcmFnZSIsImxvY2FsU3RvcmFnZU1vZHVsZSIsImxvY2FsU3RvcmFnZSIsImltcGwiLCJidG9hIiwic2V0SW50ZXJ2YWwiLCJzYWZlSlNPTlBhcnNlIiwiZ2VuZXJhdGVLZXkiLCJkZWNpcGhlciIsImRlY3J5cHRlZCIsImZpbmFsIiwiY2lwaGVyIiwiZW5jcnlwdGVkIiwiUGx1Z2luTW9kdWxlIiwibG9hZFBsdWdpbkRhdGEiLCJsb2FkIiwic2F2ZVBsdWdpbkRhdGEiLCJjaGFubmVsU3dpdGNoIiwic3RhcnRQbHVnaW4iLCJzdG9wUGx1Z2luIiwiZW5hYmxlUGx1Z2luIiwiZGlzYWJsZVBsdWdpbiIsInRvZ2dsZVBsdWdpbiIsInAiLCJmaWxlbmFtZU9yTmFtZSIsImJkcGx1Z2luIiwiZGVsZXRlIiwiZWRpdCIsIm9wZW5JdGVtIiwidXBkYXRlUGx1Z2luTGlzdCIsInNhdmVkIiwibmV3TWVzc2FnZSIsIm9uTWVzc2FnZSIsIm9uU3dpdGNoIiwiVjJfUHVibGljU2VydmVycyIsIl9hcHBlbmRCdXR0b24iLCJMYXllciIsInJvb3RJZCIsIlYyQ19QdWJsaWNTZXJ2ZXJzIiwicm9vdCIsIl9yb290IiwiaW5qZWN0Um9vdCIsImNsYXNzTmFtZUxheWVycyIsImxheWVycyIsImJ1dHRvbiIsImJ0biIsImNpcmNsZUJ1dHRvbk1hc2siLCJjbGFzc05hbWV0dXRvcmlhbENvbnRhaW5lciIsImRvd25sb2FkUHJvZ3Jlc3MiLCJ0dXRvcmlhbENvbnRhaW5lciIsImFkZEJ1dHRvbiIsImd1aWxkUGF0Y2giLCJHdWlsZExpc3QiLCJ3ZWJwYWNrTW9kdWxlcyIsIkd1aWxkTGlzdE9sZCIsInJlbW92ZUJ1dHRvbiIsIkJEU2lkZWJhckhlYWRlciIsIlB1cmVDb21wb25lbnQiLCJzaWRlYmFyQ29tcG9uZW50cyIsIkhlYWRlciIsIkl0ZW0iLCJjaGFuZ2Vsb2dCdXR0b24iLCJIaXN0b3J5IiwicmVuZGVyZWQiLCJWMl9TZXR0aW5nc1BhbmVsIiwidXBkYXRlU2V0dGluZ3MiLCJzaWRlYmFyIiwiVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyIiwicmVnaXN0ZXJDb21wb25lbnRzIiwicmVnaXN0ZXIiLCJtYWtlQ29tcG9uZW50IiwibGlnaHRjb3JkQ29tcG9uZW50IiwiUHJlc2VuY2VDb21wb25lbnQiLCJBY2NvdW50SW5mb3NDb21wb25lbnQiLCJBcGlQcmV2aWV3Q29tcG9uZW50IiwiY29yZUNvbXBvbmVudCIsImN1c3RvbUNzc0NvbXBvbmVudCIsInJlbmRlckFkZG9uUGFuZSIsImNsYXNzU2lkZWJhciIsImNvbnRlbnRSZWdpb24iLCJ1bm1vdW50Q29tcG9uZW50QXROb2RlIiwiY29yZVNldHRpbmdzIiwiZ2V0U2V0dGluZ3MiLCJjYXRlZ29yaWVzIiwiU2V0Iiwic2VjdGlvbnMiLCJsaWdodGNvcmRTZXR0aW5ncyIsIlByZXNlbmNlU2V0dGluZ3MiLCJNc2dMb2dTZXR0aW5ncyIsImNoZWNrZWQiLCJwdWJsaWNTZXJ2ZXJzTW9kdWxlIiwidm9pY2VNb2RlIiwidGZIb3VyIiwiY29sb3JlZFRleHQiLCJkTW9kZSIsIlNldHRpbmdzIiwiZGV2TW9kZSIsImZvcmNlVXBkYXRlIiwiY2FsbFJpbmdpbmdCZWF0Iiwic2V0dGluZ3NTdG9yZSIsInNob3dDdXJyZW50R2FtZSIsInVwZGF0ZVJlbW90ZVNldHRpbmdzIiwiZ2V0Q3VycmVudFdpbmRvdyIsInNldEFsd2F5c09uVG9wIiwiQW50aUFkRE0iLCJibHVyUHJpdmF0ZSIsImRpc2FibGVUeXBpbmciLCJhcHBTZXR0aW5ncyIsInJlbGF1bmNoIiwiZXhpdCIsIlNlY3Rpb25lZFNldHRpbmdzUGFuZWwiLCJNYXJnaW5Ub3AiLCJpc0NoZWNrZWQiLCJTd2l0Y2giLCJDb21wb25lbnRzIiwiaW5wdXRzIiwiQnV0dG9uIiwibG9vayIsImhvdmVyQ29sb3IiLCJpcGMiLCJzZW5kIiwiYXJndiIsInF1aXQiLCJWMkNfUHJlc2VuY2VTZXR0aW5ncyIsIlYyQ19BY2NvdW50SW5mb3MiLCJBcGlQcmV2aWV3IiwiQ3NzRWRpdG9yIiwiQ29udGVudExpc3QiLCJDb21wb25lbnQiLCJvcmlnaW5hbFJlbmRlciIsImVudW1lcmFibGUiLCJDYXJkTGlzdCIsIlNldHRpbmdDb21wb25lbnQiLCJwYW5lbHMiLCJwYW5lbCIsImdldENvbXBvbmVudCIsIkxDaXRlbXMiLCJUaGVtZU1vZHVsZSIsImxvYWRUaGVtZURhdGEiLCJ0aGVtZSIsInVuZXNjYXBlIiwic2F2ZVRoZW1lRGF0YSIsImVuYWJsZVRoZW1lIiwiZGlzYWJsZVRoZW1lIiwidG9nZ2xlVGhlbWUiLCJiZHRoZW1lIiwidXBkYXRlVGhlbWVMaXN0IiwiX3dpbmRvd0NvbmZpZ0ZpbGUiLCJ0cmFuc3BhcmVudCIsImZyYW1lIiwiY2hhckNvZGVBdCIsImdldFRleHRBcmVhIiwiY2hhbm5lbFRleHRBcmVhIiwidGl0bGVXcmFwcGVyIiwiaW5zZXJ0VGV4dCIsInRleHRhcmVhIiwiZm9jdXMiLCJzZWxlY3Rpb25TdGFydCIsInNlbGVjdGlvbkVuZCIsImV4ZWNDb21tYW5kIiwibW9kdWxlTmFtZSIsImdyb3VwQ29sbGFwc2VkIiwiZ3JvdXBFbmQiLCJlc2NhcGUiLCJwYXJhbXMiLCJpbnN0ZWFkIiwic2lsZW50IiwiZm9yY2UiLCJvcmlnTWV0aG9kIiwiY2FuY2VsZWQiLCJjYW5jZWxQYXRjaCIsIm9yaWdpbmFsTWV0aG9kIiwiY2FsbE9yaWdpbmFsTWV0aG9kIiwidGVtcFJldCIsIl9fbW9ua2V5UGF0Y2hlZCIsImRpc2Nvbm5lY3QiLCJoYXNOb3RpY2UiLCJtZW1iZXJsaXN0IiwibWVtYmVyc1dyYXAiLCJmb3JtIiwicmlnaHQiLCJib3R0b20iLCJ0b2FzdFdyYXBwZXIiLCJpY29uIiwidGltZW91dCIsInRvYXN0RWxlbSIsImlubmVyVGV4dCIsIm1vZGFsTW9kdWxlIiwiaGlkZU9uRnVsbHNjcmVlbiIsImhlYWRlck1vZHVsZSIsImhlYWRlciIsImZvb3RlcjJNb2R1bGUiLCJmb2N1c0xvY2siLCJiYWNrZHJvcCIsImJhY2tkcm9wV2l0aExheWVyIiwiY2xvc2luZ0xpc3RlbmVycyIsInBsdWdpbkVycm9ycyIsInRoZW1lRXJyb3JzIiwiZ2VuZXJhdGVUYWIiLCJ0YWJzIiwiQ2hhbmdlbG9nQ2xhc3NlcyIsIkZsZXhDaGlsZCIsIlRpdGxlcyIsIkNoYW5nZWxvZyIsImRlZmF1bHRQcm9wcyIsInNlbGVjdGFibGUiLCJNYXJrZG93blBhcnNlciIsImNlIiwiY2hhbmdlbG9nSXRlbXMiLCJtYXJnaW4iLCJyZW5kZXJIZWFkZXIiLCJDaGlsZCIsImdyb3ciLCJzaHJpbmsiLCJ0YWciLCJUYWdzIiwiSDQiLCJkYXRlIiwicmVuZGVyRm9vdGVyIiwiam9pbkJEMiIsImRlZmF1bHRGb290ZXIiLCJvblNjcm9sbCIsIk1hcmtkb3duIiwiQ29uZmlybWF0aW9uTW9kYWwiLCJlbXB0eUZ1bmN0aW9uIiwicmVkIiwiVjIiLCJlZGl0b3JEZXRhY2hlZCIsInJlcSIsIndlYnBhY2tKc29ucCIsIl9fZXh0cmFfaWRfXyIsInNob3VsZFByb3RlY3QiLCJ0aGVNb2R1bGUiLCJjbGVhciIsInNvcnQiLCJnZXRUb2tlbiIsImdldEVtYWlsIiwic2hvd1Rva2VuIiwicHJvdGVjdCIsImlzRGVmYXVsdCIsIm1vZCIsInByb3h5IiwiZnVuYyIsIl9fcHJvdG9fXyIsInByb3BOYW1lcyIsInByb3RvTmFtZXMiLCJwcm90b1Byb3AiLCJpbnRlcm5hbCIsImpvaW5CRDEiLCJJbnZpdGVBY3Rpb25zIiwiYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbCIsImxlYXZlQkQxIiwiR3VpbGRBY3Rpb25zIiwibGVhdmVHdWlsZCIsImxlYXZlQkQyIiwibGVhdmVMQyIsInJlYWN0Q29tcG9uZW50IiwiYW5jaG9yQ2xhc3NlcyIsInNsYXRlRWRpdG9yQ2xhc3NlcyIsIm1lc3NhZ2VDbGFzc2VzIiwidW5yZWFkTWVudGlvbnNCYXIiLCJndWlsZHNFcnJvciIsIk1lc3NhZ2VDb250ZW50Q29tcG9uZW50IiwiVG9vbHRpcFdyYXBwZXIiLCJUb29sdGlwcyIsImhpZGUiLCJzaG93Iiwic3VibWl0IiwiYWN0aXZhdGVSYWdpbmdEZW1vbiIsImRpc21pc3MiLCJLZXlHZW5lcmF0b3IiLCJMYXllclN0YWNrIiwiVXNlclN0b3JlIiwiQ2hhbm5lbFN0b3JlIiwiQ2hhbm5lbEFjdGlvbnMiLCJQcml2YXRlQ2hhbm5lbEFjdGlvbnMiLCJvcGVuRE0iLCJ1c2VySWQiLCJzZWxmSWQiLCJwcml2YXRlQ2hhbm5lbElkIiwiZ2V0RE1Gcm9tVXNlcklkIiwic2VsZWN0UHJpdmF0ZUNoYW5uZWwiLCJvcGVuUHJpdmF0ZUNoYW5uZWwiLCJwYXJzZVNldHRpbmdzIiwiVm9pY2VNb2RlIiwicHJvZmlsTW9kdWxlIiwiZmV0Y2hNdXR1YWxGcmllbmRzIiwiTGlnaHRjb3JkVXNlckJhZGdlIiwibWFyZ2luTW9kdWxlMiIsImRlZmF1bHRNYXJnaW5oNSIsImNvbG9yTW9kdWxlIiwiY29sb3JTdGFuZGFyZCIsInNpemVNb2R1bGUiLCJzY3JvbGxiYXJNb2R1bGUxIiwic2Nyb2xsYmFyR2hvc3RIYWlybGluZSIsIkd1aWxkTW9kdWxlIiwiZ2V0UmVsYXRpb25zaGlwcyIsInNlc3Npb25Nb2R1bGUiLCJnZXRTZXNzaW9ucyIsInNpemUxNCIsImg1IiwiZ2V0UHJvZmlsZVZhbHVlIiwiZ2V0U3RhdGlzdGljcyIsImdldFNlc3Npb25WYWx1ZSIsIm1hcmdpbkJvdHRvbTIwIiwic2Vzc2lvbnNSYXciLCJzZXNzaW9ucyIsInNlc3Npb25JZCIsImNsaWVudEluZm8iLCJvcyIsImNsaWVudCIsImFjdGl2aXRpZXMiLCJyZXBlYXQiLCJjcmVhdGVkQXQiLCJhdmF0YXJVUkwiLCJhdmF0YXIiLCJnZXRBdmF0YXJVUkwiLCJnZXREYXRlIiwiZ2V0TW9udGgiLCJnZXRGdWxsWWVhciIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsImdldFNlY29uZHMiLCJmbGFncyIsImhhc1ByZW1pdW1TdWJzY3JpcHRpb24iLCJlbWFpbCIsIm1mYUVuYWJsZWQiLCJtb2JpbGUiLCJwaG9uZSIsInZlcmlmaWVkIiwicmVsYXRpb25zIiwiZnJpZW5kcyIsImlzRnJpZW5kIiwiaXNCbG9ja2VkIiwiaGlnaHRsaWdodEpTIiwiaGlnaGxpZ2h0IiwibWVzc2FnZU1vZHVsZTEiLCJtZXNzYWdlTW9kdWxlMiIsIkNvZGVDb250ZW50IiwiX19odG1sIiwibGFuZ3VhZ2UiLCJtYXJnaW5Cb3R0b204Iiwic2V0dGluZ1RpdGxlIiwiZm9ybU1vZHVsZSIsInN0YXRlcyIsIkZvcm1TZWN0aW9uIiwiYWxsQ29tcG9uZW50cyIsImNvbXAiLCJBbGxQcmV2aWV3cyIsInRhYiIsInNldFN0YXRlIiwibmV3U3RhdGUiLCJnZXRQcm9wcyIsInJlbmRlclByZXZpZXciLCJiYWNrZ3JvdW5kQ29sb3IiLCJwYWRkaW5nIiwiYm9yZGVyUmFkaXVzIiwicmVuZGVyQ29kZSIsImdlbmVyYXRlQ29kZSIsImdldFN0ckZvclByb3AiLCJjb21wUGF0aCIsImxhbmciLCJTdHJpbmciLCIkJHR5cGVvZiIsIlN5bWJvbCIsImZvciIsImNvbXBOYW1lIiwiY29tcENhdGVnb3J5IiwicHJvcFN0cmluZ3MiLCJjaGlsZHJlblByb3AiLCJzdHIiLCJvcGVuVGFnIiwiY2xvc2VUYWciLCJ2aXNpYmxlS2V5IiwicHJvcE9iamVjdCIsImlzTGFzdCIsImlzRmlyc3QiLCJjaGlsZHJlbkRhdGEiLCJoZWxwIiwibWFyZ2luQm90dG9tIiwicmVuZGVycyIsIlYyQ19QbHVnaW5DYXJkIiwic2hvd1NldHRpbmdzIiwic2V0SW5pdGlhbFN0YXRlIiwiaGFzU2V0dGluZ3MiLCJhZGRvbiIsImdldFNldHRpbmdzUGFuZWwiLCJyZWxvYWRzIiwidHJ1c3RlZCIsImNsb3NlU2V0dGluZ3MiLCJwYW5lbFJlZiIsInNldHRpbmdzT3BlbiIsImNvbXBvbmVudERpZFVwZGF0ZSIsInJlZnMiLCJzZXR0aW5nc3BhbmVsIiwic2V0SW1tZWRpYXRlIiwiaXNIaWRkZW4iLCJjVG9wIiwic2Nyb2xsVG9wIiwiY0JvdHRvbSIsImVUb3AiLCJvZmZzZXRUb3AiLCJlQm90dG9tIiwiY2FyZE5vZGUiLCJ0aGlzTm9kZU9mZnNldCIsImNvbnRhaW5lck9mZnNldCIsImVuZFBvaW50IiwiZ2V0U3RyaW5nIiwic2V0dGluZ3NDb21wb25lbnQiLCJyZWYiLCJYU3ZnIiwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiLCJidWlsZFRpdGxlIiwibmFtZUluZGV4IiwidmVyc2lvbkluZGV4IiwiYXV0aG9ySW5kZXgiLCJwb3BMYXllciIsIm1ha2VMaW5rIiwibWFrZUJ1dHRvbiIsImFjdGlvbiIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwidW5tb3VudGVkIiwibGlua3MiLCJpbnZpdGUiLCJ0ZXN0ZXIiLCJkb25hdGUiLCJwYXRyZW9uIiwiYXV0aG9ySWQiLCJhdXRob3JMaW5rIiwiaXNTY2FubmluZyIsIlRvb2x0aXAiLCJhc2NlbmRpbmciLCJpc1BsdWdpbnMiLCJyZXZlcnNlIiwib3BlbkZvbGRlciIsInNob3VsZERlbGV0ZSIsImNvbmZpcm1EZWxldGUiLCJzb3J0T3B0aW9ucyIsImRpcmVjdGlvbnMiLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsImdldEFkZG9ucyIsInNvcnRlZEFkZG9ucyIsImIiLCJjYXAiLCJmaXJzdCIsInNlY29uZCIsImxvY2FsZUNvbXBhcmUiLCJyZW5kZXJDaGVja1VwZGF0ZXMiLCJaZXJlc1BsdWdpbkxpYnJhcnkiLCJQbHVnaW5VcGRhdGVzIiwiY2hlY2tBbGwiLCJtYXJnaW5MZWZ0IiwicmVmcmVzaEljb24iLCJhZGRvbkNhcmRzIiwiZmlsbFJ1bGUiLCJjbGlwUnVsZSIsInN0cm9rZUxpbmVjYXAiLCJzdHJva2VMaW5lam9pbiIsIm9wYWNpdHkiLCJWMkNfQ2hlY2tib3giLCJjaGVja2JveEVsZW1lbnQiLCJjaGVja2JveCIsImNoZWNrYm94SW5uZXIiLCJTZWxlY3QiLCJkcm9wZG93biIsImNyZWF0ZVJlZiIsInNob3dNZW51IiwiaGlkZU1lbnUiLCJvcHQiLCJpc09wZW4iLCJTZWFyY2giLCJvbktleURvd24iLCJwbGFjZWhvbGRlciIsIlYyQ19Db250ZW50Q29sdW1uIiwiY29udGVudE1vZHVsZSIsImNvbnRlbnRDb2x1bW4iLCJjb250ZW50Q29sdW1uRGVmYXVsdCIsIlYyQ19Dc3NFZGl0b3IiLCJsaW5lcyIsImRldGFjaGVkRWRpdG9yIiwiVjJDX0Nzc0VkaXRvckRldGFjaGVkIiwidXBkYXRlQ3NzIiwic2F2ZUNzcyIsImRldGFjaCIsImRldGFjaGVkIiwiY29tcG9uZW50RGlkTW91bnQiLCJlZGl0b3IiLCJhY2UiLCJzZXRUaGVtZSIsInNlc3Npb24iLCJzZXRNb2RlIiwic2V0U2hvd1ByaW50TWFyZ2luIiwic2V0Rm9udFNpemUiLCJkZXN0cm95IiwicHJldlByb3BzIiwicHJldlN0YXRlIiwiZGV0YWNoZWRSb290IiwiY29kZU1pcnJvciIsImxpbmVOdW1iZXJzIiwibW9kZSIsImluZGVudFVuaXQiLCJzY3JvbGxiYXJTdHlsZSIsIl9jY3NzIiwiY2NzcyIsInVwZGF0ZUxpbmVDb3VudCIsImxpbmVDb3VudCIsIlNldHRpbmdzVGl0bGUiLCJDaGVja2JveCIsImJvcmRlclJpZ2h0IiwiYm9yZGVyTGVmdCIsImZvbnRTaXplIiwiYXJnIiwiZ2V0VmFsdWUiLCJkcm9vdCIsImluamVjdERldGFjaGVkUm9vdCIsIkJERXJyb3JCb3VuZGFyeSIsImhhc0Vycm9yIiwiY29tcG9uZW50RGlkQ2F0Y2giLCJEZWxldGUiLCJEb3duQXJyb3ciLCJFZGl0IiwibWFyZ2luTW9kdWxlIiwibWFyZ2luVG9wNjAiLCJWMkNfUHJlc2VuY2VTZXR0aW5nc01vZHVsZXMiLCJwcmV2aWV3IiwiaXNmZXRjaGluZyIsImFzc2V0Q29tcG9uZW50cyIsInVwZGF0ZVdoZW5GZXRjaGVkIiwiZGVmYXVsdFNldHRpbmciLCJSUENQcm9wcyIsImFzc2V0IiwidXBkYXRlUHJldmlldyIsIm9wdGlvbnNDb21wb25lbnRzIiwib2hnb2RvaGZ1Y2siLCJfb3B0aW9uc0NvbXBvbmVudHMiLCJhcnJheSIsImlucHV0VGV4dE1vZHVsZXMiLCJJbnB1dFRleHQiLCJyZW1vdmVLZXliaW5kIiwiX2hvcml6b250YWwiLCJpbnB1dE1pbmkiLCJzaXplMTYiLCJzaXplMjAiLCJpbnB1dCIsImxhc3RFZGl0ZWQiLCJpc1RpbWluZyIsInJvd01vZHVsZSIsImZsZXhNb2R1bGUiLCJpbnB1dE1vZHVsZSIsInNpemVNb2R1bGUyIiwicm93IiwiZmxleENoaWxkIiwiSW5wdXROdW1iZXJNb2R1bGVzIiwiSW5wdXROdW1iZXIiLCJjb2xvclRyYW5zcGFyZW50Iiwic2V0VmFsdWUiLCJjbGlwYm9hcmQiLCJJbnB1dENob2ljZU1vZHVsZXMiLCJJbnB1dENob2ljZSIsIkRpdmlkZXJNb2R1bGVzIiwiRGl2aWRlciIsImRpdmlkZXIiLCJkaXZpZGVyRGVmYXVsdCIsIkRpc2NvcmRCdXR0b24iLCJScGNQcmV2aWV3IiwiYWN0aXZlIiwiY2hhbmdlVGFiIiwiYW5jaWVudFRhYiIsInNldEFjdGl2ZSIsInJwYyIsImZsZXgiLCJpc0FjdGl2ZSIsIlByb2ZpbGUiLCJQb3BvdXQiLCJUYWIiLCJwb3BvdXRNb2R1bGUiLCJ1c2VyUG9wb3V0IiwidmVydGljYWwiLCJhbGlnblN0cmV0Y2giLCJzdHJlYW1lck1vZGVFbmFibGVkQnRuIiwiYWN0aXZpdHlVc2VyUG9wb3V0IiwibXV0ZWQiLCJ0aGVtZUdob3N0SGFpcmxpbmVDaGFubmVscyIsIm5vdGUiLCJwcm8iLCJpbmxpbmUiLCJyb290TW9kdWxlMSIsImZsZXhNb2R1bGUxIiwic3R5bGluZ01vZHVsZTEiLCJuYW1lVGFnTW9kdWxlMSIsImFjdGl2aXR5TW9kdWxlMSIsInRleHRNb2R1bGUxIiwic2l6ZU1vZHVsZTEiLCJzY3JvbGxlck1vZHVsZTEiLCJub3RlTW9kdWxlMSIsInByb3RpcE1vZHVsZTEiLCJjb2xvck1vZHVsZTEiLCJhdmF0YXJNb2R1bGUxIiwidXNlck1vZHVsZTEiLCJ0aW1lc3RhbXBDbGFzcyIsImltYWdlcyIsImFzc2V0c0xhcmdlSW1hZ2VVc2VyUG9wb3V0IiwiYXNzZXRzTGFyZ2VNYXNrVXNlclBvcG91dCIsImFzc2V0c1NtYWxsSW1hZ2VVc2VyUG9wb3V0IiwiaGVhZGVyUGxheWluZyIsImp1c3RpZnlDZW50ZXIiLCJhbGlnbkNlbnRlciIsIm5vV3JhcCIsImhlYWRlclRvcCIsImF2YXRhcldyYXBwZXJOb3JtYWwiLCJhdmF0YXJIaW50IiwiYXZhdGFySGludElubmVyIiwiVklFV19QUk9GSUxFIiwiaGVhZGVyVGV4dCIsImhvcml6b250YWwiLCJqdXN0aWZ5U3RhcnQiLCJoZWFkZXJUYWdOb05pY2tuYW1lIiwibmFtZVRhZyIsImhlYWRlclRhZ1VzZXJuYW1lTm9OaWNrbmFtZSIsImhlYWRlclRleHROb3JtYWwiLCJVU0VSX0FDVElWSVRZX0hFQURFUl9QTEFZSU5HIiwiYm9keU5vcm1hbCIsImNvbnRlbnRJbWFnZXNVc2VyUG9wb3V0IiwiY29udGVudE5vSW1hZ2VzVXNlclBvcG91dCIsIm5hbWVOb3JtYWwiLCJhY3Rpdml0eU5hbWUiLCJ0aW1lQ29tcG9uZW50IiwidGltZXN0YW1wUmVuZGVyIiwiVGltZXN0YW1wIiwiZW5kIiwic2Nyb2xsZXJGYWRlIiwiYm9keUlubmVyIiwiYm9keVRpdGxlIiwiTk9URSIsIk5PVEVfUExBQ0VIT0xERVIiLCJwcm90aXAiLCJQSU5ORURfTUVTU0FHRVNfUFJPX1RJUCIsInRpcCIsIkNPTlRFWFRfTUVOVV9ISU5UIiwiU3RhdHVzTW9kdWxlcyIsIlN0YXR1cyIsImdldFByZXNlbmNlIiwiUHJvZmlsZU1vZHVsZXMiLCJ0b3BTZWN0aW9uU3RyZWFtaW5nIiwiYWN0aXZpdHlQcm9maWxlIiwiYXNzZXRzTGFyZ2VJbWFnZVByb2ZpbGUiLCJhc3NldHNMYXJnZU1hc2tQcm9maWxlIiwiYXNzZXRzU21hbGxJbWFnZVByb2ZpbGUiLCJ0b3BTZWN0aW9uUGxheWluZyIsImhlYWRlckluZm8iLCJwcm9maWxlQmFkZ2VzIiwiaGVhZGVyRmlsbCIsImNvbnRlbnRJbWFnZXNQcm9maWxlIiwidXNlckluZm9TZWN0aW9uIiwidXNlckluZm9TZWN0aW9uSGVhZGVyIiwiQ29ubmVjdGVkQWNjb3VudHMiLCJhY2NvdW50cyIsIkFjY291bnRNb2R1bGUxIiwiZ2V0QWNjb3VudHMiLCJhY2NzIiwidmlzaWJpbGl0eSIsImFjYyIsImNvbm5lY3RlZEFjY291bnRzIiwiQ29ubmVjdGVkQWNjb3VudCIsImZsb3dlck1vZHVsZTEiLCJhbmNob3JNb2R1bGUxIiwiU29jaWFsQ29uc3RhbnRzIiwiY29uc3RhbnRzU29jaWFsIiwiY29ubmVjdGVkQWNjb3VudCIsImNvbm5lY3RlZEFjY291bnRJY29uIiwid2hpdGUiLCJncmV5IiwiY29ubmVjdGVkQWNjb3VudE5hbWVJbm5lciIsImNvbm5lY3RlZEFjY291bnROYW1lIiwiY29ubmVjdGVkQWNjb3VudFZlcmlmaWVkSWNvbiIsImNvbm5lY3RlZEFjY291bnRPcGVuSWNvbiIsIkJhZGdlcyIsInJvb3RNb2R1bGUiLCJVc2VyRmxhZ3MiLCJzZXJpYWxpemVkIiwiZmxhZ05hbWUiLCJoYXNGbGFnIiwic2VhcmNoYWJsZSIsIkJhZGdlIiwicHJvZmlsZUJhZGdlV3JhcHBlciIsInByb2ZpbGVCYWRnZSIsIlYyQ19MYXllciIsImtleXVwTGlzdGVuZXIiLCJ0cmFuc2Zvcm0iLCJjb21wb25lbnRXaWxsTW91bnQiLCJjaGFuZ2VDYXRlZ29yeSIsInNlYXJjaEtleURvd24iLCJjaGVja0Nvbm5lY3Rpb24iLCJjb25uZWN0IiwiR3VpbGRTdG9yZSIsIkF2YXRhckRlZmF1bHRzIiwiU29ydGVkR3VpbGRTdG9yZSIsInNlbGVjdGVkQ2F0ZWdvcnkiLCJsb2FkaW5nIiwic2VydmVycyIsImNvbm5lY3Rpb24iLCJmZXRjaCIsInNlcnZlciIsImpvaW5lZCIsInRlcm0iLCJjYXRlZ29yeUJ1dHRvbnMiLCJ0b3RhbCIsInNidiIsImNvbnRlbnRTY3JvbGxlciIsInNlcnZlckNhcmQiLCJwaW5uZWQiLCJhY2NlcHRJbnZpdGUiLCJpbnZpdGVfY29kZSIsImpvaW5FbmRQb2ludCIsImlkZW50aWZpZXIiLCJjcmVkZW50aWFscyIsIndpbmRvd09wdGlvbnMiLCJzY3JlZW5YIiwic2NyZWVuWSIsImpvaW5XaW5kb3ciLCJCcm93c2VyV2luZG93Iiwid2ViQ29udGVudHMiLCJsb2FkVVJMIiwicmVzaXphYmxlIiwibWF4aW1pemFibGUiLCJtaW5pbWl6YWJsZSIsImFsd2F5c09uVG9wIiwiY2VudGVyIiwid2ViUHJlZmVyZW5jZXMiLCJub2RlSW50ZWdyYXRpb24iLCJiZFNlcnZlciIsIm9ubGluZSIsIm1lbWJlcnMiLCJpY29uVXJsIiwibmF0aXZlam9pbiIsInNlcnZlcjIiLCJndWlsZExpc3QiLCJnZXRGbGF0dGVuZWRHdWlsZElkcyIsImRlZmF1bHRMaXN0IiwiREVGQVVMVF9BVkFUQVJTIiwiU2VydmVyQ2FyZCIsImZhbGxiYWNrIiwiZmxvb3IiLCJjb25uZWN0RW5kUG9pbnQiLCJTaWRlYmFyVmlldyIsInRvb2xzIiwiVG9vbHMiLCJUYWJCYXJTZXBhcmF0b3IiLCJzZWFyY2hJbnB1dCIsIlRhYkJhckhlYWRlciIsIlRhYkJhckl0ZW0iLCJtYXhMZW5ndGgiLCJzZWFyY2hpbnB1dCIsIm5vdENvbm5lY3RlZCIsImNvbHVtbk1vZHVsZSIsIm1pbkhlaWdodCIsImxpbmVIZWlnaHQiLCJWMkNfU2VydmVyQ2FyZCIsImltYWdlRXJyb3IiLCJjYXJkTW9kdWxlIiwiY2FyZCIsImNhcmRQcmltYXJ5IiwiX2hvcml6b250YWxSZXZlcnNlIiwid3JhcE1vZHVsZSIsInN0cmVhbWVyTW9kZUVuYWJsZWQiLCJvbkVycm9yIiwiaGFuZGxlRXJyb3IiLCJkcmFnZ2FibGUiLCJWMkNfU2lkZWJhclZpZXciLCJTY3JvbGxlciIsImZhZGUiLCJkYXJrIiwiVjJDX1JlbG9hZEljb24iLCJ4bWxucyIsIlYyQ19TY3JvbGxlciIsInNjcm9sbGVySG9yaXpvbnRhbCIsInNjcm9sbGVyTW9kdWxlMiIsInNpZGViYXJSZWdpb25TY3JvbGxlciIsIndyYXBwZXJDbGFzcyIsInNjcm9sbGVyQ2xhc3MiLCJjb250ZW50UmVnaW9uU2Nyb2xsZXIiLCJjb250ZW50UmVnaW9uU2Nyb2xsZXJXcmFwIiwidGhlbWVHaG9zdCIsInNjcm9sbGVyVHJhY2siLCJWMkNfU2VjdGlvbmVkU2V0dGluZ3NQYW5lbCIsIlNldHRpbmdzR3JvdXAiLCJWMkNfU2V0dGluZ3NHcm91cCIsImJ1dHRvbkNvbXBvbmVudCIsIlYyQ19TZXR0aW5nc1RpdGxlIiwiY2xhc3NuYW1lcyIsImdldENsYXNzTmFtZSIsIlN3aXRjaEl0ZW0iLCJiZXRhIiwidXNlclNldHRpbmdzVm9pY2UiLCJWMkNfVGFiQmFySGVhZGVyIiwiVjJDX1RhYkJhckl0ZW0iLCJWMkNfVGFiQmFyU2VwYXJhdG9yIiwiaW50ZXJ2YWxNb2R1bGUxIiwiSW50ZXJ2YWwiLCJUaW1lUmVuZGVyIiwiX2ludGVydmFsIiwiZ2V0VXBkYXRlZFRpbWUiLCJnZXREaWZmIiwiY2hlY2tVbml4IiwiaG91cnMiLCJtaW51dGVzIiwic2Vjb25kcyIsInJlbmRlclRpbWUiLCJudW1iZXIiLCJyZW1vdmVaZXJvIiwidXNlZFByb3BzIiwiVVNFUl9BQ1RJVklUWV9USU1FU1RBTVBfRU5EIiwiVVNFUl9BQ1RJVklUWV9USU1FU1RBTVBfU1RBUlQiLCJWMkNfVG9vbHMiLCJ0b29sc01vZHVsZSIsInRvb2xzQ29udGFpbmVyIiwiY29udGFpbmVyTW9kdWxlIiwiY2xvc2VCdXR0b24iLCJjbG9zZUJ1dHRvbkJvbGQiLCJrZXliaW5kIiwia2V5YmluZEJvbGQiLCJUb29sdGlwQ2xhc3NlcyIsImdldFRvb2x0aXBDbGFzc2VzIiwiVG9vbHRpcExheWVycyIsImdldFRvb2x0aXBMYXllcnMiLCJnZXRDbGFzcyIsInNpZGVPckNvbG9yIiwidXBwZXJDYXNlIiwidG9vbHRpcENsYXNzIiwiY2xhc3NFeGlzdHMiLCJ0b1B4IiwiRW11bGF0ZWRUb29sdGlwIiwicHJldmVudEZsaXAiLCJ0b29sdGlwRWxlbWVudCIsInRvb2x0aXAiLCJsYWJlbEVsZW1lbnQiLCJ0b29sdGlwQ29udGVudCIsInBvaW50ZXJFbGVtZW50IiwidG9vbHRpcFBvaW50ZXIiLCJwb3BvdXRzIiwiY2FuU2hvd0Fib3ZlIiwiY2FuU2hvd0JlbG93IiwiY2FuU2hvd0xlZnQiLCJjYW5TaG93UmlnaHQiLCJfY2xhc3NOYW1lIiwic2hvd0Fib3ZlIiwic2hvd0JlbG93Iiwic2hvd0xlZnQiLCJzaG93UmlnaHQiLCJjZW50ZXJIb3Jpem9udGFsbHkiLCJjZW50ZXJWZXJ0aWNhbGx5Iiwibm9kZWNlbnRlciIsImZpbmRET01Ob2RlIiwiVjJDX1hTdmciXSwibWFwcGluZ3MiOiI7O1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FB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QVgsQ0FBeUIsTUFBekIsRUFBaUM7QUFBQ0UsZUFBUyxFQUFFLE1BQVo7QUFBb0JnaEMsVUFBSSxFQUFFLFNBQTFCO0FBQXFDdkQsT0FBQyxFQUFFO0FBQXhDLEtBQWpDLENBSkosQ0FIRyxDQUFQO0FBVUg7O0FBaEJxRCxDOzs7Ozs7Ozs7OztBQ0YxRCxtQzs7Ozs7Ozs7Ozs7QUNBQSxxQzs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSwrQjs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSx1Qzs7Ozs7Ozs7Ozs7QUNBQSxpQzs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSxrQyIsImZpbGUiOiJtYWluLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvaW5kZXguanNcIik7XG4iLCJpbXBvcnQgeyByZW1vdGUgfSBmcm9tIFwiZWxlY3Ryb25cIlxyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzXCI7XHJcblxyXG5leHBvcnQgY29uc3QgbWluaW11bURpc2NvcmRWZXJzaW9uID0gXCIwLjAuMzA2XCI7XHJcbmV4cG9ydCBjb25zdCBjdXJyZW50RGlzY29yZFZlcnNpb24gPSAod2luZG93LkRpc2NvcmROYXRpdmUgJiYgd2luZG93LkRpc2NvcmROYXRpdmUucmVtb3RlQXBwICYmIHdpbmRvdy5EaXNjb3JkTmF0aXZlLnJlbW90ZUFwcC5nZXRWZXJzaW9uICYmIHdpbmRvdy5EaXNjb3JkTmF0aXZlLnJlbW90ZUFwcC5nZXRWZXJzaW9uKCkpIHx8IFwiMC4wLjMwNlwiO1xyXG5leHBvcnQgY29uc3QgbWluU3VwcG9ydGVkVmVyc2lvbiA9IFwiMC4zLjBcIjtcclxuZXhwb3J0IGNvbnN0IGJiZFZlcnNpb24gPSBcIjAuMy40XCI7XHJcbmV4cG9ydCBjb25zdCBMQ0NoYW5lbG9nID0ge1xyXG4gICAgZGVzY3JpcHRpb246IFwiTGlnaHRjb3JkJ3MgY2hhbmdlbG9nXCIsXHJcbiAgICBjaGFuZ2VzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aXRsZTogXCJXaGF0J3MgTmV3P1wiLFxyXG4gICAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICAgICAgXCJMaWdodGNvcmQgaXMgbm93IGF2YWlsYWJsZSAhXCIsXHJcbiAgICAgICAgICAgICAgICBcIldlIHJlbW92ZWQgZW1vdGVzLiBUaGF0J3Mgc2FkIGZvciBwZW9wbGUgd2hvIHdlcmUgYWN0dWFsbHkgdXNpbmcgaXQsIGJ1dCBpdCB3YXMgbGVhZGluZyB0byBtb3JlIGxvYWRpbmcgdGltZSBhbmQgc29tZSBiYXNpYyB3b3JkcyB3ZXJlIGVtb3RlLlwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICBdLFxyXG4gICAgaW1hZ2U6IFwiaHR0cHM6Ly9pLmltZ3VyLmNvbS9zZk5ocXdQLnBuZ1wiLFxyXG4gICAgdGl0bGU6IFwiTGlnaHRjb3JkXCIsXHJcbiAgICBzdWJ0aXRsZTogXCJ2XCIrcmVtb3RlLmdldEdsb2JhbChcIkJ1aWxkSW5mb1wiKS52ZXJzaW9uLFxyXG4gICAgZm9vdGVyOiAoZnVuY3Rpb24oKXtcclxuICAgICAgICBjb25zdCBUZXh0RWxlbWVudCA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiVGV4dFwiKTtcclxuICAgICAgICBjb25zdCBNb2RhbFN0YWNrID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJwdXNoXCIsIFwidXBkYXRlXCIsIFwicG9wXCIsIFwicG9wV2l0aEtleVwiKTtcclxuICAgICAgICBpZighVGV4dEVsZW1lbnQgfHwgIU1vZGFsU3RhY2spcmV0dXJuIG51bGxcclxuXHJcbiAgICAgICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XHJcbiAgICAgICAgY29uc3QgQW5jaG9yQ2xhc3NlcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiYW5jaG9yVW5kZXJsaW5lT25Ib3ZlclwiKSB8fCB7YW5jaG9yOiBcImFuY2hvci0zWi04QmJcIiwgYW5jaG9yVW5kZXJsaW5lT25Ib3ZlcjogXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyLTJFU0hRQlwifTtcclxuICAgICAgICBjb25zdCBqb2luU3VwcG9ydFNlcnZlciA9IChjbGljaykgPT4ge1xyXG4gICAgICAgICAgICBjbGljay5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBjbGljay5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgTW9kYWxTdGFjay5wb3AoKTtcclxuICAgICAgICAgICAgQkRWMi5qb2luTEMoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHN1cHBvcnRMaW5rID0gQW5jaG9yID8gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge29uQ2xpY2s6IGpvaW5TdXBwb3J0U2VydmVyfSwgXCJKb2luIG91ciBEaXNjb3JkIFNlcnZlci5cIikgOiBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHtjbGFzc05hbWU6IGAke0FuY2hvckNsYXNzZXMuYW5jaG9yfSAke0FuY2hvckNsYXNzZXMuYW5jaG9yVW5kZXJsaW5lT25Ib3Zlcn1gLCBvbkNsaWNrOiBqb2luU3VwcG9ydFNlcnZlcn0sIFwiSm9pbiBvdXIgRGlzY29yZCBTZXJ2ZXIuXCIpO1xyXG4gICAgICAgIHJldHVybiBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVGV4dEVsZW1lbnQsIHtzaXplOiBUZXh0RWxlbWVudC5TaXplcy5TTUFMTCwgY29sb3I6IFRleHRFbGVtZW50LkNvbG9ycy5TVEFOREFSRH0sIFwiTmVlZCBzdXBwb3J0PyBcIiwgc3VwcG9ydExpbmspO1xyXG4gICAgfSkoKVxyXG59XHJcbmV4cG9ydCBjb25zdCBiYmRDaGFuZ2Vsb2cgPSB7XHJcbiAgICBkZXNjcmlwdGlvbjogXCJCQkQncyBjaGFuZ2Vsb2cuXCIsXHJcbiAgICBjaGFuZ2VzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aXRsZTogXCJXaGF0J3MgTmV3P1wiLFxyXG4gICAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICAgICAgXCIqKkxpZ2h0Y29yZCoqIGlzIG5vdyB1c2luZyBCYW5kYWdlZEJELiBUaGF0IG1lYW5zIGFsbCBwbHVnaW5zIHlvdSB3ZXJlIHVzaW5nIGNhbiBiZSB1c2VkIHRvbyAhXCIsXHJcbiAgICAgICAgICAgICAgICBcIioqV2luZG93IFRyYW5zcGFyZW5jeSoqIGNoYW5nZXMgd2VyZSBtYWRlIHRvIG1vcmUgY29tcGF0aWJsZSB3aXRoIGV4dGVybmFsIHdpbmRvdyBtYW5hZ2VycyBhbmQgYWRkb25zIGxpa2UgR2xhc3N0cm9uLlwiLFxyXG4gICAgICAgICAgICAgICAgXCJJbml0aWFsaXphdGlvbiBzZXF1ZW5jZSBoYXMgb25jZSBhZ2FpbiBiZWVuIGNoYW5nZWQgc2xpZ2h0bHkgdG8gaG9wZWZ1bGx5IGltcHJvdmUgbG9hZGluZyB0aW1lcy5cIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRpdGxlOiBcIkJ1ZyBGaXhlc1wiLFxyXG4gICAgICAgICAgICB0eXBlOiBcImZpeGVkXCIsXHJcbiAgICAgICAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgICAgICAgICBcIlNvbWUgZml4ZXMgcmVsYXRlZCB0byBzaG93aW5nIG1vZGFscyBpbiB0aGUgYEJkQXBpYC5cIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgXVxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHNldHRpbmdzID0ge1xyXG4gICAgXCJDdXN0b20gY3NzIGxpdmUgdXBkYXRlXCI6ICAgICB7aWQ6IFwiYmRhLWNzcy0wXCIsIGluZm86IFwiXCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogdHJ1ZSwgIGNhdDogXCJjb3JlXCJ9LFxyXG4gICAgXCJDdXN0b20gY3NzIGF1dG8gdWRwYXRlXCI6ICAgICB7aWQ6IFwiYmRhLWNzcy0xXCIsIGluZm86IFwiXCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogdHJ1ZSwgIGNhdDogXCJjb3JlXCJ9LFxyXG4gICAgXCJCZXR0ZXJEaXNjb3JkIEJsdWVcIjogICAgICAgICB7aWQ6IFwiYmRhLWdzLWJcIiwgIGluZm86IFwiUmVwbGFjZSBEaXNjb3JkIGJsdWUgd2l0aCBCRCBCbHVlXCIsICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogZmFsc2UsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwifSxcclxuXHJcbiAgICAvKiBDb3JlICovXHJcbiAgICAvKiA9PT09PT0gKi9cclxuICAgIFwiUHVibGljIFNlcnZlcnNcIjogICAgICAgICAgICAge2lkOiBcImJkYS1ncy0xXCIsICBpbmZvOiBcIkRpc3BsYXkgcHVibGljIHNlcnZlcnMgYnV0dG9uXCIsICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJNaW5pbWFsIE1vZGVcIjogICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTJcIiwgIGluZm86IFwiSGlkZSBlbGVtZW50cyBhbmQgcmVkdWNlIHRoZSBzaXplIG9mIGVsZW1lbnRzLlwiLCAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIlZvaWNlIE1vZGVcIjogICAgICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtNFwiLCAgaW5mbzogXCJPbmx5IHNob3cgdm9pY2UgY2hhdFwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiSGlkZSBDaGFubmVsc1wiOiAgICAgICAgICAgICAge2lkOiBcImJkYS1ncy0zXCIsICBpbmZvOiBcIkhpZGUgY2hhbm5lbHMgaW4gbWluaW1hbCBtb2RlXCIsICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJEYXJrIE1vZGVcIjogICAgICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTVcIiwgIGluZm86IFwiTWFrZSBjZXJ0YWluIGVsZW1lbnRzIGRhcmsgYnkgZGVmYXVsdCh3aXApXCIsICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIlZvaWNlIERpc2Nvbm5lY3RcIjogICAgICAgICAgIHtpZDogXCJiZGEtZGMtMFwiLCAgaW5mbzogXCJEaXNjb25uZWN0IGZyb20gdm9pY2Ugc2VydmVyIHdoZW4gY2xvc2luZyBEaXNjb3JkXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiMjQgSG91ciBUaW1lc3RhbXBzXCI6ICAgICAgICAge2lkOiBcImJkYS1ncy02XCIsICBpbmZvOiBcIlJlcGxhY2UgMTJociB0aW1lc3RhbXBzIHdpdGggcHJvcGVyIG9uZXNcIiwgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJDb2xvcmVkIFRleHRcIjogICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTdcIiwgIGluZm86IFwiTWFrZSB0ZXh0IGNvbG9yIHRoZSBzYW1lIGFzIHJvbGUgY29sb3JcIiwgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIk5vcm1hbGl6ZSBDbGFzc2VzXCI6ICAgICAgICAgIHtpZDogXCJmb3JrLXBzLTRcIiwgaW5mbzogXCJBZGRzIHN0YWJsZSBjbGFzc2VzIHRvIGVsZW1lbnRzIHRvIGhlbHAgdGhlbWVzLiAoZS5nLiBhZGRzIC5kYS1jaGFubmVscyB0byAuY2hhbm5lbHMtSWUybDZBKVwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcblxyXG4gICAgLyogQ29udGVudCAqL1xyXG4gICAgXCJDb250ZW50IEVycm9yIE1vZGFsXCI6ICAgICAgICB7aWQ6IFwiZm9yay1wcy0xXCIsIGluZm86IFwiU2hvd3MgYSBtb2RhbCB3aXRoIHBsdWdpbi90aGVtZSBlcnJvcnNcIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcbiAgICBcIlNjYW4gUGx1Z2luc1wiOiAgICAgICAgICAgICAgIHtpZDogXCJmb3JrLXBzLTZcIiwgaW5mbzogXCJTY2FuIHBsdWdpbnMgZm9yIGFueSB0aHJlYXQgdGhhdCBjYW4gYmUgaGlkZGVuIGluc2lkZS5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcbiAgICBcIlNob3cgVG9hc3RzXCI6ICAgICAgICAgICAgICAgIHtpZDogXCJmb3JrLXBzLTJcIiwgaW5mbzogXCJTaG93cyBhIHNtYWxsIG5vdGlmaWNhdGlvbiBmb3IgaW1wb3J0YW50IGluZm9ybWF0aW9uXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxyXG4gICAgXCJTY3JvbGwgVG8gU2V0dGluZ3NcIjogICAgICAgICB7aWQ6IFwiZm9yay1wcy0zXCIsIGluZm86IFwiQXV0by1zY3JvbGxzIHRvIGEgcGx1Z2luJ3Mgc2V0dGluZ3Mgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQgKG9ubHkgaWYgb3V0IG9mIHZpZXcpXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxyXG4gICAgXCJBdXRvbWF0aWMgTG9hZGluZ1wiOiAgICAgICAgICB7aWQ6IFwiZm9yay1wcy01XCIsIGluZm86IFwiQXV0b21hdGljYWxseSBsb2FkcywgcmVsb2FkcywgYW5kIHVubG9hZHMgcGx1Z2lucyBhbmQgdGhlbWVzXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxyXG5cclxuICAgIC8qIERldmVsb3BlciAqL1xyXG4gICAgXCJEZXZlbG9wZXIgTW9kZVwiOiAgICAgICAgIFx0ICB7aWQ6IFwiYmRhLWdzLThcIiwgaW5mbzogXCJEZXZlbG9wZXIgTW9kZSBUb2dnbGVcIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImRldmVsb3BlciBzZXR0aW5nc1wifSxcclxuICAgIFwiQ29weSBTZWxlY3RvclwiOlx0XHRcdCAge2lkOiBcImZvcmstZG0tMVwiLCBpbmZvOiBcIkFkZHMgYSBcXFwiQ29weSBTZWxlY3RvclxcXCIgb3B0aW9uIHRvIGNvbnRleHQgbWVudXMgd2hlbiBkZXZlbG9wZXIgbW9kZSBpcyBhY3RpdmVcIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImRldmVsb3BlciBzZXR0aW5nc1wifSxcclxuICAgIFwiUmVhY3QgRGV2VG9vbHNcIjpcdFx0XHQgIHtpZDogXCJyZWFjdERldlRvb2xzXCIsIGluZm86IFwiQWRkcyByZWFjdCBkZXZlbG9wZXIgdG9vbHMgdG8gdGhlIGRldnRvb2xzLiBNdXN0IGJlIGluc3RhbGxlZCBpbiBHb29nbGUgQ2hyb21lIG9uIHlvdXIgcGMuXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiB0cnVlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJkZXZlbG9wZXIgc2V0dGluZ3NcIn0sXHJcblxyXG4gICAgLyoqIExpZ2h0Y29yZCAqL1xyXG4gICAgXCJEaXNhYmxlIEJldHRlckRpc2NvcmRcIjogICAgICB7aWQ6IFwiYmQtZGlzYWJsZVwiLCAgaW5mbzogXCJEaXNhYmxlIEJldHRlcmRpc2NvcmQgKHBsdWdpbnMsIHRoZW1lcywgZXRjKSAoTm90IGltcGxlbWVudGVkKS5cIiwgaW1wbGVtZW50ZWQ6IGZhbHNlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiQmx1ciBQZXJzb25hbCBJbmZvcm1hdGlvblwiOiAge2lkOiBcImxpZ2h0Y29yZC02XCIsIGluZm86IFwiQmx1ciBzZW5zaXRpdmUgaW5mb3JtYXRpb25zIGxpa2UgZW1haWwsIHBheW1lbnQgaW5mb3MgYW5kIG1vcmUuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiQ2FsbGluZyBSaW5nIEJlYXRcIjogICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC0yXCIsIGluZm86IFwiRW5hYmxlIERpc2NvcmQncyBzcGVjaWFsIGNhbGxpbmcgYmVhdC5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJEZXZlbG9wZXIgT3B0aW9uc1wiOiAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTFcIiwgaW5mbzogXCJFbmFibGUgRGlzY29yZCdzICYgTGlnaHRjb3JkJ3MgSW50ZXJuYWwgRGV2ZWxvcGVyIE9wdGlvbnMuIFRoaXMgYWxsb3cgdGhlIFxcXCJFeHBlcmltZW50c1xcXCIgdGFiLCB0aGUgXFxcIkRldmVsb3BlciBPcHRpb25zXFxcIiB0YWIgYW5kIHRoZSBcXFwiQXBpIENvbXBvbmVudHNcXFwiIHRhYi5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJBZCBCbG9ja1wiOiAgICAgICAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTRcIiwgaW5mbzogXCJCbG9jayBhbnkgQk9UIHRoYXQgZG1zIHlvdSB3aXRoIGFuIGludml0ZSBsaW5rLiBFdmVuIGluIGFuIGVtYmVkLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcbiAgICBcIkVuYWJsZSBMaWdodGNvcmQgU2VydmVyc1wiOiAgIHtpZDogXCJsaWdodGNvcmQtNVwiLCBpbmZvOiBcIkVuYWJsZSBMaWdodGNvcmQncyBzZXJ2ZXJzLiBEaXNhYmxpbmcgdGhpcyB3aWxsIGRpc2FibGUgY3VzdG9tIGJhZGdlcy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJEaXNhYmxlIHR5cGluZ1wiOiAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTdcIiwgaW5mbzogXCJEb24ndCBsZXQgb3RoZXIgc2VlIHlvdSdyZSB0eXBpbmcuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiTGlnaHRjb3JkIFRhYnNcIjogICAgICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC04XCIsIGluZm86IFwiQWxsb3dzIHlvdSB0byBsYXVuY2ggbXVsdGlwbGUgaW5zdGFuY2VzIG9mIExpZ2h0Y29yZCBpbiB0aGUgc2FtZSB3aW5kb3cuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwiLCBleHBlcmltZW50YWw6IHRydWV9LFxyXG5cclxuICAgIC8qKiBMaWdodGNvcmQgV2luZG93ICovXHJcbiAgICBcIkFsd2F5cy1vbi1Ub3BcIjogICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtM1wiLCBpbmZvOiBcIkVuYWJsZSB0aGUgd2luZG93J3MgQWx3YXlzLW9uLVRvcCBtb2RlLCB3aGVyZSBMaWdodGNvcmQgc3RheXMgb24gdG9wIG9mIG90aGVyIGFwcGxpY2F0aW9ucy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiV2luZG93XCJ9LFxyXG4gICAgXCJObyBXaW5kb3cgQm91bmRzXCI6ICAgICAgICAgICB7aWQ6IFwibm9fd2luZG93X2JvdW5kXCIsIGluZm86IFwiRGlzYWJsZSBXaW5kb3cgQm91bmRzLiBDYW4gYmUgdXNlZnVsIGlmIHlvdSB1c2UgYSB3aW5kb3cgbWFuYWdlci5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogcHJvY2Vzcy5wbGF0Zm9ybSAhPT0gXCJsaW51eFwiLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIldpbmRvd1wifSxcclxuICAgIFwiRW5hYmxlIEdsYXNzdHJvblwiOiAgICAgICAgICAge2lkOiBcImVuYWJsZV9nbGFzc3Ryb25cIiwgaW5mbzogXCJFbmFibGUgR2xhc3N0cm9uLiBJZiB5b3UncmUgbm90IHVzaW5nIHRyYW5zcGFyZW50IHRoZW1lcywgdGhpcyBjYW4gcmVkdWNlIGxhZy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiV2luZG93XCJ9LFxyXG4gICAgXHJcbiAgICAvKiogUmljaFByZXNlbmNlICovXHJcbiAgICBcIkVuYWJsZVwiOiAgICAgICAgICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiLCBpbmZvOiBcIkVuYWJsZSBSaWNoUHJlc2VuY2UgYmVsb3cuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwic3RhdHVzXCJ9XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZGVmYXVsdENvb2tpZSA9IHtcclxuICAgIFwiYmRhLWdzLTFcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWdzLTJcIjogZmFsc2UsXHJcbiAgICBcImJkYS1ncy0zXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZ3MtNFwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWdzLTVcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWdzLTZcIjogZmFsc2UsXHJcbiAgICBcImJkYS1ncy03XCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZ3MtOFwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZXMtMFwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZXMtMVwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZXMtMlwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZXMtNFwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWVzLTZcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWVzLTdcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWdzLWJcIjogZmFsc2UsXHJcbiAgICBcImJkYS1lcy04XCI6IHRydWUsXHJcbiAgICBcImJkYS1kYy0wXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtY3NzLTBcIjogZmFsc2UsXHJcbiAgICBcImJkYS1jc3MtMVwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWVzLTlcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1kbS0xXCI6IGZhbHNlLFxyXG4gICAgXCJmb3JrLXBzLTFcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1wcy0yXCI6IHRydWUsXHJcbiAgICBcImZvcmstcHMtM1wiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXBzLTRcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1wcy01XCI6IHRydWUsXHJcbiAgICBcImZvcmstcHMtNlwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLWVzLTJcIjogZmFsc2UsXHJcbiAgICBcImZvcmstZXMtM1wiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXdwLTFcIjogZmFsc2UsXHJcbiAgICBcImZvcmstd3AtMlwiOiBmYWxzZSxcclxuICAgIFwiZm9yay1iZXRhXCI6IHRydWUsXHJcbiAgICBcInJlYWN0RGV2VG9vbHNcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC0xXCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtMlwiOiB0cnVlLFxyXG4gICAgXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiOiBmYWxzZSxcclxuICAgIFwibGlnaHRjb3JkLTNcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC00XCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtNVwiOiB0cnVlLFxyXG4gICAgXCJsaWdodGNvcmQtNlwiOiB0cnVlLFxyXG4gICAgXCJsaWdodGNvcmQtN1wiOiBmYWxzZSxcclxuICAgIFwibGlnaHRjb3JkLThcIjogZmFsc2UsXHJcbiAgICBcIm5vX3dpbmRvd19ib3VuZFwiOiBmYWxzZSxcclxufTtcclxuXHJcblxyXG5leHBvcnQgY29uc3Qgc2V0dGluZ3NDb29raWUgPSB7fTtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXR0aW5nc1JQQyA9IHt9O1xyXG5leHBvcnQgY29uc3QgZGVmYXVsdFJQQyA9IHtcclxuICAgIFwibmFtZVwiOiBcIkxpZ2h0Y29yZFwiLFxyXG4gICAgXCJhcHBsaWNhdGlvbl9pZFwiOiBcIjcxMTQxNjk1NzcxODc1NzQxOFwiLFxyXG4gICAgXCJzdGF0ZVwiOiBcIkxpZ2h0Y29yZCBDbGllbnRcIixcclxuICAgIFwiZGV0YWlsc1wiOiBcIkJyb3dzaW5nIERpc2NvcmRcIixcclxuICAgIFwidGltZXN0YW1wcy5zdGFydFwiOiBEYXRlLm5vdygpLFxyXG4gICAgXCJhc3NldHMuc21hbGxcIjogbnVsbCxcclxuICAgIFwiYXNzZXRzLmxhcmdlXCI6IFwiNzEyMzIzODIxMDM3NjgyNzkxXCJcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGJkcGx1Z2luRXJyb3JzID0gW107XHJcbmV4cG9ydCBjb25zdCBiZHRoZW1lRXJyb3JzID0gW107IC8vIGRlZmluZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcclxuXHJcbmV4cG9ydCBjb25zdCBiZENvbmZpZyA9IE9iamVjdC5jcmVhdGUoQmV0dGVyRGlzY29yZENvbmZpZyk7XHJcblxyXG5leHBvcnQgY29uc3QgYmR0aGVtZXMgPSB7fTtcclxuZXhwb3J0IGNvbnN0IGJkcGx1Z2lucyA9IHt9O1xyXG5cclxuZXhwb3J0IGNvbnN0IHBsdWdpbkNvb2tpZSA9IHt9O1xyXG5leHBvcnQgY29uc3QgdGhlbWVDb29raWUgPSB7fTsiLCJpbXBvcnQgbG9jYWxTdG9yYWdlRml4IGZyb20gXCIuL2xvY2FsU3RvcmFnZUZpeFwiO1xyXG5pbXBvcnQgbG9hZGluZ0ljb24gZnJvbSBcIi4vbG9hZGluZ0ljb25cIjtcclxubG9jYWxTdG9yYWdlRml4KCk7XHJcbmxvYWRpbmdJY29uKCk7XHJcblxyXG5jb25zdCBkZXByZWNhdGVHbG9iYWwgPSAoa2V5LCB2YWx1ZSkgPT4ge1xyXG4gICAgLy8gdmFsdWUgPSB0eXBlb2YodmFsdWUpICE9PSBcIm9iamVjdFwiID8gdmFsdWUgOiBuZXcgUHJveHkodmFsdWUsIHtcclxuICAgIC8vICAgICBnZXQ6IGZ1bmN0aW9uKG9iaiwgbW9kKSB7XHJcbiAgICAvLyAgICAgICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KG1vZCkpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiBvYmpbbW9kXTtcclxuICAgIC8vICAgICB9LFxyXG4gICAgLy8gICAgIHNldDogZnVuY3Rpb24ob2JqLCBtb2QpIHtcclxuICAgIC8vICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShtb2QpKSByZXR1cm4gVXRpbHMuZXJyKFwiRGVwcmVjYXRlZCBHbG9iYWxcIiwgXCJUcnlpbmcgdG8gb3ZlcndyaXRlIGRlcHJlY2F0ZWQgQkQgZ2xvYmFsc1wiKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIGtleSwge1xyXG4gICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgVXRpbHMud2FybihcIkRlcHJlY2F0ZWQgR2xvYmFsXCIsIGBcIiR7a2V5fVwiIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuIFBsZWFzZSBvbmx5IHVzZSBCZEFwaS5gKTtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH0pOyAgXHJcbn07XHJcblxyXG5cclxuaW1wb3J0ICogYXMgR2xvYmFscyBmcm9tIFwiLi8wZ2xvYmFsc1wiO1xyXG5cclxuY29uc3QgZ2xvYmFsS2V5cyA9IE9iamVjdC5rZXlzKEdsb2JhbHMpO1xyXG5mb3IgKGNvbnN0IGtleSBvZiBnbG9iYWxLZXlzKSBkZXByZWNhdGVHbG9iYWwoa2V5LCBHbG9iYWxzW2tleV0pO1xyXG5cclxuXHJcbmltcG9ydCBCZEFwaSBmcm9tIFwiLi9tb2R1bGVzL2JkQXBpXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9tb2R1bGVzL3BsdWdpbk1vZHVsZVwiO1xyXG5pbXBvcnQgdGhlbWVNb2R1bGUgZnJvbSBcIi4vbW9kdWxlcy90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vbW9kdWxlcy91dGlsc1wiO1xyXG5pbXBvcnQgQkRFdmVudHMgZnJvbSBcIi4vbW9kdWxlcy9iZEV2ZW50c1wiO1xyXG5pbXBvcnQgc2V0dGluZ3NQYW5lbCBmcm9tIFwiLi9tb2R1bGVzL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4vbW9kdWxlcy9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgQ2xhc3NOb3JtYWxpemVyIGZyb20gXCIuL21vZHVsZXMvY2xhc3NOb3JtYWxpemVyXCI7XHJcblxyXG5kZXByZWNhdGVHbG9iYWwoXCJCRFYyXCIsIEJEVjIpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJwbHVnaW5Nb2R1bGVcIiwgcGx1Z2luTW9kdWxlKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwidGhlbWVNb2R1bGVcIiwgdGhlbWVNb2R1bGUpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJVdGlsc1wiLCBVdGlscyk7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIkJERXZlbnRzXCIsIEJERXZlbnRzKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwic2V0dGluZ3NQYW5lbFwiLCBzZXR0aW5nc1BhbmVsKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwiRGF0YVN0b3JlXCIsIERhdGFTdG9yZSk7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIkNvbnRlbnRNYW5hZ2VyXCIsIENvbnRlbnRNYW5hZ2VyKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwiQ2xhc3NOb3JtYWxpemVyXCIsIENsYXNzTm9ybWFsaXplcik7XHJcblxyXG53aW5kb3cuQmRBcGkgPSBCZEFwaTtcclxuXHJcbmltcG9ydCBDb3JlIGZyb20gXCIuL21vZHVsZXMvY29yZVwiO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJtYWluQ29yZVwiLCBDb3JlKTtcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29yZVdyYXBwZXIge1xyXG4gICAgY29uc3RydWN0b3IoYmRDb25maWcpIHtcclxuICAgICAgICBDb3JlLnNldENvbmZpZyhiZENvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpIHtcclxuICAgICAgICAvLyBkZXByZWNhdGVHbG9iYWwoXCJtYWluQ29yZVwiLCB0aGlzLm1haW5Db3JlKTtcclxuICAgICAgICBDb3JlLmluaXQoKTtcclxuICAgIH1cclxufVxyXG5cclxuLy8gZnVuY3Rpb24gcGF0Y2hNb2R1bGVMb2FkKCkge1xyXG4vLyAgICAgY29uc3QgbmFtZXNwYWNlID0gXCJiZXR0ZXJkaXNjb3JkXCI7XHJcbi8vICAgICBjb25zdCBwcmVmaXggPSBgJHtuYW1lc3BhY2V9L2A7XHJcbi8vICAgICBjb25zdCBNb2R1bGUgPSByZXF1aXJlKFwibW9kdWxlXCIpO1xyXG4vLyAgICAgY29uc3QgbG9hZCA9IE1vZHVsZS5fbG9hZDtcclxuLy8gICAgIC8vIGNvbnN0IHJlc29sdmVGaWxlbmFtZSA9IE1vZHVsZS5fcmVzb2x2ZUZpbGVuYW1lO1xyXG5cclxuLy8gICAgIE1vZHVsZS5fbG9hZCA9IGZ1bmN0aW9uKHJlcXVlc3QpIHtcclxuLy8gICAgICAgICBpZiAocmVxdWVzdCA9PT0gbmFtZXNwYWNlIHx8IHJlcXVlc3Quc3RhcnRzV2l0aChwcmVmaXgpKSB7XHJcbi8vICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlZCA9IHJlcXVlc3Quc3Vic3RyKHByZWZpeC5sZW5ndGgpO1xyXG4vLyAgICAgICAgICAgICBpZiAocmVxdWVzdGVkID09IFwiYXBpXCIpIHJldHVybiBCZEFwaTtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHJldHVybiBsb2FkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbi8vICAgICB9O1xyXG5cclxuLy8gICAgIC8vIE1vZHVsZS5fcmVzb2x2ZUZpbGVuYW1lID0gZnVuY3Rpb24gKHJlcXVlc3QsIHBhcmVudCwgaXNNYWluKSB7XHJcbi8vICAgICAvLyAgICAgaWYgKHJlcXVlc3QgPT09IFwiYmV0dGVyZGlzY29yZFwiIHx8IHJlcXVlc3Quc3RhcnRzV2l0aChcImJldHRlcmRpc2NvcmQvXCIpKSB7XHJcbi8vICAgICAvLyAgICAgICAgIGNvbnN0IGNvbnRlbnRQYXRoID0gUGx1Z2luTWFuYWdlci5nZXRQbHVnaW5QYXRoQnlNb2R1bGUocGFyZW50KTtcclxuLy8gICAgIC8vICAgICAgICAgaWYgKGNvbnRlbnRQYXRoKSByZXR1cm4gcmVxdWVzdDtcclxuLy8gICAgIC8vICAgICB9XHJcblxyXG4vLyAgICAgLy8gICAgIHJldHVybiByZXNvbHZlRmlsZW5hbWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuLy8gICAgIC8vIH07XHJcblxyXG4vLyAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xyXG4vLyAgICAgICAgIE1vZHVsZS5fbG9hZCA9IGxvYWQ7XHJcbi8vICAgICB9O1xyXG4vLyB9XHJcblxyXG4vLyBwYXRjaE1vZHVsZUxvYWQoKTtcclxuXHJcbi8vIHZhciBzZXR0aW5nc1BhbmVsLCB2b2ljZU1vZGUsLCBkTW9kZSwgcHVibGljU2VydmVyc01vZHVsZTtcclxuLy8gdmFyIGJkQ29uZmlnID0gbnVsbDsiLCJleHBvcnQgZGVmYXVsdCAoKSA9PiB7XHJcbiAgICBjb25zdCB2MkxvYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICB2MkxvYWRlci5jbGFzc05hbWUgPSBcImJkLWxvYWRlcnYyXCI7XHJcbiAgICB2MkxvYWRlci50aXRsZSA9IFwiQmFuZGFnZWRCRCBpcyBsb2FkaW5nLi4uXCI7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHYyTG9hZGVyKTtcclxufTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IGNvbnRlbnRXaW5kb3dHZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEhUTUxJRnJhbWVFbGVtZW50LnByb3RvdHlwZSwgXCJjb250ZW50V2luZG93XCIpLmdldDtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShIVE1MSUZyYW1lRWxlbWVudC5wcm90b3R5cGUsIFwiY29udGVudFdpbmRvd1wiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRXaW5kb3cgPSBSZWZsZWN0LmFwcGx5KGNvbnRlbnRXaW5kb3dHZXR0ZXIsIHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJveHkoY29udGVudFdpbmRvdywge1xyXG4gICAgICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbihvYmosIHByb3ApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJsb2NhbFN0b3JhZ2VcIikgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24ob2JqLCBwcm9wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT09IFwibG9jYWxTdG9yYWdlXCIpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IG9ialtwcm9wXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdmFsLmJpbmQob2JqKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBQcmV2ZW50IGludGVyY2VwdGlvbiBieSBwYXRjaGluZyBSZWZsZWN0LmFwcGx5IGFuZCBGdW5jdGlvbi5wcm90b3R5cGUuYmluZFxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlZmxlY3QsIFwiYXBwbHlcIiwge3ZhbHVlOiBSZWZsZWN0LmFwcGx5LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2V9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdW5jdGlvbi5wcm90b3R5cGUsIFwiYmluZFwiLCB7dmFsdWU6IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2V9KTtcclxuXHJcbiAgICBjb25zdCBvT3BlbiA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuO1xyXG4gICAgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBjb25zdCB1cmwgPSBhcmd1bWVudHNbMV07XHJcbiAgICAgICAgaWYgKHVybC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiYXBpL3dlYmhvb2tzXCIpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShvT3BlbiwgdGhpcywgYXJndW1lbnRzKTtcclxuICAgIH07XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVEZIb3VyIHtcclxuICAgIGluamVjdDI0SG91cigpIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5jZWwyNEhvdXIpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgdHdlbHZlSG91ciA9IG5ldyBSZWdFeHAoYChbMC05XXsxLDJ9KTooWzAtOV17MSwyfSlcXFxccyhBTXxQTSlgKTtcclxuICAgICAgICBjb25zdCBjb252ZXJ0ID0gKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy02XCJdKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSBkYXRhLnJldHVyblZhbHVlLm1hdGNoKHR3ZWx2ZUhvdXIpO1xyXG4gICAgICAgICAgICBpZiAoIW1hdGNoZWQgfHwgbWF0Y2hlZC5sZW5ndGggIT09IDQpIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKG1hdGNoZWRbM10gPT09IFwiQU1cIikgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWUgPSBkYXRhLnJldHVyblZhbHVlLnJlcGxhY2UobWF0Y2hlZFswXSwgYCR7bWF0Y2hlZFsxXSA9PT0gXCIxMlwiID8gXCIwMFwiIDogbWF0Y2hlZFsxXS5wYWRTdGFydCgyLCBcIjBcIil9OiR7bWF0Y2hlZFsyXX1gKTtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWUgPSBkYXRhLnJldHVyblZhbHVlLnJlcGxhY2UobWF0Y2hlZFswXSwgYCR7bWF0Y2hlZFsxXSA9PT0gXCIxMlwiID8gXCIxMlwiIDogcGFyc2VJbnQobWF0Y2hlZFsxXSkgKyAxMn06JHttYXRjaGVkWzJdfWApO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbmNlbENvenkgPSBVdGlscy5tb25rZXlQYXRjaChCRFYyLlRpbWVGb3JtYXR0ZXIsIFwiY2FsZW5kYXJGb3JtYXRcIiwge2FmdGVyOiBjb252ZXJ0fSk7IC8vIENhbGxlZCBpbiBDb3p5IG1vZGVcclxuICAgICAgICBjb25zdCBjYW5jZWxDb21wYWN0ID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5UaW1lRm9ybWF0dGVyLCBcImRhdGVGb3JtYXRcIiwge2FmdGVyOiBjb252ZXJ0fSk7IC8vIENhbGxlZCBpbiBDb21wYWN0IG1vZGVcclxuICAgICAgICB0aGlzLmNhbmNlbDI0SG91ciA9ICgpID0+IHtjYW5jZWxDb3p5KCk7IGNhbmNlbENvbXBhY3QoKTt9OyAvLyBDYW5jZWwgYm90aFxyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZTI0SG91cigpIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5jZWwyNEhvdXIpIHRoaXMuY2FuY2VsMjRIb3VyKCk7XHJcbiAgICB9XHJcbn07IiwiaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCJcclxuXHJcbmNvbnN0IGRpc3BhdGNoZXIgPSB3aW5kb3cuTGlnaHRjb3JkLkRpc2NvcmRNb2R1bGVzLmRpc3BhdGNoZXJcclxuY29uc3QgQ2hhbm5lbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldENoYW5uZWwgJiYgZS5kZWZhdWx0Lmhhc0NoYW5uZWwpWzBdLmRlZmF1bHRcclxubGV0IHJlbGF0aW9uU2hpcE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmFkZFJlbGF0aW9uc2hpcClbMF1cclxubGV0IERNTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbClbMF1cclxuXHJcbmNvbnN0IGJsb2NrZWQgPSB7fVxyXG5cclxubGV0IHVzZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilbMF1cclxuZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXIoKXtcclxuICAgIGlmKHVzZXJNb2R1bGUpcmV0dXJuIHVzZXJNb2R1bGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXHJcbiAgICByZXR1cm4gbnVsbFxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQW50aUJvdERNIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5hbnRpRE0gPSB0aGlzLmFudGlETS5iaW5kKHRoaXMpXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGUoKXtcclxuICAgICAgICBpZih0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxyXG5cclxuICAgICAgICBkaXNwYXRjaGVyLnN1YnNjcmliZShcIk1FU1NBR0VfQ1JFQVRFXCIsIHRoaXMuYW50aURNKVxyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUoKXtcclxuICAgICAgICBpZighdGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcblxyXG4gICAgICAgIGRpc3BhdGNoZXIudW5zdWJzY3JpYmUoXCJNRVNTQUdFX0NSRUFURVwiLCB0aGlzLmFudGlETSlcclxuICAgIH1cclxuXHJcbiAgICBhbnRpRE0oZXYpe1xyXG4gICAgICAgIGlmKCFldi5tZXNzYWdlLmF1dGhvci5ib3QpcmV0dXJuXHJcbiAgICAgICAgaWYoZXYubWVzc2FnZS5hdXRob3IuaWQgPT09IGdldEN1cnJlbnRVc2VyKCkuaWQpXHJcbiAgICAgICAgaWYoZXYubWVzc2FnZS5ndWlsZF9pZClyZXR1cm5cclxuXHJcbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IENoYW5uZWxNb2R1bGUuZ2V0Q2hhbm5lbChldi5tZXNzYWdlLmNoYW5uZWxfaWQpXHJcbiAgICAgICAgaWYoIWNoYW5uZWwpcmV0dXJuIC8vIG1pZ2h0IGJlIGJyb2tlblxyXG5cclxuICAgICAgICBpZihjaGFubmVsLnR5cGUgIT09IDEpcmV0dXJuXHJcblxyXG4gICAgICAgIGlmKGJsb2NrZWRbZXYubWVzc2FnZS5hdXRob3IuaWRdKXJldHVybiAvLyBJZiB0aGUgdXNlciB1bmJsb2NrIHRoZSBib3QsIERvbid0IGJsb2NrIGl0IGFnYWluLlxyXG5cclxuICAgICAgICBpZihzY2FuTWVzc2FnZShldi5tZXNzYWdlKSl7XHJcbiAgICAgICAgICAgIGJsb2NrZWRbZXYubWVzc2FnZS5hdXRob3IuaWRdID0gdHJ1ZVxyXG4gICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoYFtBZEJsb2NrXTogQmxvY2tlZCAke2V2Lm1lc3NhZ2UuYXV0aG9yLnVzZXJuYW1lfSMke2V2Lm1lc3NhZ2UuYXV0aG9yLmRpc2NyaW1pbmF0b3J9YCwge1xyXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwid2FybmluZ1wiXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGlmKCFyZWxhdGlvblNoaXBNb2R1bGUpcmVsYXRpb25TaGlwTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuYWRkUmVsYXRpb25zaGlwKVswXVxyXG4gICAgICAgICAgICByZWxhdGlvblNoaXBNb2R1bGUuZGVmYXVsdC5hZGRSZWxhdGlvbnNoaXAoZXYubWVzc2FnZS5hdXRob3IuaWQsIHtcclxuICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBcIkNvbnRleHRNZW51XCJcclxuICAgICAgICAgICAgfSwgMilcclxuICAgICAgICAgICAgaWYoIURNTW9kdWxlKURNTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbClbMF1cclxuICAgICAgICAgICAgRE1Nb2R1bGUuZGVmYXVsdC5jbG9zZVByaXZhdGVDaGFubmVsKGNoYW5uZWwuaWQsIGZhbHNlKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2Nhbk1lc3NhZ2UobWVzc2FnZSl7XHJcbiAgICBpZigvKGRpc2NvcmRcXC5nZ3xkaXNjb3JkXFwuY29tXFwvaW52aXRlXFwvfGRpc2NvcmRhcHBcXC5jb21cXC9pbnZpdGVcXC8pL2cudGVzdChtZXNzYWdlLmNvbnRlbnQpKXJldHVybiB0cnVlXHJcbiAgICBpZihFbWJlZHNDb250YWlucyhtZXNzYWdlLCBcImRpc2NvcmQuZ2cvXCIpIHx8IEVtYmVkc0NvbnRhaW5zKG1lc3NhZ2UsIFwiZGlzY29yZC5jb20vaW52aXRlL1wiKSB8fCBFbWJlZHNDb250YWlucyhtZXNzYWdlLCBcImRpc2NvcmRhcHAuY29tL2ludml0ZS9cIikpcmV0dXJuIHRydWVcclxuXHJcbiAgICByZXR1cm4gZmFsc2VcclxufVxyXG5mdW5jdGlvbiBFbWJlZHNDb250YWlucyhtZXNzYWdlLCBzZWFyY2gpe1xyXG4gICAgbGV0IGVtYmVkcyA9IG1lc3NhZ2UuZW1iZWRzXHJcbiAgICBpZihlbWJlZHMubGVuZ3RoID09PSAwKXJldHVybiBmYWxzZVxyXG4gICAgcmV0dXJuIGVtYmVkcy5tYXAoZW1iZWQgPT4ge1xyXG4gICAgICAgIGlmKGVtYmVkLnR5cGUgIT09IFwicmljaFwiKXJldHVybiBmYWxzZVxyXG4gICAgICAgIGlmKChlbWJlZC50aXRsZSB8fCBcIlwiKS5pbmNsdWRlcyhzZWFyY2gpKXJldHVybiB0cnVlXHJcbiAgICAgICAgaWYoKGVtYmVkLmRlc2NyaXB0aW9uIHx8IFwiXCIpLmluY2x1ZGVzKHNlYXJjaCkpcmV0dXJuIHRydWVcclxuICAgICAgICBpZigoKGVtYmVkLmZvb3RlciB8fCBcIlwiKSAmJiBlbWJlZC5mb290ZXIudGV4dCB8fCBcIlwiKS5pbmNsdWRlcyhzZWFyY2gpKXJldHVybiB0cnVlXHJcbiAgICAgICAgaWYoZW1iZWQuZmllbGRzLm1hcChlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGUudmFsdWUuaW5jbHVkZXMoc2VhcmNoKSB8fCBlLm5hbWUuaW5jbHVkZXMoc2VhcmNoKVxyXG4gICAgICAgIH0pLmluY2x1ZGVzKHRydWUpKXJldHVybiB0cnVlXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcblxyXG4gICAgfSkuaW5jbHVkZXModHJ1ZSlcclxufSIsImltcG9ydCB7c2V0dGluZ3NSUEMsIGRlZmF1bHRSUEN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5cclxuY29uc3QgZGlzcGF0Y2hlciA9IEJETW9kdWxlcy5nZXQobT0+bS5EaXNwYXRjaGVyJiZtLmRlZmF1bHQmJm0uZGVmYXVsdC5kaXNwYXRjaClbMF0uZGVmYXVsdFxyXG5jb25zdCBBY3Rpb25UeXBlcyA9IEJETW9kdWxlcy5nZXQobT0+bS5BY3Rpb25UeXBlcylbMF0uQWN0aW9uVHlwZXNcclxuXHJcbmNvbnN0IHNvY2tldElkID0gXCJsaWdodGNvcmQtc3Bvb2Ytc29ja2V0XCJcclxuY29uc3QgcGlkID0gcHJvY2Vzcy5waWRcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBDdXN0b21SaWNoUHJlc2VuY2Uge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxyXG5cclxuICAgICAgICB0aGlzLmdhbWUgPSBzZXR0aW5nc1JQQ1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBnZXQgZm9ybWF0ZWRHYW1lKCl7XHJcbiAgICAgICAgaWYoIXRoaXMuZ2FtZSlyZXR1cm4gbnVsbFxyXG4gICAgICAgIGlmKHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UpcmV0dXJuIG51bGxcclxuICAgICAgICBsZXQgZ2FtZSA9IHtcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5nYW1lLm5hbWUgfHwgZGVmYXVsdFJQQy5uYW1lLFxyXG4gICAgICAgICAgICBhcHBsaWNhdGlvbl9pZDogdGhpcy5nYW1lLmFwcGxpY2F0aW9uX2lkIHx8IGRlZmF1bHRSUEMuYXBwbGljYXRpb25faWQsXHJcbiAgICAgICAgICAgIGRldGFpbHM6IHRoaXMuZ2FtZS5kZXRhaWxzIHx8IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgc3RhdGU6IHRoaXMuZ2FtZS5zdGF0ZSB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHRpbWVzdGFtcHM6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl0gPyB7XHJcbiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5nYW1lW1widGltZXN0YW1wcy5zdGFydFwiXVxyXG4gICAgICAgICAgICB9IDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBhc3NldHM6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSA/IHtcclxuICAgICAgICAgICAgICAgIGxhcmdlX2ltYWdlOiB0aGlzLmdhbWVbXCJhc3NldHMubGFyZ2VcIl0sXHJcbiAgICAgICAgICAgICAgICBzbWFsbF9pbWFnZTogdGhpcy5nYW1lW1wiYXNzZXRzLnNtYWxsXCJdIHx8IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICB9IDogdW5kZWZpbmVkXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBnYW1lXHJcbiAgICB9XHJcblxyXG4gICAgc2VuZEdhbWUoKXtcclxuICAgICAgICBkaXNwYXRjaGVyLmRpc3BhdGNoKHtcclxuICAgICAgICAgICAgdHlwZTogQWN0aW9uVHlwZXMuTE9DQUxfQUNUSVZJVFlfVVBEQVRFLFxyXG4gICAgICAgICAgICBzb2NrZXRJZCxcclxuICAgICAgICAgICAgcGlkLFxyXG4gICAgICAgICAgICBhY3Rpdml0eTogdGhpcy5mb3JtYXRlZEdhbWVcclxuICAgICAgICB9KSAgIFxyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZSgpIHtcclxuICAgICAgICBpZih0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiRW5hYmxpbmcgY3VzdG9tIFJpY2hQcmVzZW5jZVwiKVxyXG5cclxuICAgICAgICB0aGlzLnNldChzZXR0aW5nc1JQQyB8fCBPYmplY3QuY3JlYXRlKGRlZmF1bHRSUEMpKVxyXG5cclxuICAgICAgICB0aGlzLnNlbmRHYW1lKClcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKCkge1xyXG4gICAgICAgIGlmKCF0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkRpc2FibGluZyBjdXN0b20gUmljaFByZXNlbmNlXCIpXHJcblxyXG4gICAgICAgIHRoaXMuc2VuZEdhbWUoKVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGZldGNoQXNzZXRzKGFwcGxpY2F0aW9uSWQpe1xyXG4gICAgICAgIGxldCBhc3NldHMgPSBhd2FpdCBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5nZXRBc3NldHMpWzBdLmdldEFzc2V0cyhhcHBsaWNhdGlvbklkKVxyXG4gICAgICAgIGlmKGFzc2V0cy51bmRlZmluZWQgJiYgdHlwZW9mIGFzc2V0cy51bmRlZmluZWQgPT09IFwibnVtYmVyXCIpe1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIEFwcGxpY2F0aW9uXCIpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhc3NldHNcclxuICAgIH1cclxuXHJcbiAgICBzZXQoYWN0aXZpdHkpe1xyXG4gICAgICAgIHRoaXMuZ2FtZSA9IGFjdGl2aXR5XHJcblxyXG4gICAgICAgIHRoaXMuc2VuZEdhbWUoKVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtwbHVnaW5Db29raWUsIHRoZW1lQ29va2llLCBiZHBsdWdpbnMsIGJkdGhlbWVzLCBzZXR0aW5nc0Nvb2tpZSwgc2V0dGluZ3N9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgbWFpbkNvcmUgZnJvbSBcIi4vY29yZVwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9wbHVnaW5Nb2R1bGVcIjtcclxuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuY29uc3QgQmRBcGkgPSB7XHJcbiAgICBnZXQgUmVhY3QoKSB7IHJldHVybiBCRFYyLlJlYWN0OyB9LFxyXG4gICAgZ2V0IFJlYWN0RE9NKCkgeyByZXR1cm4gQkRWMi5SZWFjdERvbTsgfSxcclxuICAgIGdldCBSZWFjdENvbXBvbmVudCgpIHtyZXR1cm4gQkRWMi5SZWFjdENvbXBvbmVudDt9LFxyXG4gICAgZ2V0IFdpbmRvd0NvbmZpZ0ZpbGUoKSB7cmV0dXJuIFV0aWxzLldpbmRvd0NvbmZpZ0ZpbGU7fSxcclxuICAgIGdldCBzZXR0aW5ncygpIHtyZXR1cm4gc2V0dGluZ3M7fSxcclxuICAgIGdldCBlbW90ZXMoKSB7cmV0dXJuIHt9fSwgLy8gZGVwcmVjYXRlZCwgZGVsZXRlZCBhbGwgZW1vdGVzIGZyb20gYmV0dGVyZGlzY29yZC5cclxuICAgIGdldCBzY3JlZW5XaWR0aCgpIHsgcmV0dXJuIE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7IH0sXHJcbiAgICBnZXQgc2NyZWVuSGVpZ2h0KCkgeyByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApOyB9XHJcbn07XHJcblxyXG5CZEFwaS5nZXRBbGxXaW5kb3dQcmVmZXJlbmNlcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgcmV0dXJuIFV0aWxzLmdldEFsbFdpbmRvd1ByZWZlcmVuY2VzKCk7XHJcbn07XHJcblxyXG5CZEFwaS5nZXRXaW5kb3dQcmVmZXJlbmNlID0gZnVuY3Rpb24oa2V5KSB7XHJcbiAgICByZXR1cm4gVXRpbHMuZ2V0V2luZG93UHJlZmVyZW5jZShrZXkpO1xyXG59O1xyXG5cclxuQmRBcGkuc2V0V2luZG93UHJlZmVyZW5jZSA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcclxuICAgIHJldHVybiBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKGtleSwgdmFsdWUpO1xyXG59O1xyXG5cclxuLy9JbmplY3QgQ1NTIHRvIGRvY3VtZW50IGhlYWRcclxuLy9pZCA9IGlkIG9mIGVsZW1lbnRcclxuLy9jc3MgPSBjdXN0b20gY3NzXHJcbkJkQXBpLmluamVjdENTUyA9IGZ1bmN0aW9uIChpZCwgY3NzKSB7XHJcbiAgICBET00uYWRkU3R5bGUoRE9NLmVzY2FwZUlEKGlkKSwgY3NzKTtcclxufTtcclxuXHJcbi8vQ2xlYXIgY3NzL3JlbW92ZSBhbnkgZWxlbWVudFxyXG4vL2lkID0gaWQgb2YgZWxlbWVudFxyXG5CZEFwaS5jbGVhckNTUyA9IGZ1bmN0aW9uIChpZCkge1xyXG4gICAgRE9NLnJlbW92ZVN0eWxlKERPTS5lc2NhcGVJRChpZCkpO1xyXG59O1xyXG5cclxuLy9JbmplY3QgQ1NTIHRvIGRvY3VtZW50IGhlYWRcclxuLy9pZCA9IGlkIG9mIGVsZW1lbnRcclxuLy9jc3MgPSBjdXN0b20gY3NzXHJcbkJkQXBpLmxpbmtKUyA9IGZ1bmN0aW9uIChpZCwgdXJsKSB7XHJcbiAgICBET00uYWRkU2NyaXB0KERPTS5lc2NhcGVJRChpZCksIHVybCk7XHJcbn07XHJcblxyXG4vL0NsZWFyIGNzcy9yZW1vdmUgYW55IGVsZW1lbnRcclxuLy9pZCA9IGlkIG9mIGVsZW1lbnRcclxuQmRBcGkudW5saW5rSlMgPSBmdW5jdGlvbiAoaWQpIHtcclxuICAgIERPTS5yZW1vdmVTY3JpcHQoRE9NLmVzY2FwZUlEKGlkKSk7XHJcbn07XHJcblxyXG4vL0dldCBhbm90aGVyIHBsdWdpblxyXG4vL25hbWUgPSBuYW1lIG9mIHBsdWdpblxyXG5CZEFwaS5nZXRQbHVnaW4gPSBmdW5jdGlvbiAobmFtZSkge1xyXG4gICAgaWYgKGJkcGx1Z2lucy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xyXG4gICAgICAgIHJldHVybiBiZHBsdWdpbnNbbmFtZV0ucGx1Z2luO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG4vL0dldCBCZXR0ZXJEaXNjb3JkIENvcmVcclxuQmRBcGkuZ2V0Q29yZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIFV0aWxzLndhcm4oXCJEZXByZWNhdGlvbiBOb3RpY2VcIiwgYEJkQXBpLmdldENvcmUoKSB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLmApO1xyXG4gICAgcmV0dXJuIG1haW5Db3JlO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFNob3dzIGEgZ2VuZXJpYyBidXQgdmVyeSBjdXN0b21pemFibGUgbW9kYWwuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIHRpdGxlIG9mIHRoZSBtb2RhbFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIGEgc3RyaW5nIG9mIHRleHQgdG8gZGlzcGxheSBpbiB0aGUgbW9kYWxcclxuICovXHJcbkJkQXBpLmFsZXJ0ID0gZnVuY3Rpb24gKHRpdGxlLCBjb250ZW50KSB7XHJcbiAgICByZXR1cm4gVXRpbHMuc2hvd0NvbmZpcm1hdGlvbk1vZGFsKHRpdGxlLCBjb250ZW50LCB7Y2FuY2VsVGV4dDogbnVsbH0pO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFNob3dzIGEgZ2VuZXJpYyBidXQgdmVyeSBjdXN0b21pemFibGUgY29uZmlybWF0aW9uIG1vZGFsIHdpdGggb3B0aW9uYWwgY29uZmlybSBhbmQgY2FuY2VsIGNhbGxiYWNrcy5cclxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gdGl0bGUgb2YgdGhlIG1vZGFsXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xSZWFjdEVsZW1lbnR8QXJyYXk8c3RyaW5nfFJlYWN0RWxlbWVudD4pfSBjaGlsZHJlbiAtIGEgc2luZ2xlIG9yIG1peGVkIGFycmF5IG9mIHJlYWN0IGVsZW1lbnRzIGFuZCBzdHJpbmdzLiBFdmVyeSBzdHJpbmcgaXMgd3JhcHBlZCBpbiBEaXNjb3JkJ3MgYE1hcmtkb3duYCBjb21wb25lbnQgc28gc3RyaW5ncyB3aWxsIHNob3cgYW5kIHJlbmRlciBwcm9wZXJseS5cclxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIG9wdGlvbnMgdG8gbW9kaWZ5IHRoZSBtb2RhbFxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRhbmdlcj1mYWxzZV0gLSB3aGV0aGVyIHRoZSBtYWluIGJ1dHRvbiBzaG91bGQgYmUgcmVkIG9yIG5vdFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY29uZmlybVRleHQ9T2theV0gLSB0ZXh0IGZvciB0aGUgY29uZmlybWF0aW9uL3N1Ym1pdCBidXR0b25cclxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNhbmNlbFRleHQ9Q2FuY2VsXSAtIHRleHQgZm9yIHRoZSBjYW5jZWwgYnV0dG9uXHJcbiAqIEBwYXJhbSB7Y2FsbGFibGV9IFtvcHRpb25zLm9uQ29uZmlybT1OT09QXSAtIGNhbGxiYWNrIHRvIG9jY3VyIHdoZW4gY2xpY2tpbmcgdGhlIHN1Ym1pdCBidXR0b25cclxuICogQHBhcmFtIHtjYWxsYWJsZX0gW29wdGlvbnMub25DYW5jZWw9Tk9PUF0gLSBjYWxsYmFjayB0byBvY2N1ciB3aGVuIGNsaWNraW5nIHRoZSBjYW5jZWwgYnV0dG9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5rZXldIC0ga2V5IHVzZWQgdG8gaWRlbnRpZnkgdGhlIG1vZGFsLiBJZiBub3QgcHJvdmlkZWQsIG9uZSBpcyBnZW5lcmF0ZWQgYW5kIHJldHVybmVkXHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIGtleSB1c2VkIGZvciB0aGlzIG1vZGFsXHJcbiAqL1xyXG5CZEFwaS5zaG93Q29uZmlybWF0aW9uTW9kYWwgPSBmdW5jdGlvbiAodGl0bGUsIGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgcmV0dXJuIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbCh0aXRsZSwgY29udGVudCwgb3B0aW9ucyk7XHJcbn07XHJcblxyXG4vL1Nob3cgdG9hc3QgYWxlcnRcclxuQmRBcGkuc2hvd1RvYXN0ID0gZnVuY3Rpb24oY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICBVdGlscy5zaG93VG9hc3QoY29udGVudCwgb3B0aW9ucyk7XHJcbn07XHJcblxyXG4vLyBGaW5kcyBtb2R1bGVcclxuQmRBcGkuZmluZE1vZHVsZSA9IGZ1bmN0aW9uKGZpbHRlcikge1xyXG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZChmaWx0ZXIpO1xyXG59O1xyXG5cclxuLy8gRmluZHMgbW9kdWxlXHJcbkJkQXBpLmZpbmRBbGxNb2R1bGVzID0gZnVuY3Rpb24oZmlsdGVyKSB7XHJcbiAgICByZXR1cm4gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQWxsKGZpbHRlcik7XHJcbn07XHJcblxyXG4vLyBGaW5kcyBtb2R1bGVcclxuQmRBcGkuZmluZE1vZHVsZUJ5UHJvcHMgPSBmdW5jdGlvbiguLi5wcm9wcykge1xyXG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhwcm9wcyk7XHJcbn07XHJcblxyXG5CZEFwaS5maW5kTW9kdWxlQnlQcm90b3R5cGVzID0gZnVuY3Rpb24oLi4ucHJvdG9zKSB7XHJcbiAgICByZXR1cm4gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlQcm90b3R5cGVzKHByb3Rvcyk7XHJcbn07XHJcblxyXG5CZEFwaS5maW5kTW9kdWxlQnlEaXNwbGF5TmFtZSA9IGZ1bmN0aW9uKG5hbWUpIHtcclxuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKG5hbWUpO1xyXG59O1xyXG5cclxuLy8gR2V0cyByZWFjdCBpbnN0YW5jZVxyXG5CZEFwaS5nZXRJbnRlcm5hbEluc3RhbmNlID0gZnVuY3Rpb24obm9kZSkge1xyXG4gICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIHdpbmRvdy5qUXVlcnkpICYmICEobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBqUXVlcnkpIG5vZGUgPSBub2RlWzBdO1xyXG4gICAgcmV0dXJuIEJEVjIuZ2V0SW50ZXJuYWxJbnN0YW5jZShub2RlKTtcclxufTtcclxuXHJcbi8vIEdldHMgZGF0YVxyXG5CZEFwaS5sb2FkRGF0YSA9IGZ1bmN0aW9uKHBsdWdpbk5hbWUsIGtleSkge1xyXG4gICAgcmV0dXJuIERhdGFTdG9yZS5nZXRQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSk7XHJcbn07XHJcblxyXG5CZEFwaS5nZXREYXRhID0gQmRBcGkubG9hZERhdGE7XHJcblxyXG4vLyBTZXRzIGRhdGFcclxuQmRBcGkuc2F2ZURhdGEgPSBmdW5jdGlvbihwbHVnaW5OYW1lLCBrZXksIGRhdGEpIHtcclxuICAgIHJldHVybiBEYXRhU3RvcmUuc2V0UGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXksIGRhdGEpO1xyXG59O1xyXG5cclxuQmRBcGkuc2V0RGF0YSA9IEJkQXBpLnNhdmVEYXRhO1xyXG5cclxuLy8gRGVsZXRlcyBkYXRhXHJcbkJkQXBpLmRlbGV0ZURhdGEgPSBmdW5jdGlvbihwbHVnaW5OYW1lLCBrZXkpIHtcclxuICAgIHJldHVybiBEYXRhU3RvcmUuZGVsZXRlUGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXkpO1xyXG59O1xyXG5cclxuLy8gUGF0Y2hlcyBvdGhlciBmdW5jdGlvbnNcclxuQmRBcGkubW9ua2V5UGF0Y2ggPSBmdW5jdGlvbih3aGF0LCBtZXRob2ROYW1lLCBvcHRpb25zKSB7XHJcbiAgICByZXR1cm4gVXRpbHMubW9ua2V5UGF0Y2god2hhdCwgbWV0aG9kTmFtZSwgb3B0aW9ucyk7XHJcbn07XHJcblxyXG4vLyBFdmVudCB3aGVuIGVsZW1lbnQgaXMgcmVtb3ZlZFxyXG5CZEFwaS5vblJlbW92ZWQgPSBmdW5jdGlvbihub2RlLCBjYWxsYmFjaykge1xyXG4gICAgcmV0dXJuIFV0aWxzLm9uUmVtb3ZlZChub2RlLCBjYWxsYmFjayk7XHJcbn07XHJcblxyXG4vLyBXcmFwcyBmdW5jdGlvbiBpbiB0cnkuLmNhdGNoXHJcbkJkQXBpLnN1cHByZXNzRXJyb3JzID0gZnVuY3Rpb24obWV0aG9kLCBtZXNzYWdlKSB7XHJcbiAgICByZXR1cm4gVXRpbHMuc3VwcHJlc3NFcnJvcnMobWV0aG9kLCBtZXNzYWdlKTtcclxufTtcclxuXHJcbi8vIFRlc3RzIGZvciB2YWxpZCBKU09OXHJcbkJkQXBpLnRlc3RKU09OID0gZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgcmV0dXJuIFV0aWxzLnRlc3RKU09OKGRhdGEpO1xyXG59O1xyXG5cclxuQmRBcGkuaXNQbHVnaW5FbmFibGVkID0gZnVuY3Rpb24obmFtZSkge1xyXG4gICAgcmV0dXJuICEhcGx1Z2luQ29va2llW25hbWVdO1xyXG59O1xyXG5cclxuQmRBcGkuaXNUaGVtZUVuYWJsZWQgPSBmdW5jdGlvbihuYW1lKSB7XHJcbiAgICByZXR1cm4gISF0aGVtZUNvb2tpZVtuYW1lXTtcclxufTtcclxuXHJcbkJkQXBpLmlzU2V0dGluZ0VuYWJsZWQgPSBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuICEhc2V0dGluZ3NDb29raWVbaWRdO1xyXG59O1xyXG5cclxuQmRBcGkuZW5hYmxlU2V0dGluZyA9IGZ1bmN0aW9uKGlkKSB7XHJcbiAgICByZXR1cm4gc2V0dGluZ3NQYW5lbC5vbkNoYW5nZShpZCwgdHJ1ZSk7XHJcbn07XHJcblxyXG5CZEFwaS5kaXNhYmxlU2V0dGluZyA9IGZ1bmN0aW9uKGlkKSB7XHJcbiAgICByZXR1cm4gc2V0dGluZ3NQYW5lbC5vbkNoYW5nZShpZCwgZmFsc2UpO1xyXG59O1xyXG5cclxuQmRBcGkudG9nZ2xlU2V0dGluZyA9IGZ1bmN0aW9uKGlkKSB7XHJcbiAgICByZXR1cm4gc2V0dGluZ3NQYW5lbC5vbkNoYW5nZShpZCwgIXNldHRpbmdzQ29va2llW2lkXSk7XHJcbn07XHJcblxyXG4vLyBHZXRzIGRhdGFcclxuQmRBcGkuZ2V0QkREYXRhID0gZnVuY3Rpb24oa2V5KSB7XHJcbiAgICByZXR1cm4gRGF0YVN0b3JlLmdldEJERGF0YShrZXkpO1xyXG59O1xyXG5cclxuLy8gU2V0cyBkYXRhXHJcbkJkQXBpLnNldEJERGF0YSA9IGZ1bmN0aW9uKGtleSwgZGF0YSkge1xyXG4gICAgcmV0dXJuIERhdGFTdG9yZS5zZXRCRERhdGEoa2V5LCBkYXRhKTtcclxufTtcclxuXHJcblxyXG5cclxuY29uc3QgbWFrZUFkZG9uQVBJID0gKGNvb2tpZSwgbGlzdCwgbWFuYWdlcikgPT4gbmV3IGNsYXNzIEFkZG9uQVBJIHtcclxuXHJcbiAgICBnZXQgZm9sZGVyKCkge3JldHVybiBtYW5hZ2VyLmZvbGRlcjt9XHJcblxyXG4gICAgaXNFbmFibGVkKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gISFjb29raWVbbmFtZV07XHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gbWFuYWdlci5lbmFibGUobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZShuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIG1hbmFnZXIuZGlzYWJsZShuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICB0b2dnbGUobmFtZSkge1xyXG4gICAgICAgIGlmIChjb29raWVbbmFtZV0pIHRoaXMuZGlzYWJsZShuYW1lKTtcclxuICAgICAgICBlbHNlIHRoaXMuZW5hYmxlKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbG9hZChuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIG1hbmFnZXIucmVsb2FkKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldChuYW1lKSB7XHJcbiAgICAgICAgaWYgKGxpc3QuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcclxuICAgICAgICAgICAgaWYgKGxpc3RbbmFtZV0ucGx1Z2luKSByZXR1cm4gbGlzdFtuYW1lXS5wbHVnaW47XHJcbiAgICAgICAgICAgIHJldHVybiBsaXN0W25hbWVdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBbGwoKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGxpc3QpLm1hcChrID0+IHRoaXMuZ2V0KGspKS5maWx0ZXIoYSA9PiBhKTtcclxuICAgIH1cclxufTtcclxuXHJcbkJkQXBpLlBsdWdpbnMgPSBtYWtlQWRkb25BUEkocGx1Z2luQ29va2llLCBiZHBsdWdpbnMsIHBsdWdpbk1vZHVsZSk7XHJcbkJkQXBpLlRoZW1lcyA9IG1ha2VBZGRvbkFQSSh0aGVtZUNvb2tpZSwgYmR0aGVtZXMsIHRoZW1lTW9kdWxlKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJkQXBpO1xyXG5cclxud2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkJkQXBpID0gQmRBcGkiLCIvKiBCREV2ZW50cyAqL1xyXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKFwiZXZlbnRzXCIpO1xyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQkRFdmVudHMgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBzdXBlcigpXHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkJERXZlbnRzID0gdGhpc1xyXG4gICAgfVxyXG4gICAgZGlzcGF0Y2goZXZlbnROYW1lLCAuLi5hcmdzKSB7dGhpcy5lbWl0KGV2ZW50TmFtZSwgLi4uYXJncyk7fVxyXG4gICAgb2ZmKGV2ZW50TmFtZSwgZXZlbnRBY3Rpb24pIHt0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRBY3Rpb24pO31cclxufTsiLCIvKipcclxuICogQ3JlZGl0cyB0byBAaGVsbGJvdW5kMTMzNyBvbiBnaXRodWIgZm9yIHRoZSBjc3NcclxuICovXHJcblxyXG5pbXBvcnQgRE9NVG9vbHMgZnJvbSBcIi4vZG9tdG9vbHNcIlxyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIlxyXG5cclxubGV0IHNlbGVjdG9yc1xyXG5jb25zdCByZW1vdmVEYSA9IFV0aWxzLnJlbW92ZURhXHJcbmZ1bmN0aW9uIGdldFNlbGVjdG9ycygpe1xyXG4gICAgbGV0IHN0YW5kYXJkU2lkZWJhclZpZXcgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zdGFuZGFyZFNpZGViYXJWaWV3KVswXVxyXG4gICAgaWYoIXN0YW5kYXJkU2lkZWJhclZpZXcpcmV0dXJuIG51bGxcclxuICAgIGxldCBkZWZhdWx0Q2xhc3NOYW1lID0gcmVtb3ZlRGEoc3RhbmRhcmRTaWRlYmFyVmlldy5zdGFuZGFyZFNpZGViYXJWaWV3KVxyXG4gICAgbGV0IHNlbGVjdHMgPSBbXVxyXG4gICAgc2VsZWN0cy5wdXNoKGAjYXBwLW1vdW50IC4ke2RlZmF1bHRDbGFzc05hbWV9IC5wYXltZW50LWluZm8gLiR7cmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuZGVzY3JpcHRpb24gJiYgdHlwZW9mIGUuZGVzY3JpcHRpb24gPT09IFwic3RyaW5nXCIgJiYgZS5kZXNjcmlwdGlvbi5pbmNsdWRlcyhcImZvcm1UZXh0XCIpKVswXS5kZXNjcmlwdGlvbil9YClcclxuICAgIHNlbGVjdHMucHVzaChgI2FwcC1tb3VudCAuJHtkZWZhdWx0Q2xhc3NOYW1lfSAuJHtyZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wYXltZW50U291cmNlUm93KVswXS5wYXltZW50U291cmNlUm93KX0gLiR7cmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuc3ViVGV4dCAmJiBlLmRlc2NyaXB0aW9uV3JhcHBlcilbMF0uc3ViVGV4dCl9YClcclxuICAgIHNlbGVjdHMucHVzaChgI2FwcC1tb3VudCAuJHtkZWZhdWx0Q2xhc3NOYW1lfSAuJHtyZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS51c2VyU2V0dGluZ3NBY2NvdW50KVswXS51c2VyU2V0dGluZ3NBY2NvdW50KX0gZGl2Om50aC1jaGlsZCgyKT5kaXY6bnRoLWNoaWxkKDIpPi4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLnZpZXdCb2R5KVswXS52aWV3Qm9keSl9YClcclxuICAgIHJldHVybiBzZWxlY3RzXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBCbHVyUHJpdmF0ZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKCl7XHJcbiAgICAgICAgaWYodGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcclxuICAgICAgICBzZWxlY3RvcnMgPSBzZWxlY3RvcnMgfHwgZ2V0U2VsZWN0b3JzKClcclxuXHJcbiAgICAgICAgaWYoIXNlbGVjdG9ycyljb25zb2xlLmVycm9yKG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgc2VsZWN0b3JzIHRvIGJsdXIgcGVyc29ubmFsIGluZm9ybWF0aW9ucy5cIikpXHJcbiAgICAgICAgRE9NVG9vbHMuYWRkU3R5bGUoXCJibHVyUHJpdmF0ZVwiLCBgXHJcbiR7c2VsZWN0b3JzWzBdfSwgJHtzZWxlY3RvcnNbMV19LCAke3NlbGVjdG9yc1syXX0ge1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGN1YmljLWJlemllciguNTUsLjA4NSwuNjgsLjUzKTtcclxuICAgIGZpbHRlcjogYmx1cig0cHgpO1xyXG4gICAgb3BhY2l0eTogLjg7XHJcbn1cclxuXHJcbiR7c2VsZWN0b3JzWzBdfTpob3ZlciwgJHtzZWxlY3RvcnNbMV19OmhvdmVyLCAke3NlbGVjdG9yc1syXX06aG92ZXIge1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGN1YmljLWJlemllciguNTUsLjA5LC42OCwuNTMpO1xyXG4gICAgZmlsdGVyOiBub25lO1xyXG4gICAgb3BhY2l0eTogMTtcclxufWApXHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZSgpe1xyXG4gICAgICAgIGlmKCF0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgICAgICBET01Ub29scy5yZW1vdmVTdHlsZShcImJsdXJQcml2YXRlXCIpXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuXHJcbmNvbnN0IG5vcm1hbGl6ZWRQcmVmaXggPSBcImRhXCI7XHJcbmNvbnN0IHJhbmRDbGFzcyA9IG5ldyBSZWdFeHAoYF4oPyEke25vcm1hbGl6ZWRQcmVmaXh9LSkoKD86W0EtWmEtel18WzAtOV18LSkrKS0oPzpbQS1aYS16XXxbMC05XXwtfF8pezZ9JGApO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIENsYXNzTm9ybWFsaXplciB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5CREV2ZW50cyA9IHRoaXNcclxuICAgIH1cclxuICAgIHN0b3AoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc1BhdGNoZWQpIHJldHVybjtcclxuICAgICAgICB0aGlzLnVucGF0Y2hDbGFzc01vZHVsZXMoV2VicGFja01vZHVsZXMuZmluZEFsbCh0aGlzLm1vZHVsZUZpbHRlci5iaW5kKHRoaXMpKSk7XHJcbiAgICAgICAgdGhpcy5yZXZlcnRFbGVtZW50KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwLW1vdW50XCIpKTtcclxuICAgICAgICB0aGlzLmhhc1BhdGNoZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydCgpIHtcclxuICAgICAgICBpZiAodGhpcy5oYXNQYXRjaGVkKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5wYXRjaENsYXNzTW9kdWxlcyhXZWJwYWNrTW9kdWxlcy5maW5kQWxsKHRoaXMubW9kdWxlRmlsdGVyLmJpbmQodGhpcykpKTtcclxuICAgICAgICB0aGlzLm5vcm1hbGl6ZUVsZW1lbnQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhcHAtbW91bnRcIikpO1xyXG4gICAgICAgIHRoaXMuaGFzUGF0Y2hlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5wYXRjaERPTU1ldGhvZHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXRjaENsYXNzTW9kdWxlcyhtb2R1bGVzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xyXG4gICAgICAgICAgICB0aGlzLnBhdGNoQ2xhc3NNb2R1bGUobm9ybWFsaXplZFByZWZpeCwgbW9kdWxlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdW5wYXRjaENsYXNzTW9kdWxlcyhtb2R1bGVzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xyXG4gICAgICAgICAgICB0aGlzLnVucGF0Y2hDbGFzc01vZHVsZShub3JtYWxpemVkUHJlZml4LCBtb2R1bGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzaG91bGRJZ25vcmUodmFsdWUpIHtcclxuICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKHZhbHVlLmVuZHNXaXRoKFwicHhcIikgfHwgdmFsdWUuZW5kc1dpdGgoXCJjaFwiKSB8fCB2YWx1ZS5lbmRzV2l0aChcImVtXCIpIHx8IHZhbHVlLmVuZHNXaXRoKFwibXNcIikpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKFwibGF5ZXJDb250YWluZXItXCIpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aChcIiNcIikgJiYgKHZhbHVlLmxlbmd0aCA9PSA3IHx8IHZhbHVlLmxlbmd0aCA9PSA0KSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKHZhbHVlLmluY2x1ZGVzKFwiY2FsYyhcIikgfHwgdmFsdWUuaW5jbHVkZXMoXCJyZ2JhXCIpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbW9kdWxlRmlsdGVyKG1vZHVsZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobW9kdWxlKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmIChtb2R1bGUuX19lc01vZHVsZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmICghT2JqZWN0LmtleXMobW9kdWxlKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBmb3IgKGNvbnN0IGJhc2VDbGFzc05hbWUgaW4gbW9kdWxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbW9kdWxlW2Jhc2VDbGFzc05hbWVdO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZElnbm9yZSh2YWx1ZSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUuc3BsaXQoXCItXCIpLmxlbmd0aCA9PT0gMSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoIXJhbmRDbGFzcy50ZXN0KHZhbHVlLnNwbGl0KFwiIFwiKVswXSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHBhdGNoQ2xhc3NNb2R1bGUoY29tcG9uZW50TmFtZSwgY2xhc3NOYW1lcykge1xyXG4gICAgICAgIGZvciAoY29uc3QgYmFzZUNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlKHZhbHVlKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHZhbHVlLnNwbGl0KFwiIFwiKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBub3JtYWxDbGFzcyBvZiBjbGFzc0xpc3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gbm9ybWFsQ2xhc3MubWF0Y2gocmFuZENsYXNzKTtcclxuICAgICAgICAgICAgICAgIGlmICghbWF0Y2ggfHwgIW1hdGNoLmxlbmd0aCB8fCBtYXRjaC5sZW5ndGggPCAyKSBjb250aW51ZTsgLy8gU2hvdWxkbid0IGV2ZXIgaGFwcGVuIHNpbmNlIHRoZXkgcGFzc2VkIHRoZSBtb2R1bGVGaWx0ZXIsIGJ1dCB5b3UgbmV2ZXIga25vd1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2FtZWxDYXNlID0gbWF0Y2hbMV0uc3BsaXQoXCItXCIpLm1hcCgocywgaSkgPT4gaSA/IHNbMF0udG9VcHBlckNhc2UoKSArIHMuc2xpY2UoMSkgOiBzKS5qb2luKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXSArPSBgICR7Y29tcG9uZW50TmFtZX0tJHtjYW1lbENhc2V9YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1bnBhdGNoQ2xhc3NNb2R1bGUoY29tcG9uZW50TmFtZSwgY2xhc3NOYW1lcykge1xyXG4gICAgICAgIGZvciAoY29uc3QgYmFzZUNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlKHZhbHVlKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGxldCBuZXdTdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgICAgICBjb25zdCBjbGFzc0xpc3QgPSB2YWx1ZS5zcGxpdChcIiBcIik7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgbm9ybWFsQ2xhc3Mgb2YgY2xhc3NMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobm9ybWFsQ2xhc3Muc3RhcnRzV2l0aChgJHtjb21wb25lbnROYW1lfS1gKSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBuZXdTdHJpbmcgKz0gYCAke25vcm1hbENsYXNzfWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXSA9IG5ld1N0cmluZy50cmltKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5vcm1hbGl6ZUVsZW1lbnQoZWxlbWVudCkge1xyXG4gICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBlbGVtZW50LmNsYXNzTGlzdDtcclxuICAgICAgICBmb3IgKGxldCBjID0gMCwgY2xlbiA9IGNsYXNzZXMubGVuZ3RoOyBjIDwgY2xlbjsgYysrKSB7XHJcbiAgICAgICAgICAgIGlmICghcmFuZENsYXNzLnRlc3QoY2xhc3Nlc1tjXSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IGNsYXNzZXNbY10ubWF0Y2gocmFuZENsYXNzKVsxXTtcclxuICAgICAgICAgICAgY29uc3QgbmV3Q2xhc3MgPSBtYXRjaC5zcGxpdChcIi1cIikubWFwKChzLCBpKSA9PiBpID8gc1swXS50b1VwcGVyQ2FzZSgpICsgcy5zbGljZSgxKSA6IHMpLmpvaW4oXCJcIik7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChgJHtub3JtYWxpemVkUHJlZml4fS0ke25ld0NsYXNzfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsZW1lbnQuY2hpbGRyZW4pIHRoaXMubm9ybWFsaXplRWxlbWVudChjaGlsZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV2ZXJ0RWxlbWVudChlbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4gJiYgZWxlbWVudC5jaGlsZHJlbi5sZW5ndGgpIHRoaXMucmV2ZXJ0RWxlbWVudChlbGVtZW50LmNoaWxkcmVuWzBdKTtcclxuICAgICAgICBpZiAoZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpIHRoaXMucmV2ZXJ0RWxlbWVudChlbGVtZW50Lm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IGVsZW1lbnQuY2xhc3NMaXN0O1xyXG4gICAgICAgIGNvbnN0IHRvUmVtb3ZlID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjbGFzc2VzLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgIGlmIChjbGFzc2VzW2NdLnN0YXJ0c1dpdGgoYCR7bm9ybWFsaXplZFByZWZpeH0tYCkpIHRvUmVtb3ZlLnB1c2goY2xhc3Nlc1tjXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSguLi50b1JlbW92ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcGF0Y2hET01NZXRob2RzKCkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5zID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5jb250YWlucztcclxuICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24odG9rZW4pIHtcclxuICAgICAgICAgICAgLy8gY29uc3QgdG9rZW5zID0gdG9rZW4uc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShjb250YWlucywgdGhpcywgW3Rva2VuLnNwbGl0KFwiIFwiKVswXV0pO1xyXG4gICAgICAgICAgICAvLyByZXR1cm4gdG9rZW5zLmV2ZXJ5KHQgPT4gY29udGFpbnMuY2FsbCh0aGlzLCB0KSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgYWRkID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5hZGQ7XHJcbiAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiguLi50b2tlbnMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCB0b2tlbnMubGVuZ3RoOyB0KyspIHtcclxuICAgICAgICAgICAgICAgIHRva2Vuc1t0XSA9IHRva2Vuc1t0XS5zcGxpdChcIiBcIilbMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkoYWRkLCB0aGlzLCB0b2tlbnMpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IHJlbW92ZSA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUucmVtb3ZlO1xyXG4gICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oLi4udG9rZW5zKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgdG9rZW5zLmxlbmd0aDsgdCsrKSB7XHJcbiAgICAgICAgICAgICAgICB0b2tlbnNbdF0gPSB0b2tlbnNbdF0uc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KHJlbW92ZSwgdGhpcywgdG9rZW5zKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxufTsiLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQ29sb3JlZFRleHQge1xyXG4gICAgaW5qZWN0Q29sb3JlZFRleHQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FuY2VsQ29sb3JlZFRleHQpIHJldHVybjtcclxuICAgICAgICBpZiAoIUJEVjIuTWVzc2FnZUNvbXBvbmVudCkgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLmNhbmNlbENvbG9yZWRUZXh0ID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5NZXNzYWdlQ29tcG9uZW50LCBcImRlZmF1bHRcIiwge2JlZm9yZTogKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXTtcclxuICAgICAgICAgICAgaWYgKCFwcm9wcyB8fCAhcHJvcHMuY2hpbGRyZW5NZXNzYWdlQ29udGVudCkgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlQ29udGVudCA9IHByb3BzLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoIW1lc3NhZ2VDb250ZW50LnR5cGUgfHwgIW1lc3NhZ2VDb250ZW50LnR5cGUudHlwZSB8fCBtZXNzYWdlQ29udGVudC50eXBlLnR5cGUuZGlzcGxheU5hbWUgIT0gXCJNZXNzYWdlQ29udGVudFwiKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsVHlwZSA9IG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZTtcclxuICAgICAgICAgICAgaWYgKG9yaWdpbmFsVHlwZS5fX29yaWdpbmFsTWV0aG9kKSByZXR1cm47IC8vIERvbid0IHBhdGNoIGFnYWluXHJcbiAgICAgICAgICAgIG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZSA9IGZ1bmN0aW9uKHByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IG9yaWdpbmFsVHlwZShwcm9wcyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlQ29sb3IgPSBzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy03XCJdID8gcHJvcHMubWVzc2FnZS5jb2xvclN0cmluZyB8fCBcIlwiIDogXCJcIjtcclxuICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnByb3BzLnN0eWxlID0ge2NvbG9yOiByb2xlQ29sb3J9O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlLl9fb3JpZ2luYWxNZXRob2QgPSBvcmlnaW5hbFR5cGU7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWVzc2FnZUNvbnRlbnQudHlwZS50eXBlLCBvcmlnaW5hbFR5cGUpO1xyXG4gICAgICAgIH19KTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVDb2xvcmVkVGV4dCgpIHtcclxuICAgICAgICBsZXQgY2xhc3NOYW1lTWFya3VwID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFya3VwKVswXS5tYXJrdXBcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLlwiK2NsYXNzTmFtZU1hcmt1cC5zcGxpdChcIiBcIilbMF0pLmZvckVhY2goZWxlbSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW0uc3R5bGUuc2V0UHJvcGVydHkoXCJjb2xvclwiLCBcIlwiKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufTsiLCJpbXBvcnQge2JkQ29uZmlnLCBiZHBsdWdpbnMsIGJkdGhlbWVzLCBzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vcGx1Z2luTW9kdWxlXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gXCJjcnlwdG9cIlxyXG5pbXBvcnQgZGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgcGx1Z2luQ2VydGlmaWVyLCB7IGVuY3J5cHRTZXR0aW5nc0NhY2hlLCBkZWNyeXB0U2V0dGluZ3NDYWNoZSwgcHJvY2Vzc0ZpbGUgfSBmcm9tIFwiLi9wbHVnaW5DZXJ0aWZpZXJcIjtcclxuaW1wb3J0IHsgY2FwdHVyZVJlamVjdGlvblN5bWJvbCB9IGZyb20gXCJldmVudHNcIjtcclxuXHJcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcclxuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XHJcbmNvbnN0IE1vZHVsZSA9IHJlcXVpcmUoXCJtb2R1bGVcIikuTW9kdWxlO1xyXG5Nb2R1bGUuZ2xvYmFsUGF0aHMucHVzaChwYXRoLnJlc29sdmUocmVxdWlyZShcImVsZWN0cm9uXCIpLnJlbW90ZS5hcHAuZ2V0QXBwUGF0aCgpLCBcIm5vZGVfbW9kdWxlc1wiKSk7XHJcbmNsYXNzIE1ldGFFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcclxuICAgICAgICBzdXBlcihtZXNzYWdlKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIk1ldGFFcnJvclwiO1xyXG4gICAgfVxyXG59XHJcbmNvbnN0IG9yaWdpbmFsSlNSZXF1aXJlID0gTW9kdWxlLl9leHRlbnNpb25zW1wiLmpzXCJdO1xyXG5jb25zdCBvcmlnaW5hbENTU1JlcXVpcmUgPSBNb2R1bGUuX2V4dGVuc2lvbnNbXCIuY3NzXCJdID8gTW9kdWxlLl9leHRlbnNpb25zW1wiLmNzc1wiXSA6ICgpID0+IHtyZXR1cm4gbnVsbDt9O1xyXG5jb25zdCBzcGxpdFJlZ2V4ID0gL1teXFxTXFxyXFxuXSo/KD86XFxyXFxufFxcbilbXlxcU1xcclxcbl0qP1xcKlteXFxTXFxyXFxuXT8vO1xyXG5jb25zdCBlc2NhcGVkQXRSZWdleCA9IC9eXFxcXEAvO1xyXG5cclxuZXhwb3J0IGxldCBhZGRvbkNhY2hlID0ge31cclxuXHJcbmxldCBoYXNQYXRjaGVkID0gZmFsc2VcclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIENvbnRlbnRNYW5hZ2VyIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLnRpbWVDYWNoZSA9IHt9O1xyXG4gICAgICAgIHRoaXMud2F0Y2hlcnMgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICBwYXRjaEV4dGVuc2lvbnMoKXtcclxuICAgICAgICBpZihoYXNQYXRjaGVkKXJldHVyblxyXG4gICAgICAgIGhhc1BhdGNoZWQgPSB0cnVlXHJcbiAgICAgICAgTW9kdWxlLl9leHRlbnNpb25zW1wiLmpzXCJdID0gdGhpcy5nZXRDb250ZW50UmVxdWlyZShcInBsdWdpblwiKTtcclxuICAgICAgICBNb2R1bGUuX2V4dGVuc2lvbnNbXCIuY3NzXCJdID0gdGhpcy5nZXRDb250ZW50UmVxdWlyZShcInRoZW1lXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwbHVnaW5zRm9sZGVyKCkge3JldHVybiB0aGlzLl9wbHVnaW5zRm9sZGVyIHx8ICh0aGlzLl9wbHVnaW5zRm9sZGVyID0gZnMucmVhbHBhdGhTeW5jKHBhdGgucmVzb2x2ZShiZENvbmZpZy5kYXRhUGF0aCArIFwicGx1Z2lucy9cIikpKTt9XHJcbiAgICBnZXQgdGhlbWVzRm9sZGVyKCkge3JldHVybiB0aGlzLl90aGVtZXNGb2xkZXIgfHwgKHRoaXMuX3RoZW1lc0ZvbGRlciA9IGZzLnJlYWxwYXRoU3luYyhwYXRoLnJlc29sdmUoYmRDb25maWcuZGF0YVBhdGggKyBcInRoZW1lcy9cIikpKTt9XHJcblxyXG4gICAgbG9hZEFkZG9uQ2VydGlmaWVyQ2FjaGUoKXtcclxuICAgICAgICBpZih0eXBlb2YgZGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcIlBsdWdpbkNlcnRpZmllckhhc2hlc1wiKSAhPT0gXCJzdHJpbmdcIil7XHJcbiAgICAgICAgICAgIGRhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJQbHVnaW5DZXJ0aWZpZXJIYXNoZXNcIiwgZW5jcnlwdFNldHRpbmdzQ2FjaGUoXCJ7fVwiKSlcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgYWRkb25DYWNoZSA9IEpTT04ucGFyc2UoZGVjcnlwdFNldHRpbmdzQ2FjaGUoZGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcIlBsdWdpbkNlcnRpZmllckhhc2hlc1wiKSkpXHJcbiAgICAgICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgICAgIGRhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJQbHVnaW5DZXJ0aWZpZXJIYXNoZXNcIiwgZW5jcnlwdFNldHRpbmdzQ2FjaGUoXCJ7fVwiKSlcclxuICAgICAgICAgICAgICAgIGFkZG9uQ2FjaGUgPSB7fVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIE9iamVjdC5rZXlzKGFkZG9uQ2FjaGUpXHJcbiAgICAgICAgLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgbGV0IHZhbHVlID0gYWRkb25DYWNoZVtrZXldXHJcbiAgICAgICAgICAgIGlmKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpcmV0dXJuIGRlbGV0ZSBhZGRvbkNhY2hlW2tleV1cclxuXHJcbiAgICAgICAgICAgIGxldCBwcm9wcyA9IFt7XHJcbiAgICAgICAgICAgICAgICBrZXk6IFwidGltZXN0YW1wXCIsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBcIm51bWJlclwiXHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIGtleTogXCJyZXN1bHRcIixcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCJcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAga2V5OiBcImhhc2hcIixcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCJcclxuICAgICAgICAgICAgfV1cclxuICAgICAgICAgICAgZm9yKGxldCBwcm9wIG9mIHByb3BzKXtcclxuICAgICAgICAgICAgICAgIGlmKCEocHJvcC5rZXkgaW4gdmFsdWUpIHx8IHR5cGVvZiB2YWx1ZVtwcm9wLmtleV0gIT09IHByb3AudHlwZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGFkZG9uQ2FjaGVba2V5XVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHZhbHVlLmhhc2ggIT09IGtleSl7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgYWRkb25DYWNoZVtrZXldXHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZih2YWx1ZS5yZXN1bHQuc3VzcGVjdCl7IC8vIHJlZmV0Y2ggZnJvbSByZW1vdGUgdG8gYmUgc3VyZSB5b3UncmUgdXAgdG8gZGF0ZS5cclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBhZGRvbkNhY2hlW2tleV1cclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLnNhdmVBZGRvbkNhY2hlKClcclxuICAgIH1cclxuXHJcbiAgICBzYXZlQWRkb25DYWNoZSgpe1xyXG4gICAgICAgIGRhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJQbHVnaW5DZXJ0aWZpZXJIYXNoZXNcIiwgZW5jcnlwdFNldHRpbmdzQ2FjaGUoSlNPTi5zdHJpbmdpZnkoYWRkb25DYWNoZSkpKVxyXG4gICAgfVxyXG5cclxuICAgIHdhdGNoQ29udGVudChjb250ZW50VHlwZSkge1xyXG4gICAgICAgIGlmICh0aGlzLndhdGNoZXJzW2NvbnRlbnRUeXBlXSkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gY29udGVudFR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgY29uc3QgZmlsZUVuZGluZyA9IGlzUGx1Z2luID8gXCIucGx1Z2luLmpzXCIgOiBcIi50aGVtZS5jc3NcIjtcclxuICAgICAgICB0aGlzLndhdGNoZXJzW2NvbnRlbnRUeXBlXSA9IGZzLndhdGNoKGJhc2VGb2xkZXIsIHtwZXJzaXN0ZW50OiBmYWxzZX0sIGFzeW5jIChldmVudFR5cGUsIGZpbGVuYW1lKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghZXZlbnRUeXBlIHx8ICFmaWxlbmFtZSB8fCAhZmlsZW5hbWUuZW5kc1dpdGgoZmlsZUVuZGluZykpIHJldHVybjtcclxuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIDUwKSk7XHJcbiAgICAgICAgICAgIHRyeSB7ZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSk7fVxyXG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyLmNvZGUgIT09IFwiRU5PRU5UXCIpIHJldHVybjtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnRpbWVDYWNoZVtmaWxlbmFtZV07XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNQbHVnaW4pIHJldHVybiBwbHVnaW5Nb2R1bGUudW5sb2FkUGx1Z2luKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGVtZU1vZHVsZS51bmxvYWRUaGVtZShmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFmcy5zdGF0U3luYyhwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKS5pc0ZpbGUoKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCBzdGF0cyA9IGZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpO1xyXG4gICAgICAgICAgICBpZiAoIXN0YXRzIHx8ICFzdGF0cy5tdGltZSB8fCAhc3RhdHMubXRpbWUuZ2V0VGltZSgpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Yoc3RhdHMubXRpbWUuZ2V0VGltZSgpKSAhPT0gXCJudW1iZXJcIikgcmV0dXJuO1xyXG4gICAgICAgICAgICBpZiAodGhpcy50aW1lQ2FjaGVbZmlsZW5hbWVdID09IHN0YXRzLm10aW1lLmdldFRpbWUoKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICB0aGlzLnRpbWVDYWNoZVtmaWxlbmFtZV0gPSBzdGF0cy5tdGltZS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gXCJyZW5hbWVcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzUGx1Z2luKSBhd2FpdCBwbHVnaW5Nb2R1bGUubG9hZFBsdWdpbihmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGF3YWl0IHRoZW1lTW9kdWxlLmxvYWRUaGVtZShmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBcImNoYW5nZVwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNQbHVnaW4pIGF3YWl0IHBsdWdpbk1vZHVsZS5yZWxvYWRQbHVnaW4oZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBhd2FpdCB0aGVtZU1vZHVsZS5yZWxvYWRUaGVtZShmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB1bndhdGNoQ29udGVudChjb250ZW50VHlwZSkge1xyXG4gICAgICAgIGlmICghdGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV0pIHJldHVybjtcclxuICAgICAgICB0aGlzLndhdGNoZXJzW2NvbnRlbnRUeXBlXS5jbG9zZSgpO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLndhdGNoZXJzW2NvbnRlbnRUeXBlXTtcclxuICAgIH1cclxuXHJcbiAgICBleHRyYWN0TWV0YShjb250ZW50KSB7XHJcbiAgICAgICAgY29uc3QgZmlyc3RMaW5lID0gY29udGVudC5zcGxpdChcIlxcblwiKVswXTtcclxuICAgICAgICBjb25zdCBoYXNPbGRNZXRhID0gZmlyc3RMaW5lLmluY2x1ZGVzKFwiLy9NRVRBXCIpO1xyXG4gICAgICAgIGlmIChoYXNPbGRNZXRhKSByZXR1cm4gdGhpcy5wYXJzZU9sZE1ldGEoY29udGVudCk7XHJcbiAgICAgICAgY29uc3QgaGFzTmV3TWV0YSA9IGZpcnN0TGluZS5pbmNsdWRlcyhcIi8qKlwiKTtcclxuICAgICAgICBpZiAoaGFzTmV3TWV0YSkgcmV0dXJuIHRoaXMucGFyc2VOZXdNZXRhKGNvbnRlbnQpO1xyXG4gICAgICAgIHRocm93IG5ldyBNZXRhRXJyb3IoXCJNRVRBIHdhcyBub3QgZm91bmQuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHBhcnNlT2xkTWV0YShjb250ZW50KSB7XHJcbiAgICAgICAgY29uc3QgbWV0YSA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIilbMF07XHJcbiAgICAgICAgY29uc3QgcmF3TWV0YSA9IG1ldGEuc3Vic3RyaW5nKG1ldGEubGFzdEluZGV4T2YoXCIvL01FVEFcIikgKyA2LCBtZXRhLmxhc3RJbmRleE9mKFwiKi8vXCIpKTtcclxuICAgICAgICBpZiAobWV0YS5pbmRleE9mKFwiTUVUQVwiKSA8IDApIHRocm93IG5ldyBNZXRhRXJyb3IoXCJNRVRBIHdhcyBub3QgZm91bmQuXCIpO1xyXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IFV0aWxzLnRlc3RKU09OKHJhd01ldGEpO1xyXG4gICAgICAgIGlmICghcGFyc2VkKSB0aHJvdyBuZXcgTWV0YUVycm9yKFwiTUVUQSBjb3VsZCBub3QgYmUgcGFyc2VkLlwiKTtcclxuICAgICAgICBpZiAoIXBhcnNlZC5uYW1lKSB0aHJvdyBuZXcgTWV0YUVycm9yKFwiTUVUQSBtaXNzaW5nIG5hbWUgZGF0YS5cIik7XHJcbiAgICAgICAgcGFyc2VkLmZvcm1hdCA9IFwianNvblwiO1xyXG4gICAgICAgIHJldHVybiBwYXJzZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcGFyc2VOZXdNZXRhKGNvbnRlbnQpIHtcclxuICAgICAgICBjb25zdCBibG9jayA9IGNvbnRlbnQuc3BsaXQoXCIvKipcIiwgMilbMV0uc3BsaXQoXCIqL1wiLCAxKVswXTtcclxuICAgICAgICBjb25zdCBvdXQgPSB7fTtcclxuICAgICAgICBsZXQgZmllbGQgPSBcIlwiO1xyXG4gICAgICAgIGxldCBhY2N1bSA9IFwiXCI7XHJcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGJsb2NrLnNwbGl0KHNwbGl0UmVnZXgpKSB7XHJcbiAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCA9PT0gMCkgY29udGludWU7XHJcbiAgICAgICAgICAgIGlmIChsaW5lLmNoYXJBdCgwKSA9PT0gXCJAXCIgJiYgbGluZS5jaGFyQXQoMSkgIT09IFwiIFwiKSB7XHJcbiAgICAgICAgICAgICAgICBvdXRbZmllbGRdID0gYWNjdW07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsID0gbGluZS5pbmRleE9mKFwiIFwiKTtcclxuICAgICAgICAgICAgICAgIGZpZWxkID0gbGluZS5zdWJzdHIoMSwgbCAtIDEpO1xyXG4gICAgICAgICAgICAgICAgYWNjdW0gPSBsaW5lLnN1YnN0cihsICsgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhY2N1bSArPSBcIiBcIiArIGxpbmUucmVwbGFjZShcIlxcXFxuXCIsIFwiXFxuXCIpLnJlcGxhY2UoZXNjYXBlZEF0UmVnZXgsIFwiQFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBvdXRbZmllbGRdID0gYWNjdW0udHJpbSgpO1xyXG4gICAgICAgIGRlbGV0ZSBvdXRbXCJcIl07XHJcbiAgICAgICAgb3V0LmZvcm1hdCA9IFwianNkb2NcIjtcclxuICAgICAgICByZXR1cm4gb3V0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldENvbnRlbnRSZXF1aXJlKHR5cGUpIHtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxSZXF1aXJlID0gaXNQbHVnaW4gPyBvcmlnaW5hbEpTUmVxdWlyZSA6IG9yaWdpbmFsQ1NTUmVxdWlyZTtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24obW9kdWxlLCBmaWxlbmFtZSkge1xyXG4gICAgICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyBzZWxmLnBsdWdpbnNGb2xkZXIgOiBzZWxmLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICAgICAgY29uc3QgcG9zc2libGVQYXRoID0gcGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIHBhdGguYmFzZW5hbWUoZmlsZW5hbWUpKTtcclxuICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHBvc3NpYmxlUGF0aCkgfHwgZmlsZW5hbWUgIT09IGZzLnJlYWxwYXRoU3luYyhwb3NzaWJsZVBhdGgpKSByZXR1cm4gUmVmbGVjdC5hcHBseShvcmlnaW5hbFJlcXVpcmUsIHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVuYW1lLCBcInV0ZjhcIik7XHJcbiAgICAgICAgICAgIGNvbnRlbnQgPSBVdGlscy5zdHJpcEJPTShjb250ZW50KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gZnMuc3RhdFN5bmMoZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICBjb25zdCBtZXRhID0gc2VsZi5leHRyYWN0TWV0YShjb250ZW50KTtcclxuICAgICAgICAgICAgbWV0YS5maWxlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICBtZXRhLmFkZGVkID0gc3RhdHMuYXRpbWVNcztcclxuICAgICAgICAgICAgbWV0YS5tb2RpZmllZCA9IHN0YXRzLm10aW1lTXM7XHJcbiAgICAgICAgICAgIG1ldGEuc2l6ZSA9IHN0YXRzLnNpemU7XHJcbiAgICAgICAgICAgIGlmICghaXNQbHVnaW4pIHtcclxuICAgICAgICAgICAgICAgIG1ldGEuY3NzID0gY29udGVudDtcclxuICAgICAgICAgICAgICAgIGlmIChtZXRhLmZvcm1hdCA9PSBcImpzb25cIikgbWV0YS5jc3MgPSBtZXRhLmNzcy5zcGxpdChcIlxcblwiKS5zbGljZSgxKS5qb2luKFwiXFxuXCIpO1xyXG4gICAgICAgICAgICAgICAgY29udGVudCA9IGBtb2R1bGUuZXhwb3J0cyA9ICR7SlNPTi5zdHJpbmdpZnkobWV0YSl9O2A7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGlzUGx1Z2luKSB7XHJcbiAgICAgICAgICAgICAgICBtb2R1bGUuX2NvbXBpbGUoY29udGVudCwgbW9kdWxlLmZpbGVuYW1lKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpZEV4cG9ydCA9ICFVdGlscy5pc0VtcHR5KG1vZHVsZS5leHBvcnRzKTtcclxuICAgICAgICAgICAgICAgIGlmIChkaWRFeHBvcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZXRhLnR5cGUgPSBtb2R1bGUuZXhwb3J0cztcclxuICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IG1ldGE7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBVdGlscy53YXJuKFwiTW9kdWxlIE5vdCBFeHBvcnRlZFwiLCBgJHttZXRhLm5hbWV9LCBwbGVhc2Ugc3RhcnQgc2V0dGluZyBtb2R1bGUuZXhwb3J0c2ApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYFxcbm1vZHVsZS5leHBvcnRzID0gJHtKU09OLnN0cmluZ2lmeShtZXRhKX07XFxubW9kdWxlLmV4cG9ydHMudHlwZSA9ICR7bWV0YS5leHBvcnRzIHx8IG1ldGEubmFtZX07YDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBtb2R1bGUuX2NvbXBpbGUoY29udGVudCwgZmlsZW5hbWUpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgbWFrZVBsYWNlaG9sZGVyUGx1Z2luKGRhdGEpIHtcclxuICAgICAgICByZXR1cm4ge3BsdWdpbjoge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQ6ICgpID0+IHt9LFxyXG4gICAgICAgICAgICAgICAgZ2V0TmFtZTogKCkgPT4ge3JldHVybiBkYXRhLm5hbWUgfHwgZGF0YS5maWxlbmFtZTt9LFxyXG4gICAgICAgICAgICAgICAgZ2V0QXV0aG9yOiAoKSA9PiB7cmV0dXJuIFwiPz8/XCI7fSxcclxuICAgICAgICAgICAgICAgIGdldERlc2NyaXB0aW9uOiAoKSA9PiB7cmV0dXJuIGRhdGEubWVzc2FnZSA/IGRhdGEubWVzc2FnZSA6IFwiVGhpcyBwbHVnaW4gd2FzIHVuYWJsZSB0byBiZSBsb2FkZWQuIENoZWNrIHRoZSBhdXRob3IncyBwYWdlIGZvciB1cGRhdGVzLlwiO30sXHJcbiAgICAgICAgICAgICAgICBnZXRWZXJzaW9uOiAoKSA9PiB7cmV0dXJuIFwiPz8/XCI7fVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBuYW1lOiBkYXRhLm5hbWUgfHwgZGF0YS5maWxlbmFtZSxcclxuICAgICAgICAgICAgZmlsZW5hbWU6IGRhdGEuZmlsZW5hbWUsXHJcbiAgICAgICAgICAgIHNvdXJjZTogZGF0YS5zb3VyY2UgPyBkYXRhLnNvdXJjZSA6IFwiXCIsXHJcbiAgICAgICAgICAgIHdlYnNpdGU6IGRhdGEud2Vic2l0ZSA/IGRhdGEud2Vic2l0ZSA6IFwiXCJcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZihmaWxlbmFtZSkgPT09IFwidW5kZWZpbmVkXCIgfHwgdHlwZW9mKHR5cGUpID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGJhc2VGb2xkZXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xyXG5cclxuICAgICAgICBpZihzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNlwiXSl7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgICAgIHByb2Nlc3NGaWxlKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSksIChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQpXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpXHJcbiAgICAgICAgICAgICAgICB9LCAoaGFzaCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdXNwZWN0OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzaDogaGFzaCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGVuYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBmaWxlbmFtZVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9LCB0cnVlKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBpZihyZXN1bHQpe1xyXG4gICAgICAgICAgICAgICAgYWRkb25DYWNoZVtyZXN1bHQuaGFzaF0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxyXG4gICAgICAgICAgICAgICAgICAgIGhhc2g6IHJlc3VsdC5oYXNoLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDogcmVzdWx0XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVBZGRvbkNhY2hlKClcclxuICAgICAgICAgICAgICAgIGlmKHJlc3VsdC5zdXNwZWN0KXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBmaWxlbmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZW5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiVGhpcyBwbHVnaW4gbWlnaHQgYmUgZGFuZ2Vyb3VzIChcIityZXN1bHQuaGFybStcIikuXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoXCJUaGlzIHBsdWdpbiBtaWdodCBiZSBkYW5nZXJvdXMgKFwiK3Jlc3VsdC5oYXJtK1wiKS5cIilcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRyeSB7d2luZG93LnJlcXVpcmUocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSk7fVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge3JldHVybiB7bmFtZTogZmlsZW5hbWUsIGZpbGU6IGZpbGVuYW1lLCBtZXNzYWdlOiBcIkNvdWxkIG5vdCBiZSBjb21waWxlZC5cIiwgZXJyb3I6IHttZXNzYWdlOiBlcnJvci5tZXNzYWdlLCBzdGFjazogZXJyb3Iuc3RhY2t9fTt9XHJcbiAgICAgICAgY29uc3QgY29udGVudCA9IHdpbmRvdy5yZXF1aXJlKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpO1xyXG4gICAgICAgIGlmKCFjb250ZW50Lm5hbWUpcmV0dXJuIHtuYW1lOiBmaWxlbmFtZSwgZmlsZTogZmlsZW5hbWUsIG1lc3NhZ2U6IFwiQ2Fubm90IGVzY2FwZSB0aGUgSUQuXCIsIGVycm9yOiB7bWVzc2FnZTogXCJDYW5ub3QgcmVhZCBwcm9wZXJ0eSAncmVwbGFjZScgb2YgdW5kZWZpbmVkXCIsIHN0YWNrOiBcIkNhbm5vdCByZWFkIHByb3BlcnR5ICdyZXBsYWNlJyBvZiB1bmRlZmluZWRcIn19XHJcbiAgICAgICAgY29udGVudC5pZCA9IFV0aWxzLmVzY2FwZUlEKGNvbnRlbnQubmFtZSk7XHJcbiAgICAgICAgaWYgKGlzUGx1Z2luKSB7XHJcbiAgICAgICAgICAgIGlmICghY29udGVudC50eXBlKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50LnBsdWdpbiA9IG5ldyBjb250ZW50LnR5cGUoKTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBiZHBsdWdpbnNbY29udGVudC5wbHVnaW4uZ2V0TmFtZSgpXTtcclxuICAgICAgICAgICAgICAgIGJkcGx1Z2luc1tjb250ZW50LnBsdWdpbi5nZXROYW1lKCldID0gY29udGVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJDb3VsZCBub3QgYmUgY29uc3RydWN0ZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyb3IubWVzc2FnZSwgc3RhY2s6IGVycm9yLnN0YWNrfX07fVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZGVsZXRlIGJkdGhlbWVzW2NvbnRlbnQubmFtZV07XHJcbiAgICAgICAgICAgIGJkdGhlbWVzW2NvbnRlbnQubmFtZV0gPSBjb250ZW50O1xyXG4gICAgICAgIH1cclxuICAgIH0gICBcclxuXHJcbiAgICB1bmxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZihmaWxlbmFtZSkgPT09IFwidW5kZWZpbmVkXCIgfHwgdHlwZW9mKHR5cGUpID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGJhc2VGb2xkZXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB3aW5kb3cucmVxdWlyZS5jYWNoZVt3aW5kb3cucmVxdWlyZS5yZXNvbHZlKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikge3JldHVybiB7bmFtZTogZmlsZW5hbWUsIGZpbGU6IGZpbGVuYW1lLCBtZXNzYWdlOiBcIkNvdWxkIG5vdCBiZSB1bmxvYWRlZC5cIiwgZXJyb3I6IHttZXNzYWdlOiBlcnIubWVzc2FnZSwgc3RhY2s6IGVyci5zdGFja319O31cclxuICAgIH1cclxuXHJcbiAgICBpc0xvYWRlZChmaWxlbmFtZSwgdHlwZSkge1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICB0cnkge3dpbmRvdy5yZXF1aXJlLmNhY2hlW3dpbmRvdy5yZXF1aXJlLnJlc29sdmUocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSldO31cclxuICAgICAgICBjYXRjaCAoZXJyKSB7cmV0dXJuIGZhbHNlO31cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZWxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKSB7XHJcbiAgICAgICAgY29uc3QgY2FudFVubG9hZCA9IHRoaXMudW5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSk7XHJcbiAgICAgICAgaWYgKGNhbnRVbmxvYWQpIHJldHVybiBjYW50VW5sb2FkO1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkTmV3Q29udGVudCh0eXBlKSB7XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGZpbGVFbmRpbmcgPSBpc1BsdWdpbiA/IFwiLnBsdWdpbi5qc1wiIDogXCIudGhlbWUuY3NzXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZWRpciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhiYXNlZGlyKTtcclxuICAgICAgICBjb25zdCBjb250ZW50TGlzdCA9IE9iamVjdC52YWx1ZXMoaXNQbHVnaW4gPyBiZHBsdWdpbnMgOiBiZHRoZW1lcyk7XHJcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGNvbnRlbnRMaXN0LmZpbHRlcih0ID0+ICFmaWxlcy5pbmNsdWRlcyh0LmZpbGVuYW1lKSkubWFwKGMgPT4gaXNQbHVnaW4gPyBjLnBsdWdpbi5nZXROYW1lKCkgOiBjLm5hbWUpO1xyXG4gICAgICAgIGNvbnN0IGFkZGVkID0gZmlsZXMuZmlsdGVyKGYgPT4gIWNvbnRlbnRMaXN0LmZpbmQodCA9PiB0LmZpbGVuYW1lID09IGYpICYmIGYuZW5kc1dpdGgoZmlsZUVuZGluZykgJiYgZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VkaXIsIGYpKS5pc0ZpbGUoKSk7XHJcbiAgICAgICAgcmV0dXJuIHthZGRlZCwgcmVtb3ZlZH07XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZEFsbENvbnRlbnQodHlwZSkge1xyXG4gICAgICAgIHRoaXMucGF0Y2hFeHRlbnNpb25zKClcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgZmlsZUVuZGluZyA9IGlzUGx1Z2luID8gXCIucGx1Z2luLmpzXCIgOiBcIi50aGVtZS5jc3NcIjtcclxuICAgICAgICBjb25zdCBiYXNlZGlyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTtcclxuICAgICAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGJhc2VkaXIpO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZpbGVzKSB7XHJcbiAgICAgICAgICAgIGlmICghZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VkaXIsIGZpbGVuYW1lKSkuaXNGaWxlKCkgfHwgIWZpbGVuYW1lLmVuZHNXaXRoKGZpbGVFbmRpbmcpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCB0aGlzLmxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKTtcclxuICAgICAgICAgICAgaWYgKGVycm9yKSBlcnJvcnMucHVzaChlcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZXJyb3JzO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRQbHVnaW5zKCkge3JldHVybiB0aGlzLmxvYWRBbGxDb250ZW50KFwicGx1Z2luXCIpO31cclxuICAgIGxvYWRUaGVtZXMoKSB7cmV0dXJuIHRoaXMubG9hZEFsbENvbnRlbnQoXCJ0aGVtZVwiKTt9XHJcbn07XHJcblxyXG4vKipcclxuICogRG9uJ3QgZXhwb3NlIGNvbnRlbnRNYW5hZ2VyIC0gY291bGQgYmUgZGFuZ2Vyb3VzIGZvciBub3dcclxuICovIiwiaW1wb3J0IHtiZENvbmZpZywgbWluU3VwcG9ydGVkVmVyc2lvbiwgYmJkVmVyc2lvbiwgc2V0dGluZ3NDb29raWUsIGJkcGx1Z2luRXJyb3JzLCBiZHRoZW1lRXJyb3JzLCBiYmRDaGFuZ2Vsb2csIGRlZmF1bHRDb29raWUsIGN1cnJlbnREaXNjb3JkVmVyc2lvbiwgZGVmYXVsdFJQQywgc2V0dGluZ3NSUEN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9wbHVnaW5Nb2R1bGVcIjtcclxuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi93ZWJwYWNrTW9kdWxlc1wiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgQkRMb2dvIGZyb20gXCIuLi91aS9iZExvZ29cIjtcclxuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuLi91aS90b29sdGlwV3JhcFwiO1xyXG5pbXBvcnQgTGlnaHRjb3JkTG9nbyBmcm9tIFwiLi4vc3ZnL2xpZ2h0Y29yZFwiO1xyXG5pbXBvcnQgUGx1Z2luQ2VydGlmaWVyIGZyb20gXCIuL3BsdWdpbkNlcnRpZmllclwiO1xyXG5pbXBvcnQgZGlzdGFudCwgeyB1dWlkdjQgfSBmcm9tIFwiLi9kaXN0YW50XCI7XHJcbmltcG9ydCBFbW9qaU1vZHVsZSBmcm9tIFwiLi9lbW9qaU1vZHVsZVwiXHJcbmltcG9ydCB7cmVtb3RlIGFzIGVsZWN0cm9ufSBmcm9tIFwiZWxlY3Ryb25cIlxyXG5pbXBvcnQgdjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IHdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL3dlYnBhY2tNb2R1bGVzXCI7XHJcbmltcG9ydCBjb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5cclxuZnVuY3Rpb24gQ29yZSgpIHtcclxuICAgIC8vIE9iamVjdC5hc3NpZ24oYmRDb25maWcsIF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fKERhdGFTdG9yZS5jb25maWdGaWxlKSk7XHJcbiAgICAvLyB0aGlzLmluaXQoKTtcclxufVxyXG5cclxuQ29yZS5wcm90b3R5cGUuc2V0Q29uZmlnID0gZnVuY3Rpb24oY29uZmlnKSB7XHJcbiAgICBPYmplY3QuYXNzaWduKGJkQ29uZmlnLCBjb25maWcpO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUuaW5pdCA9IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKCFBcnJheS5wcm90b3R5cGUuZmxhdCkge1xyXG4gICAgICAgIFV0aWxzLmFsZXJ0KFwiTm90IFN1cHBvcnRlZFwiLCBcIkJldHRlckRpc2NvcmQgdlwiICsgYmJkVmVyc2lvbiArIFwiIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvbGQgdmVyc2lvbiAoXCIgKyBjdXJyZW50RGlzY29yZFZlcnNpb24gKyBcIikgb2YgRGlzY29yZC4gUGxlYXNlIHVwZGF0ZSB5b3VyIERpc2NvcmQgaW5zdGFsbGF0aW9uIGJlZm9yZSBwcm9jZWVkaW5nLlwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGJkQ29uZmlnLnZlcnNpb24gPCBtaW5TdXBwb3J0ZWRWZXJzaW9uKSB7XHJcbiAgICAgICAgVXRpbHMuYWxlcnQoXCJOb3QgU3VwcG9ydGVkXCIsIFwiQmV0dGVyRGlzY29yZCB2XCIgKyBiZENvbmZpZy52ZXJzaW9uICsgXCIgKHlvdXIgdmVyc2lvbilcIiArIFwiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGxhdGVzdCBqcyAoXCIgKyBiYmRWZXJzaW9uICsgXCIpLjxicj48YnI+IFBsZWFzZSBkb3dubG9hZCB0aGUgbGF0ZXN0IHZlcnNpb24gZnJvbSA8YSBocmVmPSdodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3JlbGVhc2VzL2xhdGVzdCcgdGFyZ2V0PSdfYmxhbmsnPkdpdEh1YjwvYT5cIik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh3aW5kb3cuRUQpIHtcclxuICAgICAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCYW5kYWdlZEJEIGRvZXMgbm90IHdvcmsgd2l0aCBFbmhhbmNlZERpc2NvcmQuIFBsZWFzZSB1bmluc3RhbGwgb25lIG9mIHRoZW0uXCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAod2luZG93LldlYlNvY2tldCAmJiB3aW5kb3cuV2ViU29ja2V0Lm5hbWUgJiYgd2luZG93LldlYlNvY2tldC5uYW1lLmluY2x1ZGVzKFwiUGF0Y2hlZFwiKSkge1xyXG4gICAgICAgIFV0aWxzLmFsZXJ0KFwiTm90IFN1cHBvcnRlZFwiLCBcIkJhbmRhZ2VkQkQgZG9lcyBub3Qgd29yayB3aXRoIFBvd2VyY29yZC4gUGxlYXNlIHVuaW5zdGFsbCBvbmUgb2YgdGhlbS5cIik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hBdHRyaWJ1dGVzLmJpbmQodGhpcyksIFwiTEMgUGx1Z2luIENlcnRpZmllciBQYXRjaFwiKSgpO1xyXG5cclxuICAgIC8qXHJcbiAgICBjb25zdCBsYXRlc3RMb2NhbFZlcnNpb24gPSBiZENvbmZpZy51cGRhdGVyID8gYmRDb25maWcudXBkYXRlci5MYXRlc3RWZXJzaW9uIDogYmRDb25maWcubGF0ZXN0VmVyc2lvbjtcclxuICAgIGlmIChsYXRlc3RMb2NhbFZlcnNpb24gPiBiZENvbmZpZy52ZXJzaW9uKSB7XHJcbiAgICAgICAgVXRpbHMuc2hvd0NvbmZpcm1hdGlvbk1vZGFsKFwiVXBkYXRlIEF2YWlsYWJsZVwiLCBbYFRoZXJlIGlzIGFuIHVwZGF0ZSBhdmFpbGFibGUgZm9yIEJhbmRhZ2VkQkQncyBJbmplY3RvciAoJHtsYXRlc3RMb2NhbFZlcnNpb259KS5gLCBcIllvdSBjYW4gZWl0aGVyIHVwZGF0ZSBhbmQgcmVzdGFydCBub3csIG9yIGxhdGVyLlwiXSwge1xyXG4gICAgICAgICAgICBjb25maXJtVGV4dDogXCJVcGRhdGUgTm93XCIsXHJcbiAgICAgICAgICAgIGNhbmNlbFRleHQ6IFwiTWF5YmUgTGF0ZXJcIixcclxuICAgICAgICAgICAgb25Db25maXJtOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvblVwZGF0ZUZhaWxlZCA9ICgpID0+IHtVdGlscy5hbGVydChcIkNvdWxkIE5vdCBVcGRhdGVcIiwgYFVuYWJsZSB0byB1cGRhdGUgYXV0b21hdGljYWxseSwgcGxlYXNlIGRvd25sb2FkIHRoZSBpbnN0YWxsZXIgYW5kIHJlaW5zdGFsbCBub3JtYWxseS48YnIgLz48YnIgLz48YSBocmVmPSdodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3JlbGVhc2VzL2xhdGVzdCcgdGFyZ2V0PSdfYmxhbmsnPkRvd25sb2FkIEluc3RhbGxlcjwvYT5gKTt9O1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWRVcGRhdGUgPSBhd2FpdCB0aGlzLnVwZGF0ZUluamVjdG9yKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkaWRVcGRhdGUpIHJldHVybiBvblVwZGF0ZUZhaWxlZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFwcCA9IHJlcXVpcmUoXCJlbGVjdHJvblwiKS5yZW1vdGUuYXBwO1xyXG4gICAgICAgICAgICAgICAgICAgIGFwcC5yZWxhdW5jaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFwcC5leGl0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb25VcGRhdGVGYWlsZWQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSovXHJcblxyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkluaXRpYWxpemluZyBTZXR0aW5nc1wiKTtcclxuICAgIHRoaXMuaW5pdFNldHRpbmdzKCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5jaGVja0Zvckd1aWxkcygpO1xyXG4gICAgQkRWMi5pbml0aWFsaXplKCk7XHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiVXBkYXRpbmcgU2V0dGluZ3NcIik7XHJcbiAgICBzZXR0aW5nc1BhbmVsLmluaXRpYWxpemVTZXR0aW5ncygpO1xyXG5cclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJMb2FkaW5nIEFkZG9ucyBDYWNoZVwiKVxyXG4gICAgYXdhaXQgY29udGVudE1hbmFnZXIubG9hZEFkZG9uQ2VydGlmaWVyQ2FjaGUoKVxyXG5cclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJMb2FkaW5nIFBsdWdpbnNcIik7XHJcbiAgICBhd2FpdCBwbHVnaW5Nb2R1bGUubG9hZFBsdWdpbnMoKTtcclxuXHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiTG9hZGluZyBUaGVtZXNcIik7XHJcbiAgICBhd2FpdCB0aGVtZU1vZHVsZS5sb2FkVGhlbWVzKCk7XHJcblxyXG4gICAgRE9NLmFkZFN0eWxlKFwiY3VzdG9tY3NzXCIsIGF0b2IoRGF0YVN0b3JlLmdldEJERGF0YShcImJkY3VzdG9tY3NzXCIpKSk7XHJcblxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWRjLTBcIl0pIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYnRuLmJ0bi1kaXNjb25uZWN0XCIpLmNsaWNrKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBQbHVnaW5DZXJ0aWZpZXIuc3RhcnQoKVxyXG5cclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJSZW1vdmluZyBMb2FkaW5nIEljb25cIik7XHJcbiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImJkLWxvYWRlcnYyXCIpLmxlbmd0aCkgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImJkLWxvYWRlcnYyXCIpWzBdLnJlbW92ZSgpO1xyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkluaXRpYWxpemluZyBNYWluIE9ic2VydmVyXCIpO1xyXG4gICAgdGhpcy5pbml0T2JzZXJ2ZXIoKTtcclxuXHJcbiAgICAvLyBTaG93IGxvYWRpbmcgZXJyb3JzXHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIHtcclxuICAgICAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiQ29sbGVjdGluZyBTdGFydHVwIEVycm9yc1wiKTtcclxuICAgICAgICBVdGlscy5zaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogYmRwbHVnaW5FcnJvcnMsIHRoZW1lczogYmR0aGVtZUVycm9yc30pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHByZXZpb3VzVmVyc2lvbiA9IERhdGFTdG9yZS5nZXRCRERhdGEoXCJ2ZXJzaW9uXCIpO1xyXG4gICAgaWYgKGJiZFZlcnNpb24gPiBwcmV2aW91c1ZlcnNpb24pIHtcclxuICAgICAgICBpZiAoYmJkQ2hhbmdlbG9nKSB0aGlzLnNob3dDaGFuZ2Vsb2dNb2RhbChiYmRDaGFuZ2Vsb2cpO1xyXG4gICAgICAgIERhdGFTdG9yZS5zZXRCRERhdGEoXCJ2ZXJzaW9uXCIsIGJiZFZlcnNpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIEVtb2ppTW9kdWxlLnN0YXJ0KClcclxuXHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoU29jaWFsLmJpbmQodGhpcyksIFwiQkQgU29jaWFsIFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoR3VpbGRQaWxscy5iaW5kKHRoaXMpLCBcIkJEIEd1aWxkIFBpbGxzIFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoR3VpbGRMaXN0SXRlbXMuYmluZCh0aGlzKSwgXCJCRCBHdWlsZCBMaXN0IEl0ZW1zIFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoR3VpbGRTZXBhcmF0b3IuYmluZCh0aGlzKSwgXCJCRCBHdWlsZCBTZXBhcmF0b3IgUGF0Y2hcIikoKTtcclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hNZXNzYWdlSGVhZGVyLmJpbmQodGhpcyksIFwiQkQgQmFkZ2UgQ2hhdCBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaE1lbWJlckxpc3QuYmluZCh0aGlzKSwgXCJCRCBCYWRnZSBNZW1iZXIgTGlzdCBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEF0dGFjaG1lbnQuYmluZCh0aGlzKSwgXCJMQyBQbHVnaW4gQ2VydGlmaWVyIFBhdGNoXCIpKCk7XHJcblxyXG4gICAgaWYoYmRDb25maWcuaGF2ZUluc3RhbGxlZERlZmF1bHQpe1xyXG4gICAgICAgIGxldCBhbGVydCA9IFV0aWxzLmFsZXJ0KFwiRmlyc3QgSW5zdGFsbGF0aW9uXCIsIFwiQXMgaXQgaXMgdGhlIGZpcnN0IHRpbWUgeW91IGluc3RhbGwgTGlnaHRjb3JkLCBXZSBhZGRlZCB0d28gZGVmYXVsdCB0aGVtZXMgYW5kIG9uZSBkZWZhdWx0IHBsdWdpbiBpbiB5b3VyIHBsdWdpbi90aGVtZSBmb2xkZXIuIENoZWNrIGl0IGluIHRoZSBQbHVnaW4vVGhlbWUgc2V0dGluZ3MuXCIpXHJcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgYWxlcnQub25DbG9zZShyZXNvbHZlKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBjb25zdCBsb2dvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhcHAtbW91bnQgPiBkaXYudHlwZVdpbmRvd3MtMXphLW43LndpdGhGcmFtZS1oYVlsdEkudGl0bGVCYXItQUM0cEdWLmhvcml6b250YWxSZXZlcnNlLTN0UmpZNy5mbGV4LTFPMUdLWS5kaXJlY3Rpb25Sb3dSZXZlcnNlLW04SWpJcS5qdXN0aWZ5U3RhcnQtMk5ERnppLmFsaWduU3RyZXRjaC1EcEdQZjMuZGEtdHlwZVdpbmRvd3MuZGEtd2l0aEZyYW1lLmRhLXRpdGxlQmFyLmRhLWhvcml6b250YWxSZXZlcnNlLmRhLWZsZXguZGEtZGlyZWN0aW9uUm93UmV2ZXJzZS5kYS1qdXN0aWZ5U3RhcnQuZGEtYWxpZ25TdHJldGNoID4gZGl2LndvcmRtYXJrV2luZG93cy0xdjBsWUQud29yZG1hcmstMmlERGZtLmRhLXdvcmRtYXJrV2luZG93cy5kYS13b3JkbWFya1wiKVxyXG4gICAgaWYobG9nbyl7XHJcbiAgICAgICAgbG9nby5zdHlsZS50b3AgPSBcIjNweFwiXHJcbiAgICAgICAgbG9nby5pbm5lckhUTUwgPSBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMTBcIiB3aWR0aD1cIjcwXCIgdmlld0JveD1cIjAgMCA3Mi41NCAxMFwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IC01cHgsIG1hcmdpbi10b3A6IDEwcHhcIj5cclxuICAgIDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTQ0LjgxLDkuNjdWNi4zM2MwLTEuMjEsMi4xMy0xLjQ5LDIuNzgtLjI4bDItLjgxQTMuNTMsMy41MywwLDAsMCw0Ni4yLDNjLTEuOTIsMC0zLjgxLDEuMTMtMy44MSwzLjMzVjkuNjdjMCwyLjIxLDEuODksMy4zMywzLjc3LDMuMzNhMy44NywzLjg3LDAsMCwwLDMuNDUtMi4xOGwtMi4xMi0xQzQ3LDExLjE3LDQ0LjgxLDEwLjg1LDQ0LjgxLDkuNjdaTTEwLjY4LDEyLjg5aDIuNDFWMy4xN0gxMC42OFpNNzEuNzYsMy4xNEg2OC4xOVY3LjIzTDcwLjU3LDkuNHYtNGgxLjI3Yy44MSwwLDEuMjEuNDEsMS4yMSwxdjNjMCwuNjMtLjM4LDEuMDUtMS4yMSwxLjA1SDY4LjE4djIuMzFoMy41N2MxLjkyLDAsMy43Mi0xLDMuNzItMy4yVjYuMzlDNzUuNDgsNC4xMyw3My42OCwzLjE0LDcxLjc2LDMuMTRaTTU0LjIyLDNjLTIsMC00LDEuMS00LDMuMzRWOS42NmMwLDIuMjMsMiwzLjM0LDQsMy4zNHMzLjk1LTEuMTEsMy45NS0zLjM0VjYuMzRDNTguMTksNC4xMSw1Ni4yLDMsNTQuMjIsM1ptMS41NSw2LjY2YzAsLjctLjc4LDEuMDYtMS41NCwxLjA2cy0xLjU1LS4zNS0xLjU1LTEuMDZWNi4zNGMwLS43Mi43NS0xLjEsMS41LTEuMXMxLjU5LjM1LDEuNTksMS4xWk02Ni44NCw2LjM0YzAtMi4yOS0xLjU4LTMuMi0zLjU1LTMuMkg1OS40NnY5LjczaDIuNDVWOS43N2guNDNsMi4yMiwzLjA5aDNMNjUsOS41MkM2Ni4xMyw5LjE1LDY2Ljg0LDguMTQsNjYuODQsNi4zNFpNNjMuMzMsNy42NUg2MS45MVY1LjQzaDEuNDJBMS4xMSwxLjExLDAsMSwxLDYzLjMzLDcuNjVaTTI5LjgzLDEzaDIuNDJWMy4wNkgyOS44M1Y2LjczbC0zLDBWMy4wOUgyNC43djkuNzhoMi4xNFY4LjY4bDMsMFpNMTcuMTYsOS43NlY2LjQyYzAtMS4yMSwyLjEzLTEuNDksMi43OC0uMjhsMi0uODFhMy41NSwzLjU1LDAsMCwwLTMuMzYtMi4yNGMtMS45MiwwLTMuODEsMS4xMy0zLjgxLDMuMzNWOS43NmMwLDIuMjEsMiwzLjE1LDMuOSwzLjE1czMuNTgtMSwzLjU4LTNWNy41OEgxOC43OWwwLDEuMzZIMjAuM3YuNzdDMjAuMywxMC45MiwxNy4xNiwxMC45NCwxNy4xNiw5Ljc2WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtMi45MyAtMylcIi8+XHJcbiAgICA8cG9seWdvbiBmaWxsPVwiY3VycmVudENvbG9yXCIgcG9pbnRzPVwiMzUuOTEgMC4wNiAzOC40MyAwLjA2IDM4LjQzIDEuODQgMzUuOTIgMS44MSAzNS45NyAxMCAzMy41NSAxMCAzMy40OSAxLjc1IDMwLjk4IDEuNzQgMzAuOTggMC4wNiAzMy40OSAwLjA2IDM1LjkxIDAuMDZcIi8+XHJcbiAgICA8cG9seWdvbiBmaWxsPVwiY3VycmVudENvbG9yXCIgcG9pbnRzPVwiMCA5Ljk3IDYuNSAxMCA2LjUgNy42MyAyLjQxIDcuNjMgMi40MSAwLjI2IDAgMi4yNiAwIDkuOTdcIi8+XHJcbjwvc3ZnPmBcclxuICAgIH1cclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoQXR0cmlidXRlcyA9IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgbGV0IGF0dHJpYnNQYXRjaHMgPSBbXVxyXG4gICAgdGhpcy5jYW5jZWxQYXRjaEF0dHJpYnV0ZXMgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBhdHRyaWJzUGF0Y2hzLmZvckVhY2goZSA9PiBlKCkpXHJcbiAgICB9XHJcblxyXG4gICAgd2hpbGUoIXYyLk1lc3NhZ2VDb21wb25lbnQpYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMCkpXHJcbiAgICBcclxuICAgIC8vIFRPRE86IHRyeSB0byBwYXRjaCBjb3JyZWN0bHkgdGhlIHVzZXIgcG9wb3V0IG9uIGEgbmV4dCB1cGRhdGVcclxuICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG4gICAgZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIkRpc2NvcmRUYWdcIilcclxuICAgIC50aGVuKERpc2NvcmRUYWcgPT4ge1xyXG4gICAgICAgIGxldCBEaXNjb3JkVGFnQ29tcCA9IERpc2NvcmRUYWcuZGVmYXVsdFxyXG4gICAgICAgIERpc2NvcmRUYWcuZGVmYXVsdCA9IGZ1bmN0aW9uKHByb3BzKXtcclxuICAgICAgICAgICAgbGV0IHJldHVyblZhbHVlID0gRGlzY29yZFRhZ0NvbXAocHJvcHMpXHJcblxyXG4gICAgICAgICAgICBsZXQgaWQgPSB1dWlkdjQoKVxyXG5cclxuICAgICAgICAgICAgbGV0IGJhZGdlRGl2ID0gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJpbmxpbmVcIixcclxuICAgICAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6IFwiNXB4XCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XHJcbiAgICAgICAgICAgICAgICBpZDogXCJiYWRnZXMtXCIraWQsXHJcbiAgICAgICAgICAgICAgICBrZXk6IFwiYmFkZ2VzLVwiK2lkLFxyXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImluaGVyaXRcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSlcclxuXHJcbiAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IFtyZXR1cm5WYWx1ZV1cclxuXHJcbiAgICAgICAgICAgIGlmIChwcm9wcy51c2VyLmlkID09PSBcIjI0OTc0NjIzNjAwODE2OTQ3M1wiKSB7IC8vIFJhdWVuemk6IEJhbmRhZ2VkQkQgRGV2ZWxvcGVyXHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiQmFuZGFnZWRCRCBEZXZlbG9wZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtY2hhdC1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIiwgdGl0bGU6IFwiQmFuZGFnZWRCRFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcHMudXNlci5pZCA9PT0gXCI2OTY0ODExOTQ0NDMwMTQxNzRcIiB8fCBwcm9wcy51c2VyLmlkID09PSBcIjY5NjAwMzQ1NjYxMTM4NTM5NlwiKXsgLy8gTm90IFRob21pejogTGlnaHRjb3JkIERldmVsb3BlciwgUGhvcmN5czogTGlnaHRjb3JkIERldmVsb3BlclxyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkxpZ2h0Y29yZCBEZXZlbG9wZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtY2hhdC1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9MaWdodGNvcmQvTGlnaHRjb3JkXCIsIHRpdGxlOiBcIkxpZ2h0Y29yZFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGJhZGdlRGl2KVxyXG4gICAgICAgICAgICBsZXQgZGl2ID0gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJibG9ja1wiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIGNoaWxkcmVuKVxyXG4gICAgICAgICAgICBhcHBseUJhZGdlcyhpZCwgcHJvcHMudXNlciwgZmFsc2UpXHJcblxyXG4gICAgICAgICAgICByZXR1cm4gZGl2XHJcbiAgICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICBhdHRyaWJzUGF0Y2hzLnB1c2goVXRpbHMubW9ua2V5UGF0Y2godjIuTWVzc2FnZUNvbXBvbmVudCwgXCJkZWZhdWx0XCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBpZihkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLm1lc3NhZ2UpeyAvLyB0aGlzIGNhbiBiZSBhIGJsb2NrZWQgbWVzc2FnZSAobm90IG9wZW5lZClcclxuICAgICAgICAgICAgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wc1tcImRhdGEtbWVzc2FnZS1pZFwiXSA9IGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMubWVzc2FnZS5pZFxyXG4gICAgICAgIH1cclxuICAgIH19KSlcclxuICAgICAgICAvKlxyXG4gICAgYXR0cmlic1BhdGNocy5wdXNoKFV0aWxzLm1vbmtleVBhdGNoKHYyLk1lc3NhZ2VDb21wb25lbnQsIFwiZGVmYXVsdFwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wc1tcIm1lc3NhZ2UtaWRcIl0gPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLm1lc3NhZ2UuaWRcclxuICAgIH19KSkqL1xyXG59XHJcblxyXG5Db3JlLnByb3RvdHlwZS5jaGVja0Zvckd1aWxkcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgbGV0IHRpbWVzQ2hlY2tlZCA9IDA7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgY29uc3QgY2hlY2tGb3JHdWlsZHMgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgY29uc3Qgd3JhcHBlciA9IEJEVjIuZ3VpbGRDbGFzc2VzLndyYXBwZXIuc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgLiR7d3JhcHBlcn1gKS5sZW5ndGggPiAwKSB0aW1lc0NoZWNrZWQrKztcclxuICAgICAgICAgICAgY29uc3QgZ3VpbGQgPSBCRFYyLmd1aWxkQ2xhc3Nlcy5saXN0SXRlbS5zcGxpdChcIiBcIilbMF07XHJcbiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBCRFYyLmd1aWxkQ2xhc3Nlcy5ibG9iQ29udGFpbmVyLnNwbGl0KFwiIFwiKVswXTtcclxuICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke3dyYXBwZXJ9IC4ke2d1aWxkfSAuJHtibG9ifWApLmxlbmd0aCA+IDApIHJldHVybiByZXNvbHZlKGJkQ29uZmlnLmRlZmVyTG9hZGVkID0gdHJ1ZSk7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRpbWVzQ2hlY2tlZCA+PSA1MCkgcmV0dXJuIHJlc29sdmUoYmRDb25maWcuZGVmZXJMb2FkZWQgPSB0cnVlKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dChjaGVja0Zvckd1aWxkcywgMTAwKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlICE9IFwibG9hZGluZ1wiKSBzZXRUaW1lb3V0KGNoZWNrRm9yR3VpbGRzLCAxMDApO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsICgpID0+IHtzZXRUaW1lb3V0KGNoZWNrRm9yR3VpbGRzLCAxMDApO30pO1xyXG4gICAgfSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5pbmplY3RFeHRlcm5hbHMgPSBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgIGF3YWl0IERPTS5hZGRTY3JpcHQoXCJhY2Utc2NyaXB0XCIsIFwiaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvYWNlLzEuMi45L2FjZS5qc1wiKTtcclxuICAgIGlmICh3aW5kb3cucmVxdWlyZS5vcmlnaW5hbCkgd2luZG93LnJlcXVpcmUgPSB3aW5kb3cucmVxdWlyZS5vcmlnaW5hbDtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLmluaXRTZXR0aW5ncyA9IGZ1bmN0aW9uICgpIHtcclxuICAgIERhdGFTdG9yZS5pbml0aWFsaXplKCk7XHJcbiAgICBpZighRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIpICYmICFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKXtcclxuICAgICAgICBpZiAoIURhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJzZXR0aW5nc1wiKSkge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzQ29va2llLCBkZWZhdWx0Q29va2llKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3NSUEMsIGRlZmF1bHRSUEMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXR0aW5nc1BhbmVsLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBzZXR0aW5nc1BhbmVsLmxvYWRTZXR0aW5ncygpO1xyXG4gICAgICAgIGZvciAoY29uc3Qgc2V0dGluZyBpbiBkZWZhdWx0Q29va2llKSB7XHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtzZXR0aW5nXSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzQ29va2llW3NldHRpbmddID0gZGVmYXVsdENvb2tpZVtzZXR0aW5nXTtcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzUGFuZWwuc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQucHJvdG90eXBlICYmIGUuZGVmYXVsdC5wcm90b3R5cGUuZ2V0UHJlZGljYXRlU2VjdGlvbnMpXHJcbiAgICAudGhlbihzZXR0aW5nTW9kdWxlID0+IHtcclxuXHJcbiAgICAgICAgbGV0IGdldFByZWRpY2F0ZVNlY3Rpb25zID0gc2V0dGluZ01vZHVsZS5kZWZhdWx0LnByb3RvdHlwZS5nZXRQcmVkaWNhdGVTZWN0aW9uc1xyXG4gICAgICAgIHNldHRpbmdNb2R1bGUuZGVmYXVsdC5wcm90b3R5cGUuZ2V0UHJlZGljYXRlU2VjdGlvbnMgPSBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gZ2V0UHJlZGljYXRlU2VjdGlvbnMuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXHJcblxyXG4gICAgICAgICAgICBpZihyZXN1bHRbMV0uc2VjdGlvbiA9PT0gXCJNeSBBY2NvdW50XCIpeyAvLyB1c2VyIHNldHRpbmdzLCBub3QgZ3VpbGQgc2V0dGluZ3NcclxuICAgICAgICAgICAgICAgIGxldCBwb3BlZCA9IFtdXHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHBvcGVkLnB1c2gocmVzdWx0LnBvcCgpKVxyXG4gICAgICAgICAgICAgICAgcG9wZWQucHVzaChyZXN1bHQucG9wKCkpXHJcbiAgICAgICAgICAgICAgICBwb3BlZC5wdXNoKHJlc3VsdC5wb3AoKSlcclxuICAgICAgICAgICAgICAgIHBvcGVkLnB1c2gocmVzdWx0LnBvcCgpKVxyXG5cclxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLnNldHRpbmdzUGFuZWwucmVuZGVyU2lkZWJhcih0aGlzKSlcclxuXHJcbiAgICAgICAgICAgICAgICB3aGlsZShwb3BlZFswXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocG9wZWQucG9wKCkpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxyXG4gICAgICAgIH1cclxuICAgIH0pXHJcbn07XHJcblxyXG5cclxubGV0IGNsYXNzTmFtZUxheWVyXHJcbmxldCBjbGFzc05hbWVTb2NpYWxMaW5rc1xyXG5sZXQgY2xhc3NOYW1lTW9kYWxcclxuXHJcbkNvcmUucHJvdG90eXBlLmluaXRPYnNlcnZlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGNvbnN0IG1haW5PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbWxlbiA9IG11dGF0aW9ucy5sZW5ndGg7IGkgPCBtbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgbXV0YXRpb24gPSBtdXRhdGlvbnNbaV07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGx1Z2luTW9kdWxlICE9PSBcInVuZGVmaW5lZFwiKSBwbHVnaW5Nb2R1bGUucmF3T2JzZXJ2ZXIobXV0YXRpb24pO1xyXG5cclxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgd2FzIG5vdGhpbmcgYWRkZWQsIHNraXBcclxuICAgICAgICAgICAgaWYgKCFtdXRhdGlvbi5hZGRlZE5vZGVzLmxlbmd0aCB8fCAhKG11dGF0aW9uLmFkZGVkTm9kZXNbMF0gaW5zdGFuY2VvZiBFbGVtZW50KSkgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBub2RlID0gbXV0YXRpb24uYWRkZWROb2Rlc1swXTtcclxuXHJcbiAgICAgICAgICAgIGlmKCFjbGFzc05hbWVMYXllciljbGFzc05hbWVMYXllciA9IEJETW9kdWxlcy5nZXQoKGUpID0+IGUubGF5ZXIgJiYgdHlwZW9mIGUubGF5ZXIgPT09IFwic3RyaW5nXCIgJiYgZS5hbmltYXRpbmcpWzBdLmxheWVyXHJcbiAgICAgICAgICAgIGlmKCFjbGFzc05hbWVTb2NpYWxMaW5rcyljbGFzc05hbWVTb2NpYWxMaW5rcyA9IEJETW9kdWxlcy5nZXQoKGUpID0+IGUuc29jaWFsTGlua3MgJiYgdHlwZW9mIGUuc29jaWFsTGlua3MgPT09IFwic3RyaW5nXCIpWzBdLnNvY2lhbExpbmtzXHJcbiAgICAgICAgICAgIGlmKCFjbGFzc05hbWVNb2RhbCljbGFzc05hbWVNb2RhbCA9IEJETW9kdWxlcy5nZXQoKGUpID0+IGUubW9kYWwgJiYgdHlwZW9mIGUubW9kYWwgPT09IFwic3RyaW5nXCIgJiYgZS5pbm5lciAmJiB0eXBlb2YgZS5pbm5lciA9PT0gXCJzdHJpbmdcIiAmJiAhZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUpWzBdLm1vZGFsXHJcblxyXG4gICAgICAgICAgICBpZiAobm9kZS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lTGF5ZXIpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpID09PSBcIkdVSUxEX1NFVFRJTkdTXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwibGF5ZXItaWRcIiwgXCJzZXJ2ZXItc2V0dGluZ3NcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBcInNlcnZlci1zZXR0aW5nc1wiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzTmFtZVNvY2lhbExpbmtzKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImxheWVyLWlkXCIsIFwidXNlci1zZXR0aW5nc1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImlkXCIsIFwidXNlci1zZXR0aW5nc1wiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50RWxlbWVudCA9PSBkb2N1bWVudC5ib2R5ICYmIG5vZGUucXVlcnlTZWxlY3RvcihcIiNhY2Vfc2V0dGluZ3NtZW51XCIpKSBub2RlLmlkID0gXCJhY2Vfc2V0dGluZ3NtZW51X2NvbnRhaW5lclwiO1xyXG5cclxuICAgICAgICAgICAgLy8gRW1vamkgUGlja2VyXHJcbiAgICAgICAgICAgIC8vbm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiZW1vamlQaWNrZXItM20xUy1qXCIpLmxlbmd0aCAmJiAhbm9kZS5xdWVyeVNlbGVjdG9yKFwiLmVtb2ppUGlja2VyLTNtMVMtalwiKS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImFuaW1hdG9yTGVmdC0xRVF4VTBcIilcclxuICAgICAgICAgICAgLy9pZiAobm9kZS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lTGF5ZXIyKSAmJiBub2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lRW1vamlQaWNrZXIpLmxlbmd0aCAgJiYgIW5vZGUucXVlcnlTZWxlY3RvcihcIi5cIitjbGFzc05hbWVFbW9qaVBpY2tlcikucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lQW5pbWF0b3JMZWZ0KSkgcXVpY2tFbW90ZU1lbnUub2JzQ2FsbGJhY2sobm9kZSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIG1haW5PYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LCB7XHJcbiAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxyXG4gICAgICAgIHN1YnRyZWU6IHRydWVcclxuICAgIH0pO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUuc2hvd0NoYW5nZWxvZ01vZGFsID0gZnVuY3Rpb24ob3B0aW9ucyA9IHt9KSB7XHJcbiAgICByZXR1cm4gVXRpbHMuc2hvd0NoYW5nZWxvZ01vZGFsKG9wdGlvbnMpO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUuYWxlcnQgPSBmdW5jdGlvbih0aXRsZSwgY29udGVudCkge1xyXG4gICAgcmV0dXJuIFV0aWxzLmFsZXJ0KHRpdGxlLCBjb250ZW50KTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoU29jaWFsID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5zb2NpYWxQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgVGFiQmFyID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJUYWJCYXJcIik7XHJcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgIGlmICghVGFiQmFyKSByZXR1cm47XHJcbiAgICB0aGlzLnNvY2lhbFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goVGFiQmFyLnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jaGlsZHJlbjtcclxuICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICFjaGlsZHJlbi5sZW5ndGggfHwgY2hpbGRyZW4ubGVuZ3RoIDwgMykgcmV0dXJuO1xyXG4gICAgICAgIGlmIChjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAzXS50eXBlLmRpc3BsYXlOYW1lICE9PSBcIlNlcGFyYXRvclwiKSByZXR1cm47XHJcbiAgICAgICAgaWYgKCFjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAyXS50eXBlLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJzb2NpYWxMaW5rc1wiKSkgcmV0dXJuO1xyXG4gICAgICAgIGlmIChBbmNob3IpIHtcclxuICAgICAgICAgICAgbGV0IHNvY2lhbE1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zb2NpYWxMaW5rcylbMF1cclxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWwgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAyXS50eXBlO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdPbmUgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJldHVyblZhbCA9IG9yaWdpbmFsKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1zb2NpYWwtbGluayBcIitzb2NpYWxNb2R1bGUxLmxpbmssIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL0xpZ2h0Y29yZC9MaWdodGNvcmRcIiwgdGl0bGU6IFwiTGlnaHRjb3JkXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkTG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtc29jaWFsLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuVmFsLnByb3BzLmNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJCYW5kYWdlZEJEXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLXNvY2lhbC1saW5rIFwiK3NvY2lhbE1vZHVsZTEubGluaywgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwXCIsIHRpdGxlOiBcIkJhbmRhZ2VkQkRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChCRExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLXNvY2lhbC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWw7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDJdLnR5cGUgPSBuZXdPbmU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBjbGFzc05hbWVDb2xvck11dGVkLFxyXG4gICAgICAgICAgICBzaXplcyxcclxuICAgICAgICAgICAgY2xhc3NOYW1lVmVyc2lvbkhhc2hcclxuICAgICAgICBdID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvck11dGVkKVswXS5jb2xvck11dGVkLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS52ZXJzaW9uSGFzaClbMF0udmVyc2lvbkhhc2hcclxuICAgICAgICBdXHJcblxyXG4gICAgICAgIGNvbnN0IHZlcnNpb25IYXNoID0gYCgke2JkQ29uZmlnLmhhc2ggPyBiZENvbmZpZy5oYXNoLnN1YnN0cmluZygwLCA3KSA6IGJkQ29uZmlnLmJyYW5jaH0pYDtcclxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsID0gW1xyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogYCR7Y2xhc3NOYW1lQ29sb3JNdXRlZH0gJHtzaXplcy5zaXplMTJ9YH0sIGBMaWdodGNvcmQgJHtlbGVjdHJvbi5nZXRHbG9iYWwoXCJCdWlsZEluZm9cIikudmVyc2lvbn0gYCwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBjbGFzc05hbWVWZXJzaW9uSGFzaCtcIiBkYS12ZXJzaW9uSGFzaFwifSwgYCgkeyhlbGVjdHJvbi5nZXRHbG9iYWwoXCJCdWlsZEluZm9cIikuY29tbWl0IHx8IFwiVW5rbm93blwiKS5zbGljZSgwLCA3KX0pYCkpLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogYCR7Y2xhc3NOYW1lQ29sb3JNdXRlZH0gJHtzaXplcy5zaXplMTJ9YH0sIGBCQkQgJHtiYmRWZXJzaW9ufSBgLCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IGNsYXNzTmFtZVZlcnNpb25IYXNoK1wiIGRhLXZlcnNpb25IYXNoXCJ9LCB2ZXJzaW9uSGFzaCkpXHJcbiAgICAgICAgXVxyXG4gICAgICAgIFxyXG5cclxuICAgICAgICBjb25zdCBvcmlnaW5hbFZlcnNpb25zID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udHlwZTtcclxuICAgICAgICBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXS50eXBlID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJldHVyblZhbCA9IG9yaWdpbmFsVmVyc2lvbnMoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgcmV0dXJuVmFsLnByb3BzLmNoaWxkcmVuLnNwbGljZSgxLCAwLCBhZGRpdGlvbmFsKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbDtcclxuICAgICAgICB9O1xyXG4gICAgfX0pO1xyXG59O1xyXG5cclxuY29uc3QgZ2V0R3VpbGRDbGFzc2VzID0gZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCBndWlsZHNXcmFwcGVyID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJ3cmFwcGVyXCIsIFwidW5yZWFkTWVudGlvbnNCYXJcIik7XHJcbiAgICBjb25zdCBndWlsZHMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImd1aWxkc0Vycm9yXCIsIFwic2VsZWN0ZWRcIik7XHJcbiAgICBjb25zdCBwaWxsID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJibG9iQ29udGFpbmVyXCIpO1xyXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGd1aWxkc1dyYXBwZXIsIGd1aWxkcywgcGlsbCk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaEd1aWxkTGlzdEl0ZW1zID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5ndWlsZExpc3RJdGVtc1BhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBHdWlsZENsYXNzZXMgPSBnZXRHdWlsZENsYXNzZXMoKTtcclxuICAgIGNvbnN0IGxpc3RJdGVtQ2xhc3MgPSBHdWlsZENsYXNzZXMubGlzdEl0ZW0uc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgY29uc3QgYmxvYkNsYXNzID0gR3VpbGRDbGFzc2VzLmJsb2JDb250YWluZXIuc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgY29uc3QgcmVhY3RJbnN0YW5jZSA9IEJEVjIuZ2V0SW50ZXJuYWxJbnN0YW5jZShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtsaXN0SXRlbUNsYXNzfSAuJHtibG9iQ2xhc3N9YCkucGFyZW50RWxlbWVudCk7XHJcbiAgICBjb25zdCBHdWlsZENvbXBvbmVudCA9IHJlYWN0SW5zdGFuY2UucmV0dXJuLnR5cGU7XHJcbiAgICBpZiAoIUd1aWxkQ29tcG9uZW50KSByZXR1cm47XHJcbiAgICB0aGlzLmd1aWxkTGlzdEl0ZW1zUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChHdWlsZENvbXBvbmVudC5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBpZiAoZGF0YS5yZXR1cm5WYWx1ZSAmJiBkYXRhLnRoaXNPYmplY3QpIHtcclxuICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSBkYXRhLnJldHVyblZhbHVlO1xyXG4gICAgICAgICAgICBjb25zdCBndWlsZERhdGEgPSBkYXRhLnRoaXNPYmplY3QucHJvcHM7XHJcbiAgICAgICAgICAgIGxldCBjbGFzc05hbWUgPSByZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWVcclxuICAgICAgICAgICAgY2xhc3NOYW1lICs9IFwiIGJkLWd1aWxkXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEudW5yZWFkKSBjbGFzc05hbWUgKz0gXCIgYmQtdW5yZWFkXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEuc2VsZWN0ZWQpIGNsYXNzTmFtZSArPSBcIiBiZC1zZWxlY3RlZFwiO1xyXG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLmF1ZGlvKSBjbGFzc05hbWUgKz0gXCIgYmQtYXVkaW9cIjtcclxuICAgICAgICAgICAgaWYgKGd1aWxkRGF0YS52aWRlbykgY2xhc3NOYW1lICs9IFwiIGJkLXZpZGVvXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEuYmFkZ2UpIGNsYXNzTmFtZSArPSBcIiBiZC1iYWRnZVwiO1xyXG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLmFuaW1hdGFibGUpIGNsYXNzTmFtZSArPSBcIiBiZC1hbmltYXRhYmxlXCI7XHJcbiAgICAgICAgICAgIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZVxyXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfX0pO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hHdWlsZFBpbGxzID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5ndWlsZFBpbGxQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgZ3VpbGRQaWxsID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdCAmJiAhbS5kZWZhdWx0LmRpc3BsYXlOYW1lICYmIG0uZGVmYXVsdC50b1N0cmluZyAmJiBtLmRlZmF1bHQudG9TdHJpbmcoKS5pbmNsdWRlcyhcInRyYW5zbGF0ZTNkXCIpKTtcclxuICAgIGlmICghZ3VpbGRQaWxsKSByZXR1cm47XHJcbiAgICB0aGlzLmd1aWxkUGlsbFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goZ3VpbGRQaWxsLCBcImRlZmF1bHRcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0gZGF0YS5tZXRob2RBcmd1bWVudHNbMF07XHJcbiAgICAgICAgaWYgKHByb3BzLnVucmVhZCkgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtdW5yZWFkXCI7XHJcbiAgICAgICAgaWYgKHByb3BzLnNlbGVjdGVkKSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1zZWxlY3RlZFwiO1xyXG4gICAgICAgIGlmIChwcm9wcy5ob3ZlcmVkKSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1ob3ZlcmVkXCI7XHJcbiAgICAgICAgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWU7XHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaEd1aWxkU2VwYXJhdG9yID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5ndWlsZFNlcGFyYXRvclBhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBHdWlsZHMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIkd1aWxkc1wiKTtcclxuICAgIGNvbnN0IGd1aWxkQ29tcG9uZW50cyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwicmVuZGVyTGlzdEl0ZW1cIik7XHJcbiAgICBpZiAoIWd1aWxkQ29tcG9uZW50cyB8fCAhR3VpbGRzKSByZXR1cm47XHJcbiAgICBjb25zdCBHdWlsZFNlcGFyYXRvciA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gZ3VpbGRDb21wb25lbnRzLlNlcGFyYXRvciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1ndWlsZC1zZXBhcmF0b3JcIjtcclxuICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XHJcbiAgICB9O1xyXG4gICAgdGhpcy5ndWlsZFNlcGFyYXRvclBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goR3VpbGRzLnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2hpbGRyZW5bMV0ucHJvcHMuY2hpbGRyZW5bM10udHlwZSA9IEd1aWxkU2VwYXJhdG9yO1xyXG4gICAgfX0pO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hBdHRhY2htZW50ID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5BdHRhY2htZW50UGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IEF0dGFjaG1lbnQgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJBdHRhY2htZW50XCIpWzBdIC8vIHRlbXBvcmFyeVxyXG4gICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XHJcbiAgICBpZiAoIUFuY2hvciB8fCAhQXR0YWNobWVudCB8fCAhQXR0YWNobWVudC5kZWZhdWx0KSByZXR1cm47XHJcbiAgICB0aGlzLkF0dGFjaG1lbnRQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKEF0dGFjaG1lbnQsIFwiZGVmYXVsdFwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgaWYoIXNldHRpbmdzQ29va2llW1wiZm9yay1wcy02XCJdKXJldHVyblxyXG4gICAgICAgIGNvbnN0IGF0dGFjaG1lbnQgPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXSB8fCBudWxsXHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEucmV0dXJuVmFsdWUsIFwicHJvcHMuY2hpbGRyZW5cIik7XHJcblxyXG4gICAgICAgIGlmICghY2hpbGRyZW4gfHwgIWF0dGFjaG1lbnQgfHwgIWF0dGFjaG1lbnQudXJsKXJldHVyblxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKVxyXG4gICAgICAgIGNoaWxkcmVuLnB1c2goQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XHJcbiAgICAgICAgICAgIGlkOiBcImNlcnRpZmllZC1cIitpZFxyXG4gICAgICAgIH0pKVxyXG4gICAgICAgIFBsdWdpbkNlcnRpZmllci5wYXRjaChhdHRhY2htZW50LCBcImNlcnRpZmllZC1cIitpZClcclxuICAgIH19KVxyXG59XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaE1lc3NhZ2VIZWFkZXIgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLm1lc3NhZ2VIZWFkZXJQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgTWVzc2FnZUhlYWRlciA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiTWVzc2FnZVRpbWVzdGFtcFwiKTtcclxuICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG4gICAgaWYgKCFBbmNob3IgfHwgIU1lc3NhZ2VIZWFkZXIgfHwgIU1lc3NhZ2VIZWFkZXIuZGVmYXVsdCkgcmV0dXJuO1xyXG4gICAgdGhpcy5tZXNzYWdlSGVhZGVyUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChNZXNzYWdlSGVhZGVyLCBcImRlZmF1bHRcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGF1dGhvciA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0sIFwibWVzc2FnZS5hdXRob3JcIik7XHJcbiAgICAgICAgLy8gY29uc3QgaGVhZGVyID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuLjEucHJvcHNcIik7XHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEucmV0dXJuVmFsdWUsIFwicHJvcHMuY2hpbGRyZW4uMS5wcm9wcy5jaGlsZHJlbi4xLnByb3BzLmNoaWxkcmVuXCIpO1xyXG4gICAgICAgIGlmICghY2hpbGRyZW4gfHwgIWF1dGhvciB8fCAhYXV0aG9yLmlkKXJldHVyblxyXG4gICAgICAgIC8vIGlmIChoZWFkZXIgJiYgaGVhZGVyLmNsYXNzTmFtZSkgaGVhZGVyLmNsYXNzTmFtZSArPSBcIiBcIlxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHJldHVybjtcclxuICAgICAgICBpZiAoYXV0aG9yLmlkID09PSBcIjI0OTc0NjIzNjAwODE2OTQ3M1wiKSB7IC8vIFJhdWVuemk6IEJhbmRhZ2VkQkQgRGV2ZWxvcGVyXHJcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkQgRGV2ZWxvcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtY2hhdC1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIiwgdGl0bGU6IFwiQmFuZGFnZWRCRFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQkRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGF1dGhvci5pZCA9PT0gXCI2OTY0ODExOTQ0NDMwMTQxNzRcIiB8fCBhdXRob3IuaWQgPT09IFwiNjk2MDAzNDU2NjExMzg1Mzk2XCIpeyAvLyBOb3QgVGhvbWl6OiBMaWdodGNvcmQgRGV2ZWxvcGVyLCBQaG9yY3lzOiBMaWdodGNvcmQgRGV2ZWxvcGVyXHJcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkxpZ2h0Y29yZCBEZXZlbG9wZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1jaGF0LWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL0xpZ2h0Y29yZC9MaWdodGNvcmRcIiwgdGl0bGU6IFwiTGlnaHRjb3JkXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKVxyXG4gICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XHJcbiAgICAgICAgICAgICAgICBpZDogXCJiYWRnZXMtXCIraWQsXHJcbiAgICAgICAgICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiaW5saW5lXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApXHJcbiAgICAgICAgYXBwbHlCYWRnZXMoaWQsIGF1dGhvciwgdHJ1ZSlcclxuICAgIH19KTtcclxufTtcclxuXHJcbmZ1bmN0aW9uIGFwcGx5QmFkZ2VzKGlkLCB1c2VyLCBjaGF0KXtcclxuICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYmFkZ2VzLVwiK2lkKVxyXG4gICAgICAgIGlmKCFkaXYgfHwgZGl2LmNoaWxkTm9kZXMubGVuZ3RoID4gMClyZXR1cm5cclxuICAgICAgICBpZihkaXYuY2hpbGROb2Rlcy5sZW5ndGgpcmV0dXJuXHJcbiAgICAgICAgbGV0IGJsb2NrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxyXG4gICAgICAgIGJsb2NrRGl2LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxyXG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZChibG9ja0RpdilcclxuXHJcbiAgICAgICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XHJcblxyXG4gICAgICAgIGRpc3RhbnQuZ2V0QmFkZ2VzKHVzZXIuaWQpXHJcbiAgICAgICAgLnRoZW4oYmFkZ2VzID0+IHtcclxuICAgICAgICAgICAgYmFkZ2VzLmZvckVhY2goYmFkZ2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3ZnOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IFwiMTZweFwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcImJkLWxvZ29cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IFwiMTZweFwiLCBcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBiYWRnZS5zY29wZXMuZm9yRWFjaChzY29wZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoc2NvcGUgPT09IFwidXNlclwiKXsvLyByZXF1aXJlIHVzZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMudXNlciA9IHVzZXJcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSBcclxuICAgICAgICAgICAgICAgIGlmKCFiYWRnZS5ocmVmKXtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5BbmNob3IgPSBBbmNob3JcclxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5ocmVmID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IGNoYXQgPyBcImJkLWNoYXQtYmFkZ2VcIiA6IFwiYmQtbWVtYmVyLWJhZGdlXCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogYmFkZ2UubmFtZSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogXCJfYmxhbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBiYWRnZS5uYW1lfSxcclxuICAgICAgICAgICAgICAgICAgICBiYWRnZS5ocmVmID8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBocmVmOiBiYWRnZS5ocmVmLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IGNoYXQgPyBcImJkLWNoYXQtYmFkZ2VcIiA6IFwiYmQtbWVtYmVyLWJhZGdlXCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogYmFkZ2UubmFtZSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogXCJfYmxhbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgIH0sIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChiYWRnZS5jb21wb25lbnQsIHByb3BzKSkgOiBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoYmFkZ2UuY29tcG9uZW50LCBwcm9wcylcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpdjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcihlbGVtZW50LCBkaXYyKVxyXG4gICAgICAgICAgICAgICAgZGl2Mi5jaGlsZE5vZGVzLmZvckVhY2gobm9kZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKG5vZGUpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9KVxyXG59XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaE1lbWJlckxpc3QgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLm1lbWJlckxpc3RQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgTWVtYmVyTGlzdEl0ZW0gPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIk1lbWJlckxpc3RJdGVtXCIpO1xyXG4gICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XHJcbiAgICBpZiAoIUFuY2hvciB8fCAhTWVtYmVyTGlzdEl0ZW0gfHwgIU1lbWJlckxpc3RJdGVtLnByb3RvdHlwZSB8fCAhTWVtYmVyTGlzdEl0ZW0ucHJvdG90eXBlLnJlbmRlckRlY29yYXRvcnMpIHJldHVybjtcclxuICAgIHRoaXMubWVtYmVyTGlzdFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goTWVtYmVyTGlzdEl0ZW0ucHJvdG90eXBlLCBcInJlbmRlckRlY29yYXRvcnNcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEudGhpc09iamVjdCwgXCJwcm9wcy51c2VyXCIpO1xyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuXCIpO1xyXG4gICAgICAgIGlmICghY2hpbGRyZW4gfHwgIXVzZXIgfHwgIXVzZXIuaWQpcmV0dXJuXHJcbiAgICAgICAgLy8gaWYgKGhlYWRlciAmJiBoZWFkZXIuY2xhc3NOYW1lKSBoZWFkZXIuY2xhc3NOYW1lICs9IFwiIFwiXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgcmV0dXJuO1xyXG4gICAgICAgIGlmICh1c2VyLmlkID09PSBcIjI0OTc0NjIzNjAwODE2OTQ3M1wiKSB7XHJcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkQgRGV2ZWxvcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtbWVtYmVyLWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcFwiLCB0aXRsZTogXCJCYW5kYWdlZEJEXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChCRExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodXNlci5pZCA9PT0gXCI2OTY0ODExOTQ0NDMwMTQxNzRcIiB8fCB1c2VyLmlkID09PSBcIjY5NjAwMzQ1NjYxMTM4NTM5NlwiKXtcclxuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiTGlnaHRjb3JkIERldmVsb3BlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLW1lbWJlci1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9MaWdodGNvcmQvTGlnaHRjb3JkXCIsIHRpdGxlOiBcIkxpZ2h0Y29yZFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkTG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KClcclxuICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBcImJhZGdlcy1cIitpZH0pXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGFwcGx5QmFkZ2VzKGlkLCB1c2VyLCBmYWxzZSlcclxuICAgIH19KTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnVwZGF0ZUluamVjdG9yID0gYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCBpbmplY3Rpb25QYXRoID0gRGF0YVN0b3JlLmluamVjdGlvblBhdGg7XHJcbiAgICBpZiAoIWluamVjdGlvblBhdGgpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcclxuICAgIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcclxuICAgIGNvbnN0IHJtcmYgPSByZXF1aXJlKFwicmltcmFmXCIpO1xyXG4gICAgY29uc3QgeWF1emwgPSByZXF1aXJlKFwieWF1emxcIik7XHJcbiAgICBjb25zdCBta2RpcnAgPSByZXF1aXJlKFwibWtkaXJwXCIpO1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IC8qcmVxdWlyZShcInJlcXVlc3RcIik7Ki8gbnVsbFxyXG5cclxuICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLnJlc29sdmUoaW5qZWN0aW9uUGF0aCwgXCIuLlwiKTtcclxuICAgIGNvbnN0IGZvbGRlck5hbWUgPSBwYXRoLmJhc2VuYW1lKGluamVjdGlvblBhdGgpO1xyXG4gICAgY29uc3QgemlwTGluayA9IFwiaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC9hcmNoaXZlL2luamVjdG9yLnppcFwiO1xyXG4gICAgY29uc3Qgc2F2ZWRaaXAgPSBwYXRoLnJlc29sdmUocGFyZW50UGF0aCwgXCJpbmplY3Rvci56aXBcIik7XHJcbiAgICBjb25zdCBleHRyYWN0ZWRGb2xkZXIgPSBwYXRoLnJlc29sdmUocGFyZW50UGF0aCwgXCJCZXR0ZXJEaXNjb3JkQXBwLWluamVjdG9yXCIpO1xyXG5cclxuICAgIC8vIERvd25sb2FkIHRoZSBpbmplY3RvciB6aXAgZmlsZVxyXG4gICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJEb3dubG9hZGluZyBcIiArIHppcExpbmspO1xyXG4gICAgbGV0IHN1Y2Nlc3MgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICByZXF1ZXN0LmdldCh7dXJsOiB6aXBMaW5rLCBlbmNvZGluZzogbnVsbH0sIGFzeW5jIChlcnJvciwgcmVzcG9uc2UsIGJvZHkpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yIHx8IHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkgcmV0dXJuIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgICAgICAvLyBTYXZlIGEgYmFja3VwIGluIGNhc2Ugc29tZW9uZSBoYXMgdGhlaXIgb3duIGNvcHlcclxuICAgICAgICAgICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5leGlzdHMoc2F2ZWRaaXAsIHJlcykpO1xyXG4gICAgICAgICAgICBpZiAoYWxyZWFkeUV4aXN0cykgYXdhaXQgbmV3IFByb21pc2UocmVzID0+IGZzLnJlbmFtZShzYXZlZFppcCwgYCR7c2F2ZWRaaXB9LmJhayR7TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSl9YCwgcmVzKSk7XHJcblxyXG4gICAgICAgICAgICBVdGlscy5sb2coXCJJbmplY3RvclVwZGF0ZVwiLCBcIldyaXRpbmcgXCIgKyBzYXZlZFppcCk7XHJcbiAgICAgICAgICAgIGZzLndyaXRlRmlsZShzYXZlZFppcCwgYm9keSwgZXJyID0+IHJlc29sdmUoIWVycikpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICBpZiAoIXN1Y2Nlc3MpIHJldHVybiBzdWNjZXNzO1xyXG5cclxuICAgIC8vIENoZWNrIGFuZCBkZWxldGUgcmVuYW1lIGV4dHJhY3Rpb25cclxuICAgIGNvbnN0IGFscmVhZHlFeGlzdHMgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXMgPT4gZnMuZXhpc3RzKGV4dHJhY3RlZEZvbGRlciwgcmVzKSk7XHJcbiAgICBpZiAoYWxyZWFkeUV4aXN0cykgYXdhaXQgbmV3IFByb21pc2UocmVzID0+IGZzLnJlbmFtZShleHRyYWN0ZWRGb2xkZXIsIGAke2V4dHJhY3RlZEZvbGRlcn0uYmFrJHtNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLm5vdygpKX1gLCByZXMpKTtcclxuICAgIFxyXG4gICAgLy8gVW56aXAgdGhlIGRvd25sb2FkZWQgemlwIGZpbGVcclxuICAgIGNvbnN0IHppcGZpbGUgPSBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHlhdXpsLm9wZW4oc2F2ZWRaaXAsIHtsYXp5RW50cmllczogdHJ1ZX0sIChlcnIsIHppcCkgPT4gIHIoemlwKSkpO1xyXG4gICAgemlwZmlsZS5vbihcImVudHJ5XCIsIGZ1bmN0aW9uKGVudHJ5KSB7XHJcbiAgICAgICAgLy8gU2tpcCBkaXJlY3RvcmllcywgdGhleSBhcmUgaGFuZGxlZCB3aXRoIG1rZGlycFxyXG4gICAgICAgIGlmIChlbnRyeS5maWxlTmFtZS5lbmRzV2l0aChcIi9cIikpIHJldHVybiB6aXBmaWxlLnJlYWRFbnRyeSgpO1xyXG5cclxuICAgICAgICBVdGlscy5sb2coXCJJbmplY3RvclVwZGF0ZVwiLCBcIkV4dHJhY3RpbmcgXCIgKyBlbnRyeS5maWxlTmFtZSk7XHJcbiAgICAgICAgLy8gTWFrZSBhbnkgbmVlZGVkIHBhcmVudCBkaXJlY3Rvcmllc1xyXG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKHBhcmVudFBhdGgsIGVudHJ5LmZpbGVOYW1lKTtcclxuICAgICAgICBta2RpcnAuc3luYyhwYXRoLmRpcm5hbWUoZnVsbFBhdGgpKTtcclxuICAgICAgICB6aXBmaWxlLm9wZW5SZWFkU3RyZWFtKGVudHJ5LCBmdW5jdGlvbihlcnIsIHJlYWRTdHJlYW0pIHtcclxuICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIHN1Y2Nlc3MgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmVhZFN0cmVhbS5vbihcImVuZFwiLCBmdW5jdGlvbigpIHt6aXBmaWxlLnJlYWRFbnRyeSgpO30pOyAvLyBHbyB0byBuZXh0IGZpbGUgYWZ0ZXIgdGhpc1xyXG4gICAgICAgICAgICByZWFkU3RyZWFtLnBpcGUoZnMuY3JlYXRlV3JpdGVTdHJlYW0oZnVsbFBhdGgpKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgemlwZmlsZS5yZWFkRW50cnkoKTsgLy8gU3RhcnQgcmVhZGluZ1xyXG5cclxuICAgIC8vIFdhaXQgZm9yIHRoZSBmaW5hbCBmaWxlIHRvIGZpbmlzaFxyXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB6aXBmaWxlLm9uY2UoXCJlbmRcIiwgcmVzb2x2ZSkpO1xyXG5cclxuICAgIC8vIFNhdmUgYSBiYWNrdXAgaW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZyBkdXJpbmcgZmluYWwgc3RlcFxyXG4gICAgY29uc3QgYmFja3VwRm9sZGVyID0gcGF0aC5yZXNvbHZlKHBhcmVudFBhdGgsIGAke2ZvbGRlck5hbWV9LmJhayR7TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSl9YCk7XHJcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IGZzLnJlbmFtZShpbmplY3Rpb25QYXRoLCBiYWNrdXBGb2xkZXIsIHJlc29sdmUpKTtcclxuXHJcbiAgICAvLyBSZW5hbWUgdGhlIGV4dHJhY3RlZCBmb2xkZXIgdG8gd2hhdCBpdCBzaG91bGQgYmVcclxuICAgIFV0aWxzLmxvZyhcIkluamVjdG9yVXBkYXRlXCIsIGBSZW5hbWluZyAke3BhdGguYmFzZW5hbWUoZXh0cmFjdGVkRm9sZGVyKX0gdG8gJHtmb2xkZXJOYW1lfWApO1xyXG4gICAgc3VjY2VzcyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMucmVuYW1lKGV4dHJhY3RlZEZvbGRlciwgaW5qZWN0aW9uUGF0aCwgZXJyID0+IHJlc29sdmUoIWVycikpKTtcclxuICAgIGlmICghc3VjY2Vzcykge1xyXG4gICAgICAgIFV0aWxzLmVycihcIkluamVjdG9yVXBkYXRlXCIsIFwiRmFpbGVkIHRvIHJlbmFtZSB0aGUgZmluYWwgZGlyZWN0b3J5XCIpO1xyXG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHJlbmFtZSBoYWQgaXNzdWVzLCBkZWxldGUgd2hhdCB3ZSB0cmllZCB0byByZW5hbWUgYW5kIHJlc3RvcmUgYmFja3VwXHJcbiAgICBpZiAoIXN1Y2Nlc3MpIHtcclxuICAgICAgICBVdGlscy5lcnIoXCJJbmplY3RvclVwZGF0ZVwiLCBcIlNvbWV0aGluZyB3ZW50IHdyb25nLi4uIHJlc3RvcmluZyBiYWNrdXBzLlwiKTtcclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHJtcmYoZXh0cmFjdGVkRm9sZGVyLCByZXNvbHZlKSk7XHJcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBmcy5yZW5hbWUoYmFja3VwRm9sZGVyLCBpbmplY3Rpb25QYXRoLCByZXNvbHZlKSk7XHJcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgd2UndmUgZ290dGVuIHRvIHRoaXMgcG9pbnQsIGV2ZXJ5dGhpbmcgc2hvdWxkIGhhdmUgZ29uZSBzbW9vdGhseS5cclxuICAgIC8vIENsZWFudXAgdGhlIGJhY2t1cCBmb2xkZXIgdGhlbiByZW1vdmUgdGhlIHppcFxyXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBybXJmKGJhY2t1cEZvbGRlciwgcmVzb2x2ZSkpO1xyXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBmcy51bmxpbmsoc2F2ZWRaaXAsIHJlc29sdmUpKTtcclxuXHJcbiAgICBVdGlscy5sb2coXCJJbmplY3RvclVwZGF0ZVwiLCBcIkluamVjdG9yIFVwZGF0ZWQhXCIpO1xyXG4gICAgcmV0dXJuIHN1Y2Nlc3M7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgQ29yZSgpO1xyXG5cclxuLyoqXHJcbiAqIERvbid0IGV4cG9zZSBjb3JlIC0gY291bGQgYmUgZGFuZ2Vyb3VzIGZvciBub3dcclxuICovIiwiY29uc3QgX19ub25fd2VicGFja19yZXF1aXJlX18gPSB3aW5kb3cucmVxdWlyZVxyXG5cclxuaW1wb3J0IHtiZENvbmZpZ30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIjtcclxuXHJcbmNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xyXG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XHJcbmNvbnN0IHJlbGVhc2VDaGFubmVsID0gRGlzY29yZE5hdGl2ZS5nbG9iYWxzID8gRGlzY29yZE5hdGl2ZS5nbG9iYWxzLnJlbGVhc2VDaGFubmVsIDogRGlzY29yZE5hdGl2ZS5hcHAgPyBEaXNjb3JkTmF0aXZlLmFwcC5nZXRSZWxlYXNlQ2hhbm5lbCgpIDogXCJzdGFibGVcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBEYXRhU3RvcmUge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0ge3NldHRpbmdzOiB7c3RhYmxlOiB7fSwgY2FuYXJ5OiB7fSwgcHRiOiB7fX19O1xyXG4gICAgICAgIHRoaXMucGx1Z2luRGF0YSA9IHt9O1xyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5EYXRhU3RvcmUgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgaW5pdGlhbGl6ZSgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5CREZpbGUpKSBmcy53cml0ZUZpbGVTeW5jKHRoaXMuQkRGaWxlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsIDQpLCBcImJpbmFyeVwiKTtcclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMuQkRGaWxlLCBcImJpbmFyeVwiKSlcclxuICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoXCJzZXR0aW5nc1wiKSkgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuc2V0dGluZ3NGaWxlKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBsZXQgc2V0dGluZ3MgPSBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyh0aGlzLnNldHRpbmdzRmlsZSk7XHJcbiAgICAgICAgICAgIGZzLnVubGlua1N5bmModGhpcy5zZXR0aW5nc0ZpbGUpO1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MuaGFzT3duUHJvcGVydHkoXCJzZXR0aW5nc1wiKSkgc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHtzdGFibGU6IHt9LCBjYW5hcnk6IHt9LCBwdGI6IHt9fSwge1tyZWxlYXNlQ2hhbm5lbF06IHNldHRpbmdzfSk7XHJcbiAgICAgICAgICAgIGVsc2Ugc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHtzdGFibGU6IHt9LCBjYW5hcnk6IHt9LCBwdGI6IHt9fSwgc2V0dGluZ3MpO1xyXG4gICAgICAgICAgICB0aGlzLnNldEJERGF0YShcInNldHRpbmdzXCIsIHNldHRpbmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICAgICAgICAgIFV0aWxzLmFsZXJ0KFwiQ29ycnVwdCBTdG9yYWdlXCIsIFwiVGhlIGJkIHN0b3JhZ2UgaGFzIHNvbWVob3cgYmVjb21lIGNvcnJ1cHQuIFlvdSBtYXkgZWl0aGVyIHRyeSB0byBzYWx2YWdlIHRoZSBmaWxlIG9yIGRlbGV0ZSBpdCB0aGVuIHJlbG9hZC5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBpbmplY3Rpb25QYXRoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbmplY3Rpb25QYXRoID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5faW5qZWN0aW9uUGF0aCkgcmV0dXJuIHRoaXMuX2luamVjdGlvblBhdGg7XHJcbiAgICAgICAgY29uc3QgZWxlY3Ryb24gPSByZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLmFwcDtcclxuICAgICAgICBjb25zdCBiYXNlID0gZWxlY3Ryb24uZ2V0QXBwUGF0aCgpO1xyXG4gICAgICAgIGNvbnN0IHJvYW1pbmdCYXNlID0gZWxlY3Ryb24uZ2V0UGF0aChcInVzZXJEYXRhXCIpO1xyXG4gICAgICAgIGNvbnN0IHJvYW1pbmdMb2NhdGlvbiA9IHBhdGgucmVzb2x2ZShyb2FtaW5nQmFzZSwgZWxlY3Ryb24uZ2V0VmVyc2lvbigpLCBcIm1vZHVsZXNcIiwgXCJkaXNjb3JkX2Rlc2t0b3BfY29yZVwiLCBcImluamVjdG9yXCIpO1xyXG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gcGF0aC5yZXNvbHZlKGJhc2UsIFwiLi5cIiwgXCJhcHBcIik7XHJcbiAgICAgICAgY29uc3QgcmVhbExvY2F0aW9uID0gZnMuZXhpc3RzU3luYyhsb2NhdGlvbikgPyBsb2NhdGlvbiA6IGZzLmV4aXN0c1N5bmMocm9hbWluZ0xvY2F0aW9uKSA/IHJvYW1pbmdMb2NhdGlvbiA6IG51bGw7XHJcbiAgICAgICAgaWYgKCFyZWFsTG9jYXRpb24pIHJldHVybiB0aGlzLl9pbmplY3Rpb25QYXRoID0gbnVsbDtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW5qZWN0aW9uUGF0aCA9IHJlYWxMb2NhdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29uZmlnRmlsZSgpIHtyZXR1cm4gdGhpcy5fY29uZmlnRmlsZSB8fCAodGhpcy5fY29uZmlnRmlsZSA9IHBhdGgucmVzb2x2ZSh0aGlzLmluamVjdGlvblBhdGgsIFwiYmV0dGVyZGlzY29yZFwiLCBcImNvbmZpZy5qc29uXCIpKTt9XHJcbiAgICBnZXQgQkRGaWxlKCkge3JldHVybiB0aGlzLl9CREZpbGUgfHwgKHRoaXMuX0JERmlsZSA9IHBhdGgucmVzb2x2ZShiZENvbmZpZy5kYXRhUGF0aCwgXCJiZHN0b3JhZ2UuanNvblwiKSk7fVxyXG4gICAgZ2V0IHNldHRpbmdzRmlsZSgpIHtyZXR1cm4gdGhpcy5fc2V0dGluZ3NGaWxlIHx8ICh0aGlzLl9zZXR0aW5nc0ZpbGUgPSBwYXRoLnJlc29sdmUoYmRDb25maWcuZGF0YVBhdGgsIFwiYmRzZXR0aW5ncy5qc29uXCIpKTt9XHJcbiAgICBnZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpIHtyZXR1cm4gcGF0aC5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIsIHBsdWdpbk5hbWUgKyBcIi5jb25maWcuanNvblwiKTt9XHJcblxyXG4gICAgZ2V0U2V0dGluZ0dyb3VwKGtleSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuc2V0dGluZ3NbcmVsZWFzZUNoYW5uZWxdW2tleV0gfHwgbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzZXRTZXR0aW5nR3JvdXAoa2V5LCBkYXRhKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhLnNldHRpbmdzW3JlbGVhc2VDaGFubmVsXVtrZXldID0gZGF0YTtcclxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMuQkRGaWxlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsIDQpLCBcImJpbmFyeVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRCRERhdGEoa2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtrZXldIHx8IFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0QkREYXRhKGtleSwgdmFsdWUpIHtcclxuICAgICAgICB0aGlzLmRhdGFba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5CREZpbGUsIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSwgbnVsbCwgNCksIFwiYmluYXJ5XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdW2tleV07XHJcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuZ2V0UGx1Z2luRmlsZShwbHVnaW5OYW1lKSkpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpKSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXVtrZXldO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9PT0gdW5kZWZpbmVkKSB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPSB7fTtcclxuICAgICAgICB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV1ba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpLCBKU09OLnN0cmluZ2lmeSh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0sIG51bGwsIDQpLCBcImJpbmFyeVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBkZWxldGVQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSkge1xyXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPT09IHVuZGVmaW5lZCkgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID0ge307XHJcbiAgICAgICAgZGVsZXRlIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXVtrZXldO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpLCBKU09OLnN0cmluZ2lmeSh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0sIG51bGwsIDQpLCBcImJpbmFyeVwiKTtcclxuICAgIH1cclxufTsiLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBEZXZNb2RlIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuZGVidWdMaXN0ZW5lciA9IHRoaXMuZGVidWdMaXN0ZW5lci5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuY29weVNlbGVjdG9yTGlzdGVuZXIgPSB0aGlzLmNvcHlTZWxlY3Rvckxpc3RlbmVyLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnQoKSB7XHJcbiAgICAgICAgdGhpcy5zdGFydERlYnVnTGlzdGVuZXIoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLWRtLTFcIl0pIHRoaXMuc3RhcnRDb3B5U2VsZWN0b3IoKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgc3RvcCgpIHtcclxuICAgICAgICB0aGlzLnN0b3BEZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgdGhpcy5zdG9wQ29weVNlbGVjdG9yKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnREZWJ1Z0xpc3RlbmVyKCkge1xyXG4gICAgICAgIHRoaXMuc3RvcERlYnVnTGlzdGVuZXIoKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLmRlYnVnTGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3BEZWJ1Z0xpc3RlbmVyKCkge1xyXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuZGVidWdMaXN0ZW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnRDb3B5U2VsZWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5zdG9wQ29weVNlbGVjdG9yKCk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIHRoaXMuY29weVNlbGVjdG9yTGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3BDb3B5U2VsZWN0b3IoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIHRoaXMuY29weVNlbGVjdG9yTGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlYnVnTGlzdGVuZXIoZSkge1xyXG4gICAgICAgIGlmIChlLndoaWNoID09PSAxMTkgfHwgZS53aGljaCA9PSAxMTgpIHsvL0Y4XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiJWNbJWNEZXZNb2RlJWNdICVjQnJlYWsvUmVzdW1lXCIsIFwiY29sb3I6IHJlZDtcIiwgXCJjb2xvcjogIzMwMzAzMDsgZm9udC13ZWlnaHQ6NzAwO1wiLCBcImNvbG9yOnJlZDtcIiwgXCJcIik7XHJcbiAgICAgICAgICAgIGRlYnVnZ2VyOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWRlYnVnZ2VyXHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvcHlTZWxlY3Rvckxpc3RlbmVyKGUpIHtcclxuICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gdGhpcy5nZXRTZWxlY3RvcihlLnRhcmdldCk7XHJcbiAgICBcclxuICAgICAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgICAgIGNsYXNzTGF5ZXIsIFxyXG4gICAgICAgICAgICAgICAgY2xhc3NJdGVtc1xyXG4gICAgICAgICAgICBdID0gW1xyXG4gICAgICAgICAgICAgICAgQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5sYXllciAmJiB0eXBlb2YgZS5sYXllciA9PT0gXCJzdHJpbmdcIiAmJiBlLmRpc2FibGVkUG9pbnRlckV2ZW50cylbMF0sXHJcbiAgICAgICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLm1lbnUpWzBdXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGF0dGFjaCgpIHtcclxuICAgICAgICAgICAgICAgIGlmKCFjbGFzc0l0ZW1zIHx8ICFjbGFzc0xheWVyLmxheWVyKXJldHVybiBjb25zb2xlLmxvZyhjbGFzc0l0ZW1zLCBjbGFzc0xheWVyLmxheWVyKVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBjbSA9IERPTS5xdWVyeShcIi5cIitVdGlscy5yZW1vdmVEYShjbGFzc0l0ZW1zLm1lbnUpKTtcclxuICAgICAgICAgICAgICAgIGlmICghY20pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBET00ucXVlcnkoXCIjYXBwLW1vdW50ID4gLlwiK1V0aWxzLnJlbW92ZURhKGNsYXNzTGF5ZXIubGF5ZXJDb250YWluZXIpKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbVdyYXAgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7Y2xhc3NMYXllci5sYXllcn1cIj5gKTtcclxuICAgICAgICAgICAgICAgICAgICBjbSA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtjbGFzc0l0ZW1zLm1lbnV9ICR7Y2xhc3NJdGVtcy5zdHlsZUZsZXhpYmxlfSAke2NsYXNzSXRlbXMuYWNjb21tb2RhdGVTY3JvbGxiYXJ9IGJkLWNvbnRleHQtbWVudVwiIHN0eWxlPVwiXCI+PC9kaXY+YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLmFwcGVuZChjbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZChjbVdyYXApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zdHlsZS50b3AgPSBlLmNsaWVudFkgKyBcInB4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnN0eWxlLmxlZnQgPSBlLmNsaWVudFggKyBcInB4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJtZW51XCIpXHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiLTFcIilcclxuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuaWQgPSBcImJkLWNvcHktc2VsZWN0b3ItY29udGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJDb3B5IFNlbGVjdG9yIEFjdGlvbnNcIilcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXJDbGFzc2VzID0gQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5zY3JvbGxlcldyYXApWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXJXcmFwID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke3Njcm9sbGVyQ2xhc3Nlcy5zY3JvbGxlcldyYXB9ICR7c2Nyb2xsZXJDbGFzc2VzLnNjcm9sbGVyVGhlbWVkfSAke3Njcm9sbGVyQ2xhc3Nlcy50aGVtZUdob3N0SGFpcmxpbmV9XCI+PC9kaXY+YClcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxlciA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxlcilbMF0uc2Nyb2xsZXJ9ICR7Y2xhc3NJdGVtcy5zY3JvbGxlcn1cIj48L2Rpdj5gKVxyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbGVyV3JhcC5hcHBlbmQoc2Nyb2xsZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgY20uYXBwZW5kKHNjcm9sbGVyV3JhcClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlQ00gPSBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmtleUNvZGUgJiYgZS5rZXlDb2RlICE9PSAyNykgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbVdyYXAucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgcmVtb3ZlQ00pO1xyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIHJlbW92ZUNNKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNtV3JhcCA9IGNtLnBhcmVudEVsZW1lbnRcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXIgPSBjbS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNtZyA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IHJvbGU9XCJncm91cFwiPjwvZGl2PmApO1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNtaSA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtjbGFzc0l0ZW1zLml0ZW19ICR7Y2xhc3NJdGVtcy5sYWJlbENvbnRhaW5lcn0gJHtjbGFzc0l0ZW1zLmNvbG9yRGVmYXVsdH1cIiByb2xlPVwibWVudWl0ZW1cIiBpZD1cImJkLWNvcHktc2VsZWN0b3ItaXRlbS1jbVwiPjwvZGl2PmApO1xyXG4gICAgICAgICAgICAgICAgY21pLmFwcGVuZChET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7Y2xhc3NJdGVtcy5sYWJlbH1cIj5Db3B5IFNlbGVjdG9yPC9kaXY+YCkpO1xyXG4gICAgICAgICAgICAgICAgY21pLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5OYXRpdmVNb2R1bGUuY29weShzZWxlY3Rvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBjbWkuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3ZlclwiLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50cyA9IERPTS5xdWVyeUFsbChcImRpdltyb2xlPW1lbnVpdGVtXS5cIitVdGlscy5yZW1vdmVEYShjbGFzc0l0ZW1zLmZvY3VzZWQpKVxyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzICYmIGVsZW1lbnRzLmZvckVhY2goZWxlbSA9PiBlbGVtLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NJdGVtcy5mb2N1c2VkKSlcclxuICAgICAgICAgICAgICAgICAgICBjbWkuY2xhc3NMaXN0LmFkZChjbGFzc0l0ZW1zLmZvY3VzZWQpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgY21pLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW91dFwiLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNtaS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzSXRlbXMuZm9jdXNlZClcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBjbWcuYXBwZW5kKGNtaSk7XHJcbiAgICAgICAgICAgICAgICBpZihzY3JvbGxlci5jaGlsZE5vZGVzLmxlbmd0aCl7IC8vIGFwZW5kIGEgc2VwYXJhdG9yXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgcm9sZT1cInNlcGFyYXRvclwiIGNsYXNzPVwiJHtjbGFzc0l0ZW1zLnNlcGFyYXRvcn1cIj48L2Rpdj5gKVxyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbGVyLmFwcGVuZChzZXBhcmF0b3IpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzY3JvbGxlci5hcHBlbmQoY21nKTtcclxuICAgICAgICAgICAgICAgIGlmKGNtV3JhcC5jbGllbnRIZWlnaHQgPCBjbVdyYXAuc2Nyb2xsSGVpZ2h0KXtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm92ZXJmbG93aW5nIFwiK2NtV3JhcC5zdHlsZS50b3ApXHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnN0eWxlLnRvcCA9IChjbVdyYXAuc3R5bGUudG9wIC0gY21nLmNsaWVudEhlaWdodCkgKyBcInB4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJvdmVyZmxvd2luZ1wiK2NtV3JhcC5zdHlsZS50b3ApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGF0dGFjaCwgMSk7XHJcbiAgICAgICAgfWNhdGNoKGUpe1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFNlbGVjdG9yKGVsZW1lbnQpIHtcclxuICAgICAgICBpZiAoZWxlbWVudC5pZCkgcmV0dXJuIGAjJHtlbGVtZW50LmlkfWA7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZnVuY3Rpb24gZnVsbFBhdGgoZWwpe1xyXG4gICAgICAgICAgICB2YXIgbmFtZXMgPSBbXTtcclxuICAgICAgICAgICAgd2hpbGUgKGVsLnBhcmVudE5vZGUpe1xyXG4gICAgICAgICAgICAgIGlmIChlbC5pZCl7XHJcbiAgICAgICAgICAgICAgICBuYW1lcy51bnNoaWZ0KCcjJytlbC5pZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGlmIChlbD09ZWwub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIG5hbWVzLnVuc2hpZnQoZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpK0FycmF5LmZyb20oZWwuY2xhc3NMaXN0LmVudHJpZXMoKSkubWFwKGUgPT4gXCIuXCIrZSkuam9pbihcIlwiKSk7XHJcbiAgICAgICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciBjPTEsZT1lbDtlLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7ZT1lLnByZXZpb3VzRWxlbWVudFNpYmxpbmcsYysrKTtcclxuICAgICAgICAgICAgICAgICAgbmFtZXMudW5zaGlmdChlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkrKCh0eXBlb2YgZWwuY2xhc3NOYW1lID09PSBcInN0cmluZ1wiICYmIGVsLmNsYXNzTmFtZSkgfHwgXCJcIikuc3BsaXQoXCIgXCIpLmZpbHRlcihlID0+ICEhZSkubWFwKGUgPT4gXCIuXCIrZSkuam9pbihcIlwiKStcIjpudGgtY2hpbGQoXCIrYytcIilcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbD1lbC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbmFtZXMuam9pbihcIiA+IFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZ1bGxQYXRoKGVsZW1lbnQpXHJcbiAgICAgICAgLypcclxuICAgICAgICBjb25zdCBydWxlcyA9IHRoaXMuZ2V0UnVsZXMoZWxlbWVudCk7XHJcbiAgICAgICAgY29uc3QgbGF0ZXN0UnVsZSA9IHJ1bGVzW3J1bGVzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgIGlmIChsYXRlc3RSdWxlKSByZXR1cm4gbGF0ZXN0UnVsZS5zZWxlY3RvclRleHQ7XHJcbiAgICAgICAgZWxzZSBpZiAoZWxlbWVudC5jbGFzc0xpc3QubGVuZ3RoKSByZXR1cm4gYC4ke0FycmF5LmZyb20oZWxlbWVudC5jbGFzc0xpc3QpLmpvaW4oXCIuXCIpfWA7XHJcbiAgICAgICAgcmV0dXJuIGAuJHtBcnJheS5mcm9tKGVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QpLmpvaW4oXCIuXCIpfWA7Ki9cclxuICAgIH1cclxuXHJcbiAgICBnZXRSdWxlcyhlbGVtZW50LCBjc3MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMpIHtcclxuICAgICAgICAvL2lmICh3aW5kb3cuZ2V0TWF0Y2hlZENTU1J1bGVzKSByZXR1cm4gd2luZG93LmdldE1hdGNoZWRDU1NSdWxlcyhlbGVtZW50KTtcclxuICAgICAgICBjb25zdCBzaGVldHMgPSBbLi4uY3NzXS5maWx0ZXIocyA9PiAhcy5ocmVmIHx8ICFzLmhyZWYuaW5jbHVkZXMoXCJCZXR0ZXJEaXNjb3JkQXBwXCIpKTtcclxuICAgICAgICBjb25zdCBydWxlcyA9IHNoZWV0cy5tYXAocyA9PiBbLi4uKHMuY3NzUnVsZXMgfHwgW10pXSkuZmxhdCgpO1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRSdWxlcyA9IHJ1bGVzLmZpbHRlcihyID0+IHIgJiYgci5zZWxlY3RvclRleHQgJiYgZWxlbWVudC5tYXRjaGVzKHIuc2VsZWN0b3JUZXh0KSAmJiByLnN0eWxlLmxlbmd0aCAmJiByLnNlbGVjdG9yVGV4dC5zcGxpdChcIiwgXCIpLmxlbmd0aCA8IDggJiYgIXIuc2VsZWN0b3JUZXh0LnNwbGl0KFwiLCBcIikuaW5jbHVkZXMoXCIqXCIpKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudFJ1bGVzO1xyXG4gICAgfVxyXG59OyIsImV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBEaXNhYmxlVHlwaW5nIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LnN0YXJ0VHlwaW5nKVxyXG4gICAgICAgIC50aGVuKHR5cGluZ01vZHVsZSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBzZWxmID0gdGhpc1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydFR5cGluZyA9IHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0YXJ0VHlwaW5nXHJcbiAgICAgICAgICAgIHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0YXJ0VHlwaW5nID0gZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgIGlmKHNlbGYuZGlzYWJsZWQpcmV0dXJuIHN0YXJ0VHlwaW5nLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHN0b3BUeXBpbmcgPSB0eXBpbmdNb2R1bGUuZGVmYXVsdC5zdG9wVHlwaW5nXHJcbiAgICAgICAgICAgIHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0b3BUeXBpbmcgPSBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgaWYoc2VsZi5kaXNhYmxlZClyZXR1cm4gc3RvcFR5cGluZy5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkRpc2FibGVUeXBpbmcgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZSgpe1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKCl7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQnVnSHVudGVyQmFkZ2UgZnJvbSBcIi4uL3N2Zy9idWdfaHVudGVyXCJcclxuaW1wb3J0IExpZ2h0Y29yZFVzZXJCYWRnZSBmcm9tIFwiLi4vc3ZnL0xpZ2h0Y29yZFVzZXJcIjtcclxuaW1wb3J0IG5vZGVGZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiXHJcbmltcG9ydCB7IHNldHRpbmdzQ29va2llIH0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDaXJjdXMgZnJvbSBcIi4uL3N2Zy9jaXJjdXNcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1dWlkdjQoKSB7IC8vIEdlbmVyYXRlIFVVSUQgKE5vIGNyeXB0byBybmcpXHJcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbihjKSB7XHJcbiAgICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwLCB2ID0gYyA9PSAneCcgPyByIDogKHIgJiAweDMgfCAweDgpO1xyXG4gICAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcclxuICAgIH0pO1xyXG59ICBcclxuXHJcbmNvbnN0IGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXMgPSB7fVxyXG5sZXQgYmFkZ2VzVG9GZXRjaCA9IFtdXHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRGlzdGFudFNlcnZlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuX2NhY2hlID0ge1xyXG4gICAgICAgICAgICBiYWRnZXM6IHtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkRpc3RhbnRTZXJ2ZXIgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNhY2hlKCl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlXHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGNhY2hlKGRhdGEpe1xyXG4gICAgICAgIGlmKHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB0aGlzLl9jYWNoZSAhPT0gXCJvYmplY3RcIilyZXR1cm4gdGhpcy5fY2FjaGUgPSBkYXRhXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlID0gT2JqZWN0LmFzc2lnbih0aGlzLl9jYWNoZSwgZGF0YSlcclxuICAgIH0vKlxyXG5cclxuICAgIGFzeW5jIGRlbGV0ZSgpe1xyXG4gICAgICAgIEJkQXBpLnNob3dUb2FzdChcIkRlbGV0aW5nIGFsbCBpbmZvcyBhYm91dCB5b3Ugb24gTGlnaHRjb3JkIFNlcnZlcnMuLi5cIiwge3R5cGU6IFwid2FyblwifSlcclxuICAgICAgICByZXR1cm4gaGFuZGxlUmVxdWVzdChSb3V0ZXMuZGVsZXRlLCBcImRlbGV0ZVwiKVxyXG4gICAgICAgIC50aGVuKGFzeW5jIHJlcyA9PiB7XHJcbiAgICAgICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl7XHJcbiAgICAgICAgICAgICAgICBCZEFwaS5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkLCBjb3VsZG4ndCBkZWxldGUgaW5mb3JtYXRpb25zLiBTZWUgY29uc29sZSBmb3IgbW9yZSBpbmZvc1wiLCB7dHlwZTogXCJlcnJvclwifSlcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZGVsZXRlIGFsbCBpbmZvcm1hdGlvbnM6ICR7KHJlcy5zdGF0dXMrXCIgXCIrcmVzLnN0YXR1c1RleHQrXCIgXCIrYXdhaXQgcmVzLnRleHQoKSl9YClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmluZm8oYFN1Y2Nlc2Z1bGx5IGRlbGV0ZWQgaW5mb3JtYXRpb25zLmApXHJcbiAgICAgICAgICAgIEJkQXBpLnNob3dUb2FzdChcIlN1Y2Nlc2Z1bGx5IGRlbGV0ZWQgaW5mb3JtYXRpb25zXCIsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pXHJcbiAgICAgICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQXBpLkF1dGhvcml6YXRpb24gPSBudWxsXHJcbiAgICAgICAgICAgIHJldHVybiByZXMuanNvbigpXHJcbiAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgICBCZEFwaS5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkLCBjb3VsZG4ndCBkZWxldGUgaW5mb3JtYXRpb25zLiBTZWUgY29uc29sZSBmb3IgbW9yZSBpbmZvc1wiLCB7dHlwZTogXCJlcnJvclwifSlcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBkZWxldGUgYWxsIGluZm9ybWF0aW9uczogJHtlcnIuc3RhY2t9YClcclxuICAgICAgICB9KVxyXG4gICAgfSovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgY3VzdG9tIGJhZGdlcyBmcm9tIHRoZSB1c2VyIElELlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXIgVGhlIHVzZXIgSUQgXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb25zdGFudHNbXCJiYWRnZXNcIl0+fVxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXRCYWRnZXModXNlcil7XHJcbiAgICAgICAgaWYodGhpcy5jYWNoZS5iYWRnZXNbdXNlcl0pcmV0dXJuIHRoaXMuY2FjaGUuYmFkZ2VzW3VzZXJdXHJcbiAgICAgICAgaWYoYXdhaXRpbmdCYWRnZXNQcm9taXNlc1t1c2VyXSlyZXR1cm4gYXdhaXRpbmdCYWRnZXNQcm9taXNlc1t1c2VyXVxyXG5cclxuICAgICAgICBsZXQgcmVzb2x2ZVxyXG4gICAgICAgIGNvbnN0IG5ld1Byb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzKSA9PiAocmVzb2x2ZSA9IHJlcykpXHJcbiAgICAgICAgYXdhaXRpbmdCYWRnZXNQcm9taXNlc1t1c2VyXSA9IG5ld1Byb21pc2VcclxuXHJcbiAgICAgICAgY29uc3QgYmFkZ2VzID0gW11cclxuICAgICAgICBmb3IobGV0IGJhZGdlIG9mIENvbnN0YW50cy5iYWRnZXMpe1xyXG4gICAgICAgICAgICBpZihiYWRnZS5kZWZhdWx0VXNlcnMuaW5jbHVkZXModXNlcikpYmFkZ2VzLnB1c2goYmFkZ2UpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZldGNoZWRCYWRnZXMgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICBpZighc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtNVwiXSlyZXR1cm4gcmVzb2x2ZShbXSlcclxuICAgICAgICAgICAgYmFkZ2VzVG9GZXRjaC5wdXNoKFt1c2VyLCByZXNvbHZlXSlcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdXNlcnMgPSBiYWRnZXNUb0ZldGNoXHJcbiAgICAgICAgICAgICAgICBpZih1c2Vycy5sZW5ndGggPT09IDApcmV0dXJuXHJcbiAgICAgICAgICAgICAgICBiYWRnZXNUb0ZldGNoID0gW11cclxuICAgICAgICAgICAgICAgIGhhbmRsZVJlcXVlc3QoUm91dGVzLmJhZGdlcywgXCJQT1NUXCIsIEpTT04uc3RyaW5naWZ5KHVzZXJzLm1hcChlID0+IGVbMF0pKSlcclxuICAgICAgICAgICAgICAgIC50aGVuKGFzeW5jIHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXsvLyBDb3VsZG4ndCBmZXRjaCBiYWRnZXM6IHNlcnZlciBlcnJvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2Vycy5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXShbXSkvLyByZXNvbHZlIG5vIGJhZGdlIGZldGNoZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VCb2R5ID0gYXdhaXQgcmVzLmpzb24oKVxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgdXNlciBvZiByZXNwb25zZUJvZHkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbWlzZSA9IHVzZXJzLmZpbmQocHJvbWlzZSA9PiBwcm9taXNlWzBdID09PSB1c2VyLnVzZXJfaWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VbMV0odXNlci5iYWRnZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4gey8vIENvdWxkbid0IGZldGNoIGJhZGdlczogZXJyb3JcclxuICAgICAgICAgICAgICAgICAgICBpZighKGVyciBpbnN0YW5jZW9mIExpZ2h0Y29yZEVycm9yKSljb25zb2xlLmVycm9yKGVycilcclxuICAgICAgICAgICAgICAgICAgICB1c2Vycy5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdKFtdKS8vIHJlc29sdmUgbm8gYmFkZ2UgZmV0Y2hlZFxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9LCAwKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgZm9yKGxldCBiYWRnZSBvZiBmZXRjaGVkQmFkZ2VzKXtcclxuICAgICAgICAgICAgaWYoIUNvbnN0YW50cy5iYWRnZXMuZmluZChlID0+IGUuaWQgPT09IGJhZGdlKSljb250aW51ZSAvLyBXZSBkbyBub3QgaGF2ZSB0aGUgQ29tcG9uZW50LCBza2lwIGl0LlxyXG4gICAgICAgICAgICBpZihiYWRnZXMuZmluZChlID0+IGUuaWQgPT09IGJhZGdlKSljb250aW51ZSAvLyBBbHJlYWR5IGluc2VydGVkLlxyXG4gICAgICAgICAgICBiYWRnZXMucHVzaChDb25zdGFudHMuYmFkZ2VzLmZpbmQoZSA9PiBlLmlkID09PSBiYWRnZSkpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2FjaGUgPSB7XHJcbiAgICAgICAgICAgIGJhZGdlczogT2JqZWN0LmFzc2lnbih0aGlzLmNhY2hlLmJhZGdlcywge1t1c2VyXTogYmFkZ2VzfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlLmJhZGdlc1t1c2VyXVxyXG4gICAgICAgIH0sIDYwMDAwMCk7XHJcblxyXG4gICAgICAgIHJlc29sdmUoYmFkZ2VzKVxyXG4gICAgICAgIGRlbGV0ZSBhd2FpdGluZ0JhZGdlc1Byb21pc2VzW3VzZXJdXHJcbiAgICAgICAgcmV0dXJuIGJhZGdlc1xyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGVSZXF1ZXN0ID0gZnVuY3Rpb24ocm91dGUsIG1ldGhvZCwgZGF0YSl7XHJcbiAgICBpZighc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtNVwiXSl7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBMaWdodGNvcmRFcnJvcihcIlRoZSBjdXJyZW50IHNldHRpbmdzIGJsb2NrZWQgdGhlIHJlcXVlc3QuXCIpKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5vZGVGZXRjaChgJHtDb25zdGFudHMuU0VSVkVSX1VSTH0vYXBpL3YxJHtyb3V0ZX1gLCB7XHJcbiAgICAgICAgbWV0aG9kLFxyXG4gICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgXCJDTElFTlRcIjogXCJMaWdodGNvcmRcIixcclxuICAgICAgICAgICAgXCJBdXRob3JpemF0aW9uXCI6IHdpbmRvdy5MaWdodGNvcmQuQXBpLkF1dGhvcml6YXRpb24gfHwgXCJOb25lOjpBbm9ueW1vdXNcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLi4uKGRhdGEgPyB7XHJcbiAgICAgICAgICAgIGJvZHk6IGRhdGFcclxuICAgICAgICB9IDoge30pXHJcbiAgICB9KVxyXG59XHJcblxyXG5jbGFzcyBMaWdodGNvcmRFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKVxyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiTGlnaHRjb3JkRXJyb3JcIlxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgQ29uc3RhbnRzID0ge1xyXG4gICAgU0VSVkVSX1VSTDogXCJodHRwczovL2xpZ2h0Y29yZC5kZXJva3UueHl6XCIsXHJcbiAgICBiYWRnZXM6IFsgLy8gVE9ETzogQWRkIG1vcmUgYmFkZ2VzICsgc2VydmVyIHNpZGUgc3ZnXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiBcIkxpZ2h0Y29yZCBCdWcgSHVudGVyXCIsXHJcbiAgICAgICAgICAgIGlkOiBcImYwNDY5OGY1LTgxNmItNDFlMy1iZDAxLTkyMjkxMTkzZDdhNVwiLFxyXG4gICAgICAgICAgICBkZWZhdWx0VXNlcnM6IFtcclxuICAgICAgICAgICAgICAgIFwiNjk2NDgxMTk0NDQzMDE0MTc0XCIsXHJcbiAgICAgICAgICAgICAgICBcIjY5NjAwMzQ1NjYxMTM4NTM5NlwiXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIHNjb3BlczogW10sXHJcbiAgICAgICAgICAgIGNvbXBvbmVudDogQnVnSHVudGVyQmFkZ2UsXHJcbiAgICAgICAgICAgIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL2xpZ2h0Y29yZC9saWdodGNvcmQvd2lraS9iYWRnZXMjYnVnX2h1bnRlclwiXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICBuYW1lOiBcIkJ1ZmZvb25cIixcclxuICAgICAgICAgICAgaWQ6IFwiMDY5MDRkMzEtNjViNC00MWVjLWE1MGMtODY1OGJiZDFhZjk2XCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHRVc2VyczogW1xyXG4gICAgICAgICAgICAgICAgXCIzODkwMTY4OTU1NDM3MDU2MDJcIixcclxuICAgICAgICAgICAgICAgIFwiNjY0NjAwMTM0NTI4NjYzNTY1XCIsXHJcbiAgICAgICAgICAgICAgICBcIjYyNTM1MDY1NzgyOTg5NjIyNFwiXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIHNjb3BlczogW10sXHJcbiAgICAgICAgICAgIGNvbXBvbmVudDogQ2lyY3VzLFxyXG4gICAgICAgICAgICBocmVmOiBcImh0dHBzOi8veW91dHUuYmUvRUp0YjZ6LWRsVDg/dD0xNDVcIlxyXG4gICAgICAgIH1cclxuICAgIF1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFJvdXRlcyA9IHtcclxuICAgIGJhZGdlczogYC91c2Vycy9iYWRnZXNgXHJcbn0iLCIvKipcclxuICogQ29weXJpZ2h0IDIwMTggWmFjaGFyeSBSYXVlblxyXG4gKlxyXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmdcclxuICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksXHJcbiAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXHJcbiAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXHJcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWRcclxuICogdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxyXG4gKlxyXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcclxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuICpcclxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELFxyXG4gKiBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQVxyXG4gKiBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUXHJcbiAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRlxyXG4gKiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkVcclxuICogT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXHJcbiAqIFxyXG4gKiBGcm9tOiBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CRFBsdWdpbkxpYnJhcnlcclxuICovXHJcblxyXG4vKipcclxuICogQGludGVyZmFjZVxyXG4gKiBAbmFtZSBPZmZzZXRcclxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRvcCAtIFRvcCBvZmZzZXQgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gcmlnaHQgLSBSaWdodCBvZmZzZXQgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gYm90dG9tIC0gQm90dG9tIG9mZnNldCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZWZ0IC0gTGVmdCBvZmZzZXQgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gaGVpZ2h0IC0gT3V0ZXIgaGVpZ2h0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IHdpZHRoIC0gT3V0ZXIgd2lkdGggb2YgdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gKi9cclxuXHJcbiAvKipcclxuICogRnVuY3Rpb24gdGhhdCBhdXRvbWF0aWNhbGx5IHJlbW92ZXMgYWRkZWQgbGlzdGVuZXIuXHJcbiAqIEBjYWxsYmFjayBtb2R1bGU6RE9NVG9vbHN+Q2FuY2VsTGlzdGVuZXJcclxuICovXHJcbiBcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRE9NVG9vbHMge1xyXG5cclxuICAgIHN0YXRpYyBlc2NhcGVJRChpZCkge1xyXG4gICAgICAgIHJldHVybiBpZC5yZXBsYWNlKC9eW15hLXpdK3xbXlxcdy1dKy9naSwgXCItXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG5cdCAqIEFkZHMgYSBzdHlsZSB0byB0aGUgZG9jdW1lbnQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gaWRlbnRpZmllciB0byB1c2UgYXMgdGhlIGVsZW1lbnQgaWRcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY3NzIC0gY3NzIHRvIGFkZCB0byB0aGUgZG9jdW1lbnRcclxuXHQgKi9cclxuXHRzdGF0aWMgYWRkU3R5bGUoaWQsIGNzcykge1xyXG5cdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmQoRE9NVG9vbHMuY3JlYXRlRWxlbWVudChgPHN0eWxlIGlkPVwiJHtpZH1cIj4ke2Nzc308L3N0eWxlPmApKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZXMgYSBzdHlsZSBmcm9tIHRoZSBkb2N1bWVudC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBvcmlnaW5hbCBpZGVudGlmaWVyIHVzZWRcclxuXHQgKi9cclxuXHRzdGF0aWMgcmVtb3ZlU3R5bGUoaWQpIHtcclxuXHRcdGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XHJcblx0XHRpZiAoZWxlbWVudCkgZWxlbWVudC5yZW1vdmUoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMvcmVxdWlyZXMgYSByZW1vdGUgc2NyaXB0IHRvIGJlIGxvYWRlZFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIGlkZW50aWZpZXIgdG8gdXNlIGZvciB0aGlzIHNjcmlwdFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSB1cmwgZnJvbSB3aGljaCB0byBsb2FkIHRoZSBzY3JpcHRcclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNjcmlwdCBpcyBsb2FkZWRcclxuXHQgKi9cclxuXHRzdGF0aWMgYWRkU2NyaXB0KGlkLCB1cmwpIHtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuXHRcdFx0Y29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcclxuXHRcdFx0c2NyaXB0LmlkID0gaWQ7XHJcblx0XHRcdHNjcmlwdC5zcmMgPSB1cmw7XHJcblx0XHRcdHNjcmlwdC50eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIjtcclxuXHRcdFx0c2NyaXB0Lm9ubG9hZCA9IHJlc29sdmU7XHJcblx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kKHNjcmlwdCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZXMgYSByZW1vdGUgc2NyaXB0IGZyb20gdGhlIGRvY3VtZW50LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIG9yaWdpbmFsIGlkZW50aWZpZXIgdXNlZFxyXG5cdCAqL1xyXG5cdHN0YXRpYyByZW1vdmVTY3JpcHQoaWQpIHtcclxuICAgICAgICBpZCA9IHRoaXMuZXNjYXBlSUQoaWQpO1xyXG5cdFx0Y29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcclxuXHRcdGlmIChlbGVtZW50KSBlbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBodHRwczovL2phdmFzY3JpcHQuaW5mby9qcy1hbmltYXRpb25cclxuICAgIHN0YXRpYyBhbmltYXRlKHt0aW1pbmcgPSBfID0+IF8sIHVwZGF0ZSwgZHVyYXRpb259KSB7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcclxuICAgICAgXHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uIGFuaW1hdGUodGltZSkge1xyXG4gICAgICAgICAgLy8gdGltZUZyYWN0aW9uIGdvZXMgZnJvbSAwIHRvIDFcclxuICAgICAgICAgIGxldCB0aW1lRnJhY3Rpb24gPSAodGltZSAtIHN0YXJ0KSAvIGR1cmF0aW9uO1xyXG4gICAgICAgICAgaWYgKHRpbWVGcmFjdGlvbiA+IDEpIHRpbWVGcmFjdGlvbiA9IDE7XHJcbiAgICAgIFxyXG4gICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBjdXJyZW50IGFuaW1hdGlvbiBzdGF0ZVxyXG4gICAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSB0aW1pbmcodGltZUZyYWN0aW9uKTtcclxuICAgICAgXHJcbiAgICAgICAgICB1cGRhdGUocHJvZ3Jlc3MpOyAvLyBkcmF3IGl0XHJcbiAgICAgIFxyXG4gICAgICAgICAgaWYgKHRpbWVGcmFjdGlvbiA8IDEpIHtcclxuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICBcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpcyBteSBzaGl0IHZlcnNpb24gb2Ygbm90IGhhdmluZyB0byB1c2UgYCRgIGZyb20galF1ZXJ5LiBNZWFuaW5nXHJcbiAgICAgKiB0aGF0IHlvdSBjYW4gcGFzcyBhIHNlbGVjdG9yIGFuZCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgcnVuIHtAbGluayBtb2R1bGU6RE9NVG9vbHMucXVlcnl9LlxyXG4gICAgICogSXQgYWxzbyBtZWFucyB0aGF0IHlvdSBjYW4gcGFzcyBhIHN0cmluZyBvZiBodG1sIGFuZCBpdCB3aWxsIHBlcmZvcm0gYW5kIHJldHVybiBgcGFyc2VIVE1MYC5cclxuICAgICAqIEBzZWUgbW9kdWxlOkRPTVRvb2xzLnBhcnNlSFRNTFxyXG4gICAgICogQHNlZSBtb2R1bGU6RE9NVG9vbHMucXVlcnlcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHF1ZXJ5IG9yIEhUTUwgdG8gcGFyc2VcclxuICAgICAqIEByZXR1cm5zIHsoRG9jdW1lbnRGcmFnbWVudHxOb2RlTGlzdHxIVE1MRWxlbWVudCl9IC0gRWl0aGVyIHRoZSByZXN1bHQgb2YgYHBhcnNlSFRNTGAgb3IgYHF1ZXJ5YFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgUShzZWxlY3Rvcikge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnBhcnNlSFRNTChzZWxlY3Rvcik7XHJcbiAgICAgICAgY29uc3QgaXNIVE1MID0gZWxlbWVudCBpbnN0YW5jZW9mIE5vZGVMaXN0ID8gQXJyYXkuZnJvbShlbGVtZW50KS5zb21lKG4gPT4gbi5ub2RlVHlwZSA9PT0gMSkgOiBlbGVtZW50Lm5vZGVUeXBlID09PSAxO1xyXG4gICAgICAgIGlmIChpc0hUTUwpIHJldHVybiBlbGVtZW50O1xyXG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5KHNlbGVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVzc2VudGlhbGx5IGEgc2hvcnRoYW5kIGZvciBgZG9jdW1lbnQucXVlcnlTZWxlY3RvcmAuIElmIHRoZSBgYmFzZUVsZW1lbnRgIGlzIG5vdCBwcm92aWRlZFxyXG4gICAgICogYGRvY3VtZW50YCBpcyB1c2VkIGJ5IGRlZmF1bHQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBxdWVyeVxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBbYmFzZUVsZW1lbnRdIC0gRWxlbWVudCB0byBiYXNlIHRoZSBxdWVyeSBmcm9tXHJcbiAgICAgKiBAcmV0dXJucyB7KEVsZW1lbnR8bnVsbCl9IC0gVGhlIGZvdW5kIGVsZW1lbnQgb3IgbnVsbCBpZiBub3QgZm91bmRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHF1ZXJ5KHNlbGVjdG9yLCBiYXNlRWxlbWVudCkge1xyXG4gICAgICAgIGlmICghYmFzZUVsZW1lbnQpIGJhc2VFbGVtZW50ID0gZG9jdW1lbnQ7XHJcbiAgICAgICAgcmV0dXJuIGJhc2VFbGVtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXNzZW50aWFsbHkgYSBzaG9ydGhhbmQgZm9yIGBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsYC4gSWYgdGhlIGBiYXNlRWxlbWVudGAgaXMgbm90IHByb3ZpZGVkXHJcbiAgICAgKiBgZG9jdW1lbnRgIGlzIHVzZWQgYnkgZGVmYXVsdC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHF1ZXJ5XHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IFtiYXNlRWxlbWVudF0gLSBFbGVtZW50IHRvIGJhc2UgdGhlIHF1ZXJ5IGZyb21cclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBBcnJheSBvZiBhbGwgZm91bmQgZWxlbWVudHNcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHF1ZXJ5QWxsKHNlbGVjdG9yLCBiYXNlRWxlbWVudCkge1xyXG4gICAgICAgIGlmICghYmFzZUVsZW1lbnQpIGJhc2VFbGVtZW50ID0gZG9jdW1lbnQ7XHJcbiAgICAgICAgcmV0dXJuIGJhc2VFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFyc2VzIGEgc3RyaW5nIG9mIEhUTUwgYW5kIHJldHVybnMgdGhlIHJlc3VsdHMuIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHRydWUsXHJcbiAgICAgKiB0aGUgcGFyc2VkIEhUTUwgd2lsbCBiZSByZXR1cm5lZCBhcyBhIGRvY3VtZW50IGZyYWdtZW50IHtAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Eb2N1bWVudEZyYWdtZW50fS5cclxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIGxpc3Qgb2YgZWxlbWVudHMgYXQgdGhlIHRvcCBsZXZlbCwgdGhleSBjYW4gdGhlbiBiZSBhcHBlbmRlZCBhbGwgYXQgb25jZSB0byBhbm90aGVyIG5vZGUuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIGZhbHNlLCB0aGVuIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSB0aGUgbGlzdCBvZiBwYXJzZWRcclxuICAgICAqIG5vZGVzIGFuZCB0aGVyZSB3ZXJlIG11bHRpcGxlIHRvcCBsZXZlbCBub2Rlcywgb3RoZXJ3aXNlIHRoZSBzaW5nbGUgbm9kZSBpcyByZXR1cm5lZC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBodG1sIC0gSFRNTCB0byBiZSBwYXJzZWRcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZyYWdtZW50PWZhbHNlXSAtIFdoZXRoZXIgb3Igbm90IHRoZSByZXR1cm4gc2hvdWxkIGJlIHRoZSByYXcgYERvY3VtZW50RnJhZ21lbnRgXHJcbiAgICAgKiBAcmV0dXJucyB7KERvY3VtZW50RnJhZ21lbnR8Tm9kZUxpc3R8SFRNTEVsZW1lbnQpfSAtIFRoZSByZXN1bHQgb2YgSFRNTCBwYXJzaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwYXJzZUhUTUwoaHRtbCwgZnJhZ21lbnQgPSBmYWxzZSkge1xyXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xyXG4gICAgICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGh0bWw7XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRlbXBsYXRlLmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpO1xyXG4gICAgICAgIGlmIChmcmFnbWVudCkgcmV0dXJuIG5vZGU7XHJcbiAgICAgICAgcmV0dXJuIG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggPiAxID8gbm9kZS5jaGlsZE5vZGVzIDogbm9kZS5jaGlsZE5vZGVzWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBBbHRlcm5hdGUgbmFtZSBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5wYXJzZUhUTUx9ICovXHJcbiAgICBzdGF0aWMgY3JlYXRlRWxlbWVudChodG1sLCBmcmFnbWVudCA9IGZhbHNlKSB7cmV0dXJuIHRoaXMucGFyc2VIVE1MKGh0bWwsIGZyYWdtZW50KTt9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgYSBzdHJpbmcgb2YgaHRtbCBhbmQgZXNjYXBlcyBpdCB1c2luZyB0aGUgYnJvd2VyJ3Mgb3duIGVzY2FwaW5nIG1lY2hhbmlzbS5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sIC0gaHRtbCB0byBiZSBlc2NhcGVkXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBlc2NhcGVIVE1MKGh0bWwpIHtcclxuICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpO1xyXG4gICAgICAgIGNvbnN0IHNwYW5FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XHJcbiAgICAgICAgc3BhbkVsZW1lbnQuYXBwZW5kKHRleHROb2RlKTtcclxuICAgICAgICB0ZXh0Tm9kZS5ub2RlVmFsdWUgPSBodG1sO1xyXG4gICAgICAgIHJldHVybiBzcGFuRWxlbWVudC5pbm5lckhUTUw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbGlzdCBvZiBjbGFzc2VzIGZyb20gdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcclxuICAgICAqIEBwYXJhbSB7Li4uc3RyaW5nfSBjbGFzc2VzIC0gTmFtZXMgb2YgY2xhc3NlcyB0byBhZGRcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIGBlbGVtZW50YCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGFkZENsYXNzKGVsZW1lbnQsIC4uLmNsYXNzZXMpIHtcclxuICAgICAgICBjbGFzc2VzID0gY2xhc3Nlcy5mbGF0KCkuZmlsdGVyKGMgPT4gYyk7XHJcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjbGFzc2VzLmxlbmd0aDsgYysrKSBjbGFzc2VzW2NdID0gY2xhc3Nlc1tjXS50b1N0cmluZygpLnNwbGl0KFwiIFwiKTtcclxuICAgICAgICBjbGFzc2VzID0gY2xhc3Nlcy5mbGF0KCkuZmlsdGVyKGMgPT4gYyk7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKC4uLmNsYXNzZXMpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIGxpc3Qgb2YgY2xhc3NlcyBmcm9tIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZWRpdCBjbGFzc2VzIG9mXHJcbiAgICAgKiBAcGFyYW0gey4uLnN0cmluZ30gY2xhc3NlcyAtIE5hbWVzIG9mIGNsYXNzZXMgdG8gcmVtb3ZlXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBgZWxlbWVudGAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyByZW1vdmVDbGFzcyhlbGVtZW50LCAuLi5jbGFzc2VzKSB7XHJcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjbGFzc2VzLmxlbmd0aDsgYysrKSBjbGFzc2VzW2NdID0gY2xhc3Nlc1tjXS50b1N0cmluZygpLnNwbGl0KFwiIFwiKTtcclxuICAgICAgICBjbGFzc2VzID0gY2xhc3Nlcy5mbGF0KCkuZmlsdGVyKGMgPT4gYyk7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKC4uLmNsYXNzZXMpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hlbiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwcmVzZW50OiBUb2dnbGUgY2xhc3MgdmFsdWU7XHJcbiAgICAgKiBpLmUuLCBpZiBjbGFzcyBleGlzdHMgdGhlbiByZW1vdmUgaXQgYW5kIHJldHVybiBmYWxzZSwgaWYgbm90LCB0aGVuIGFkZCBpdCBhbmQgcmV0dXJuIHRydWUuXHJcbiAgICAgKiBXaGVuIGEgc2Vjb25kIGFyZ3VtZW50IGlzIHByZXNlbnQ6XHJcbiAgICAgKiBJZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGV2YWx1YXRlcyB0byB0cnVlLCBhZGQgc3BlY2lmaWVkIGNsYXNzIHZhbHVlLCBhbmQgaWYgaXQgZXZhbHVhdGVzIHRvIGZhbHNlLCByZW1vdmUgaXQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGVkaXQgY2xhc3NlcyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzbmFtZSAtIE5hbWUgb2YgY2xhc3MgdG8gdG9nZ2xlXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbmRpY2F0b3JdIC0gT3B0aW9uYWwgaW5kaWNhdG9yIGZvciBpZiB0aGUgY2xhc3Mgc2hvdWxkIGJlIHRvZ2dsZWRcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIGBlbGVtZW50YCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHRvZ2dsZUNsYXNzKGVsZW1lbnQsIGNsYXNzbmFtZSwgaW5kaWNhdG9yKSB7XHJcbiAgICAgICAgY2xhc3NuYW1lID0gY2xhc3NuYW1lLnRvU3RyaW5nKCkuc3BsaXQoXCIgXCIpLmZpbHRlcihjID0+IGMpO1xyXG4gICAgICAgIGlmICh0eXBlb2YoaW5kaWNhdG9yKSAhPT0gXCJ1bmRlZmluZWRcIikgY2xhc3NuYW1lLmZvckVhY2goYyA9PiBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoYywgaW5kaWNhdG9yKSk7XHJcbiAgICAgICAgZWxzZSBjbGFzc25hbWUuZm9yRWFjaChjID0+IGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShjKSk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgYW4gZWxlbWVudCBoYXMgYSBzcGVjaWZpYyBjbGFzc1xyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc25hbWUgLSBOYW1lIG9mIGNsYXNzIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBgdHJ1ZWAgaWYgdGhlIGVsZW1lbnQgaGFzIHRoZSBjbGFzcywgYGZhbHNlYCBvdGhlcndpc2UuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBoYXNDbGFzcyhlbGVtZW50LCBjbGFzc25hbWUpIHtcclxuICAgICAgICByZXR1cm4gY2xhc3NuYW1lLnRvU3RyaW5nKCkuc3BsaXQoXCIgXCIpLmZpbHRlcihjID0+IGMpLmV2ZXJ5KGMgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoYykpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVwbGFjZXMgb25lIGNsYXNzIHdpdGggYW5vdGhlclxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvbGROYW1lIC0gTmFtZSBvZiBjbGFzcyB0byByZXBsYWNlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3TmFtZSAtIE5ldyBuYW1lIGZvciB0aGUgY2xhc3NcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIGBlbGVtZW50YCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHJlcGxhY2VDbGFzcyhlbGVtZW50LCBvbGROYW1lLCBuZXdOYW1lKSB7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVwbGFjZShvbGROYW1lLCBuZXdOYW1lKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGVuZHMgYHRoaXNOb2RlYCB0byBgdGhhdE5vZGVgXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoaXNOb2RlIC0gTm9kZSB0byBiZSBhcHBlbmRlZCB0byBhbm90aGVyIG5vZGVcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhhdE5vZGUgLSBOb2RlIGZvciBgdGhpc05vZGVgIHRvIGJlIGFwcGVuZGVkIHRvXHJcbiAgICAgKiBAcmV0dXJucyB7Tm9kZX0gLSBgdGhpc05vZGVgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYXBwZW5kVG8odGhpc05vZGUsIHRoYXROb2RlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih0aGF0Tm9kZSkgPT0gXCJzdHJpbmdcIikgdGhhdE5vZGUgPSB0aGlzLnF1ZXJ5KHRoYXROb2RlKTtcclxuICAgICAgICBpZiAoIXRoYXROb2RlKSByZXR1cm4gbnVsbDtcclxuICAgICAgICB0aGF0Tm9kZS5hcHBlbmQodGhpc05vZGUpO1xyXG4gICAgICAgIHJldHVybiB0aGlzTm9kZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByZXBlbmRzIGB0aGlzTm9kZWAgdG8gYHRoYXROb2RlYFxyXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGlzTm9kZSAtIE5vZGUgdG8gYmUgcHJlcGVuZGVkIHRvIGFub3RoZXIgbm9kZVxyXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGF0Tm9kZSAtIE5vZGUgZm9yIGB0aGlzTm9kZWAgdG8gYmUgcHJlcGVuZGVkIHRvXHJcbiAgICAgKiBAcmV0dXJucyB7Tm9kZX0gLSBgdGhpc05vZGVgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcHJlcGVuZFRvKHRoaXNOb2RlLCB0aGF0Tm9kZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YodGhhdE5vZGUpID09IFwic3RyaW5nXCIpIHRoYXROb2RlID0gdGhpcy5xdWVyeSh0aGF0Tm9kZSk7XHJcbiAgICAgICAgaWYgKCF0aGF0Tm9kZSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgdGhhdE5vZGUucHJlcGVuZCh0aGlzTm9kZSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNOb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5zZXJ0IGFmdGVyIGEgc3BlY2lmaWMgZWxlbWVudCwgc2ltaWxhciB0byBqUXVlcnkncyBgdGhpc0VsZW1lbnQuaW5zZXJ0QWZ0ZXIob3RoZXJFbGVtZW50KWAuXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoaXNOb2RlIC0gVGhlIG5vZGUgdG8gaW5zZXJ0XHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldE5vZGUgLSBOb2RlIHRvIGluc2VydCBhZnRlciBpbiB0aGUgdHJlZVxyXG4gICAgICogQHJldHVybnMge05vZGV9IC0gYHRoaXNOb2RlYCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGluc2VydEFmdGVyKHRoaXNOb2RlLCB0YXJnZXROb2RlKSB7XHJcbiAgICAgICAgdGFyZ2V0Tm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzTm9kZSwgdGFyZ2V0Tm9kZS5uZXh0U2libGluZyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNOb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5zZXJ0IGFmdGVyIGEgc3BlY2lmaWMgZWxlbWVudCwgc2ltaWxhciB0byBqUXVlcnkncyBgdGhpc0VsZW1lbnQuYWZ0ZXIobmV3RWxlbWVudClgLlxyXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGlzTm9kZSAtIFRoZSBub2RlIHRvIGluc2VydFxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBuZXdOb2RlIC0gTm9kZSB0byBpbnNlcnQgYWZ0ZXIgaW4gdGhlIHRyZWVcclxuICAgICAqIEByZXR1cm5zIHtOb2RlfSAtIGB0aGlzTm9kZWAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBhZnRlcih0aGlzTm9kZSwgbmV3Tm9kZSkge1xyXG4gICAgICAgIHRoaXNOb2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIHRoaXNOb2RlLm5leHRTaWJsaW5nKTtcclxuICAgICAgICByZXR1cm4gdGhpc05vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIG5leHQgc2libGluZyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcj1cIlwiXSAtIE9wdGlvbmFsIHNlbGVjdG9yXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBUaGUgc2libGluZyBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBuZXh0KGVsZW1lbnQsIHNlbGVjdG9yID0gXCJcIikge1xyXG4gICAgICAgIHJldHVybiBzZWxlY3RvciA/IGVsZW1lbnQucXVlcnlTZWxlY3RvcihcIisgXCIgKyBzZWxlY3RvcikgOiBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYWxsIHN1YnNlcXVlbnQgc2libGluZ3MuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBuZXh0IHNpYmxpbmdzIG9mXHJcbiAgICAgKiBAcmV0dXJucyB7Tm9kZUxpc3R9IC0gVGhlIGxpc3Qgb2Ygc2libGluZ3NcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG5leHRBbGwoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJ+ICpcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBzdWJzZXF1ZW50IHNpYmxpbmdzIHVudGlsIGFuIGVsZW1lbnQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCB0aGUgZm9sbG93aW5nIHNpYmxpbmdzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBzdG9wIGF0XHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2Ygc2libGluZ3NcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG5leHRVbnRpbChlbGVtZW50LCBzZWxlY3Rvcikge1xyXG4gICAgICAgIGNvbnN0IG5leHQgPSBbXTsgXHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nICYmICFlbGVtZW50Lm5leHRFbGVtZW50U2libGluZy5tYXRjaGVzKHNlbGVjdG9yKSkgbmV4dC5wdXNoKGVsZW1lbnQgPSBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICAgICAgcmV0dXJuIG5leHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBwcmV2aW91cyBzaWJsaW5nIGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3Rvci5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBwcmV2aW91cyBzaWJsaW5nIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiXCJdIC0gT3B0aW9uYWwgc2VsZWN0b3JcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIFRoZSBzaWJsaW5nIGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHByZXZpb3VzKGVsZW1lbnQsIHNlbGVjdG9yID0gXCJcIikge1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xyXG4gICAgICAgIGlmIChzZWxlY3RvcikgcmV0dXJuIHByZXZpb3VzICYmIHByZXZpb3VzLm1hdGNoZXMoc2VsZWN0b3IpID8gcHJldmlvdXMgOiBudWxsO1xyXG4gICAgICAgIHJldHVybiBwcmV2aW91cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYWxsIHByZWNlZWRpbmcgc2libGluZ3MuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBwcmVjZWVkaW5nIHNpYmxpbmdzIG9mXHJcbiAgICAgKiBAcmV0dXJucyB7Tm9kZUxpc3R9IC0gVGhlIGxpc3Qgb2Ygc2libGluZ3NcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHByZXZpb3VzQWxsKGVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBwcmV2aW91cyA9IFtdO1xyXG4gICAgICAgIHdoaWxlIChlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcpIHByZXZpb3VzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZyk7XHJcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgcHJlY2VlZGluZyBzaWJsaW5ncyB1bnRpbCBhbiBlbGVtZW50IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIHByZWNlZWRpbmcgc2libGluZ3Mgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHN0b3AgYXRcclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcHJldmlvdXNVbnRpbChlbGVtZW50LCBzZWxlY3Rvcikge1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gW107IFxyXG4gICAgICAgIHdoaWxlIChlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcgJiYgIWVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZy5tYXRjaGVzKHNlbGVjdG9yKSkgcHJldmlvdXMucHVzaChlbGVtZW50ID0gZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKTtcclxuICAgICAgICByZXR1cm4gcHJldmlvdXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kIHdoaWNoIGluZGV4IGluIGNoaWxkcmVuIGEgY2VydGFpbiBub2RlIGlzLiBTaW1pbGFyIHRvIGpRdWVyeSdzIGAkLmluZGV4KClgXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIC0gVGhlIG5vZGUgdG8gZmluZCBpdHMgaW5kZXggaW4gcGFyZW50XHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBJbmRleCBvZiB0aGUgbm9kZVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaW5kZXhJblBhcmVudChub2RlKSB7XHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBub2RlLnBhcmVudE5vZGUuY2hpbGROb2RlcztcclxuICAgICAgICBsZXQgbnVtID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXSA9PSBub2RlKSByZXR1cm4gbnVtO1xyXG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0ubm9kZVR5cGUgPT0gMSkgbnVtKys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogU2hvcnRoYW5kIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLmluZGV4SW5QYXJlbnR9ICovXHJcbiAgICBzdGF0aWMgaW5kZXgobm9kZSkge3JldHVybiB0aGlzLmluZGV4SW5QYXJlbnQobm9kZSk7fVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgcGFyZW50IG9mIHRoZSBlbGVtZW50IGlmIGl0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLFxyXG4gICAgICogb3RoZXJ3aXNlIHJldHVybnMgbnVsbC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHBhcmVudCBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcj1cIlwiXSAtIFNlbGVjdG9yIHRvIG1hdGNoIHBhcmVudFxyXG4gICAgICogQHJldHVybnMgeyhFbGVtZW50fG51bGwpfSAtIFRoZSBzaWJsaW5nIGVsZW1lbnQgb3IgbnVsbFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcGFyZW50KGVsZW1lbnQsIHNlbGVjdG9yID0gXCJcIikge1xyXG4gICAgICAgIHJldHVybiAhc2VsZWN0b3IgfHwgZWxlbWVudC5wYXJlbnRFbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpID8gZWxlbWVudC5wYXJlbnRFbGVtZW50IDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYWxsIGNoaWxkcmVuIG9mIEVsZW1lbnQgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IgaWYgcHJvdmlkZWQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBhbGwgY2hpbGRyZW4gb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIG1hdGNoIHRoZSBjaGlsZHJlbiB0b1xyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIGNoaWxkcmVuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBmaW5kQ2hpbGQoZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiOnNjb3BlID4gXCIgKyBzZWxlY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCBjaGlsZHJlbiBvZiBFbGVtZW50IHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIGlmIHByb3ZpZGVkLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgYWxsIGNoaWxkcmVuIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBtYXRjaCB0aGUgY2hpbGRyZW4gdG9cclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBjaGlsZHJlblxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZmluZENoaWxkcmVuKGVsZW1lbnQsIHNlbGVjdG9yKSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIjpzY29wZSA+IFwiICsgc2VsZWN0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgYW5jZXN0b3JzIG9mIEVsZW1lbnQgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IgaWYgcHJvdmlkZWQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBhbGwgcGFyZW50cyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcj1cIlwiXSAtIFNlbGVjdG9yIHRvIG1hdGNoIHRoZSBwYXJlbnRzIHRvXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2YgcGFyZW50c1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcGFyZW50cyhlbGVtZW50LCBzZWxlY3RvciA9IFwiXCIpIHtcclxuICAgICAgICBjb25zdCBwYXJlbnRzID0gW107XHJcbiAgICAgICAgaWYgKHNlbGVjdG9yKSB3aGlsZSAoZWxlbWVudC5wYXJlbnRFbGVtZW50ICYmIGVsZW1lbnQucGFyZW50RWxlbWVudC5jbG9zZXN0KHNlbGVjdG9yKSkgcGFyZW50cy5wdXNoKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQuY2xvc2VzdChzZWxlY3RvcikpO1xyXG4gICAgICAgIGVsc2Ugd2hpbGUgKGVsZW1lbnQucGFyZW50RWxlbWVudCkgcGFyZW50cy5wdXNoKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQpO1xyXG4gICAgICAgIHJldHVybiBwYXJlbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgYW5jZXN0b3JzIHVudGlsIGFuIGVsZW1lbnQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCB0aGUgYW5jZXN0b3JzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBzdG9wIGF0XHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2YgcGFyZW50c1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcGFyZW50c1VudGlsKGVsZW1lbnQsIHNlbGVjdG9yKSB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50cyA9IFtdO1xyXG4gICAgICAgIHdoaWxlIChlbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgIWVsZW1lbnQucGFyZW50RWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSkgcGFyZW50cy5wdXNoKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQpO1xyXG4gICAgICAgIHJldHVybiBwYXJlbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgc2libGluZ3Mgb2YgdGhlIGVsZW1lbnQgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBhbGwgc2libGluZ3Mgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3I9XCIqXCJdIC0gU2VsZWN0b3IgdG8gbWF0Y2ggdGhlIHNpYmxpbmdzIHRvXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2Ygc2libGluZ3NcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHNpYmxpbmdzKGVsZW1lbnQsIHNlbGVjdG9yID0gXCIqXCIpIHtcclxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4pLmZpbHRlcihlID0+IGUgIT0gZWxlbWVudCAmJiBlLm1hdGNoZXMoc2VsZWN0b3IpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgb3IgZ2V0cyBjc3Mgc3R5bGVzIGZvciBhIHNwZWNpZmljIGVsZW1lbnQuIElmIGB2YWx1ZWAgaXMgcHJvdmlkZWRcclxuICAgICAqIHRoZW4gaXQgc2V0cyB0aGUgc3R5bGUgYW5kIHJldHVybnMgdGhlIGVsZW1lbnQgdG8gYWxsb3cgZm9yIGNoYWluaW5nLFxyXG4gICAgICogb3RoZXJ3aXNlIHJldHVybnMgdGhlIHN0eWxlLiAgXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHNldCB0aGUgQ1NTIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlIC0gQXR0cmlidXRlIHRvIGdldCBvciBzZXRcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdIC0gVmFsdWUgdG8gc2V0IGZvciBhdHRyaWJ1dGVcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fHN0cmluZ30gLSBXaGVuIHNldHRpbmcgYSB2YWx1ZSwgZWxlbWVudCBpcyByZXR1cm5lZCBmb3IgY2hhaW5pbmcsIG90aGVyd2lzZSB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjc3MoZWxlbWVudCwgYXR0cmlidXRlLCB2YWx1ZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YodmFsdWUpID09IFwidW5kZWZpbmVkXCIpIHJldHVybiBnbG9iYWwuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVthdHRyaWJ1dGVdO1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGVbYXR0cmlidXRlXSA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBvciBnZXRzIHRoZSB3aWR0aCBmb3IgYSBzcGVjaWZpYyBlbGVtZW50LiBJZiBgdmFsdWVgIGlzIHByb3ZpZGVkXHJcbiAgICAgKiB0aGVuIGl0IHNldHMgdGhlIHdpZHRoIGFuZCByZXR1cm5zIHRoZSBlbGVtZW50IHRvIGFsbG93IGZvciBjaGFpbmluZyxcclxuICAgICAqIG90aGVyd2lzZSByZXR1cm5zIHRoZSB3aWR0aC4gIFxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBzZXQgdGhlIENTUyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt2YWx1ZV0gLSBXaWR0aCB0byBzZXRcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fHN0cmluZ30gLSBXaGVuIHNldHRpbmcgYSB2YWx1ZSwgZWxlbWVudCBpcyByZXR1cm5lZCBmb3IgY2hhaW5pbmcsIG90aGVyd2lzZSB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyB3aWR0aChlbGVtZW50LCB2YWx1ZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YodmFsdWUpID09IFwidW5kZWZpbmVkXCIpIHJldHVybiBwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLndpZHRoKTtcclxuICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIG9yIGdldHMgdGhlIGhlaWdodCBmb3IgYSBzcGVjaWZpYyBlbGVtZW50LiBJZiBgdmFsdWVgIGlzIHByb3ZpZGVkXHJcbiAgICAgKiB0aGVuIGl0IHNldHMgdGhlIGhlaWdodCBhbmQgcmV0dXJucyB0aGUgZWxlbWVudCB0byBhbGxvdyBmb3IgY2hhaW5pbmcsXHJcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgaGVpZ2h0LiAgXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHNldCB0aGUgQ1NTIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ZhbHVlXSAtIEhlaWdodCB0byBzZXRcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fHN0cmluZ30gLSBXaGVuIHNldHRpbmcgYSB2YWx1ZSwgZWxlbWVudCBpcyByZXR1cm5lZCBmb3IgY2hhaW5pbmcsIG90aGVyd2lzZSB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBoZWlnaHQoZWxlbWVudCwgdmFsdWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5oZWlnaHQpO1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBpbm5lciB0ZXh0IG9mIGFuIGVsZW1lbnQgaWYgZ2l2ZW4gYSB2YWx1ZSwgb3RoZXJ3aXNlIHJldHVybnMgaXQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHNldCB0aGUgdGV4dCBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt0ZXh0XSAtIENvbnRlbnQgdG8gc2V0XHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEVpdGhlciB0aGUgc3RyaW5nIHNldCBieSB0aGlzIGNhbGwgb3IgdGhlIGN1cnJlbnQgdGV4dCBjb250ZW50IG9mIHRoZSBub2RlLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgdGV4dChlbGVtZW50LCB0ZXh0KSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih0ZXh0KSA9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZWxlbWVudC50ZXh0Q29udGVudDtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC50ZXh0Q29udGVudCA9IHRleHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBpbm5lcldpZHRoIG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byByZXRyaWV2ZSBpbm5lciB3aWR0aCBvZlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSAtIFRoZSBpbm5lciB3aWR0aCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGlubmVyV2lkdGgoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50LmNsaWVudFdpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgaW5uZXJIZWlnaHQgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJldHJpZXZlIGlubmVyIGhlaWdodCBvZlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSAtIFRoZSBpbm5lciBoZWlnaHQgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBpbm5lckhlaWdodChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgb3V0ZXJXaWR0aCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gcmV0cmlldmUgb3V0ZXIgd2lkdGggb2ZcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gLSBUaGUgb3V0ZXIgd2lkdGggb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBvdXRlcldpZHRoKGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG91dGVySGVpZ2h0IG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byByZXRyaWV2ZSBvdXRlciBoZWlnaHQgb2ZcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gLSBUaGUgb3V0ZXIgaGVpZ2h0IG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb3V0ZXJIZWlnaHQoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIG9mZnNldCBvZiB0aGUgZWxlbWVudCBpbiB0aGUgcGFnZS5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IG9mZnNldCBvZlxyXG4gICAgICogQHJldHVybiB7T2Zmc2V0fSAtIFRoZSBvZmZzZXQgb2YgdGhlIGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG9mZnNldChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBsaXN0ZW5lcnMoKSB7IHJldHVybiB0aGlzLl9saXN0ZW5lcnMgfHwgKHRoaXMuX2xpc3RlbmVycyA9IHt9KTsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpcyBzaW1pbGFyIHRvIGpRdWVyeSdzIGBvbmAgZnVuY3Rpb24gYW5kIGNhbiAqaG9wZWZ1bGx5KiBiZSB1c2VkIGluIHRoZSBzYW1lIHdheS5cclxuICAgICAqIFxyXG4gICAgICogUmF0aGVyIHRoYW4gYXR0ZW1wdCB0byBleHBsYWluLCBJJ2xsIHNob3cgc29tZSBleGFtcGxlIHVzYWdlcy5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIGFkZCBhIGNsaWNrIGxpc3RlbmVyIChpbiB0aGUgYG15UGx1Z2luYCBuYW1lc3BhY2UpIHRvIGBlbGVtZW50YC5cclxuICAgICAqIGBET01Ub29scy5vbihlbGVtZW50LCBcImNsaWNrLm15UGx1Z2luXCIsICgpID0+IHtjb25zb2xlLmxvZyhcImNsaWNrZWQhXCIpO30pO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIGFkZCBhIGNsaWNrIGxpc3RlbmVyIChpbiB0aGUgYG15UGx1Z2luYCBuYW1lc3BhY2UpIHRvIGBlbGVtZW50YCB0aGF0IG9ubHkgZmlyZXMgd2hlbiB0aGUgdGFyZ2V0IGlzIGEgYC5ibG9ja2AgZWxlbWVudC5cclxuICAgICAqIGBET01Ub29scy5vbihlbGVtZW50LCBcImNsaWNrLm15UGx1Z2luXCIsIFwiLmJsb2NrXCIsICgpID0+IHtjb25zb2xlLmxvZyhcImNsaWNrZWQhXCIpO30pO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIGFkZCBhIGNsaWNrIGxpc3RlbmVyICh3aXRob3V0IG5hbWVzcGFjZSkgdG8gYGVsZW1lbnRgLlxyXG4gICAgICogYERPTVRvb2xzLm9uKGVsZW1lbnQsIFwiY2xpY2tcIiwgKCkgPT4ge2NvbnNvbGUubG9nKFwiY2xpY2tlZCFcIik7fSk7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYWRkIGEgY2xpY2sgbGlzdGVuZXIgKHdpdGhvdXQgbmFtZXNwYWNlKSB0byBgZWxlbWVudGAgdGhhdCBvbmx5IGZpcmVzIG9uY2UuXHJcbiAgICAgKiBgY29uc3QgY2FuY2VsID0gRE9NVG9vbHMub24oZWxlbWVudCwgXCJjbGlja1wiLCAoKSA9PiB7Y29uc29sZS5sb2coXCJmaXJlZCFcIik7IGNhbmNlbCgpO30pO2BcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBhZGQgbGlzdGVuZXIgdG9cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIEV2ZW50IHRvIGxpc3RlbiB0byB3aXRoIG9wdGlvbiBuYW1lc3BhY2UgKGUuZy4gXCJldmVudC5uYW1lc3BhY2VcIilcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xjYWxsYWJsZSl9IGRlbGVnYXRlIC0gU2VsZWN0b3IgdG8gcnVuIG9uIGVsZW1lbnQgdG8gbGlzdGVuIHRvXHJcbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBbY2FsbGJhY2tdIC0gRnVuY3Rpb24gdG8gZmlyZSBvbiBldmVudFxyXG4gICAgICogQHJldHVybnMge21vZHVsZTpET01Ub29sc35DYW5jZWxMaXN0ZW5lcn0gLSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCB1bmRvIHRoZSBsaXN0ZW5lclxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb24oZWxlbWVudCwgZXZlbnQsIGRlbGVnYXRlLCBjYWxsYmFjaykge1xyXG4gICAgICAgIGNvbnN0IFt0eXBlLCBuYW1lc3BhY2VdID0gZXZlbnQuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIGNvbnN0IGhhc0RlbGVnYXRlID0gZGVsZWdhdGUgJiYgY2FsbGJhY2s7XHJcbiAgICAgICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBkZWxlZ2F0ZTtcclxuICAgICAgICBjb25zdCBldmVudEZ1bmMgPSAhaGFzRGVsZWdhdGUgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQubWF0Y2hlcyhkZWxlZ2F0ZSkpIHtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xyXG4gICAgICAgIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcclxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAobmFtZXNwYWNlKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSkgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdDYW5jZWwgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0uc3BsaWNlKHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0uZmluZEluZGV4KGwgPT4gbC5ldmVudCA9PSB0eXBlICYmIGwuZWxlbWVudCA9PSBlbGVtZW50KSwgMSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0ucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBldmVudDogdHlwZSxcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICBjYW5jZWw6IG5ld0NhbmNlbFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ld0NhbmNlbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNhbmNlbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bmN0aW9uYWxpdHkgZm9yIHRoaXMgbWV0aG9kIG1hdGNoZXMge0BsaW5rIG1vZHVsZTpET01Ub29scy5vbn0gYnV0IGF1dG9tYXRpY2FsbHkgY2FuY2VscyBpdHNlbGZcclxuICAgICAqIGFuZCByZW1vdmVzIHRoZSBsaXN0ZW5lciB1cG9uIHRoZSBmaXJzdCBmaXJpbmcgb2YgdGhlIGRlc2lyZWQgZXZlbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gYWRkIGxpc3RlbmVyIHRvXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgLSBFdmVudCB0byBsaXN0ZW4gdG8gd2l0aCBvcHRpb24gbmFtZXNwYWNlIChlLmcuIFwiZXZlbnQubmFtZXNwYWNlXCIpXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8Y2FsbGFibGUpfSBkZWxlZ2F0ZSAtIFNlbGVjdG9yIHRvIHJ1biBvbiBlbGVtZW50IHRvIGxpc3RlbiB0b1xyXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gW2NhbGxiYWNrXSAtIEZ1bmN0aW9uIHRvIGZpcmUgb24gZXZlbnRcclxuICAgICAqIEByZXR1cm5zIHttb2R1bGU6RE9NVG9vbHN+Q2FuY2VsTGlzdGVuZXJ9IC0gQSBmdW5jdGlvbiB0aGF0IHdpbGwgdW5kbyB0aGUgbGlzdGVuZXJcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG9uY2UoZWxlbWVudCwgZXZlbnQsIGRlbGVnYXRlLCBjYWxsYmFjaykge1xyXG4gICAgICAgIGNvbnN0IFt0eXBlLCBuYW1lc3BhY2VdID0gZXZlbnQuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIGNvbnN0IGhhc0RlbGVnYXRlID0gZGVsZWdhdGUgJiYgY2FsbGJhY2s7XHJcbiAgICAgICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBkZWxlZ2F0ZTtcclxuICAgICAgICBjb25zdCBldmVudEZ1bmMgPSAhaGFzRGVsZWdhdGUgPyBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICBjYWxsYmFjayhldmVudCk7XHJcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xyXG4gICAgICAgIH0gOiBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5tYXRjaGVzKGRlbGVnYXRlKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBjYWxsYmFjayhldmVudCk7XHJcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xyXG4gICAgICAgIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcclxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAobmFtZXNwYWNlKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSkgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdDYW5jZWwgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0uc3BsaWNlKHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0uZmluZEluZGV4KGwgPT4gbC5ldmVudCA9PSB0eXBlICYmIGwuZWxlbWVudCA9PSBlbGVtZW50KSwgMSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0ucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBldmVudDogdHlwZSxcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICBjYW5jZWw6IG5ld0NhbmNlbFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ld0NhbmNlbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNhbmNlbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgX19vZmZBbGwoZXZlbnQsIGVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBbdHlwZSwgbmFtZXNwYWNlXSA9IGV2ZW50LnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBsZXQgbWF0Y2hGaWx0ZXIgPSBsaXN0ZW5lciA9PiBsaXN0ZW5lci5ldmVudCA9PSB0eXBlLCBkZWZhdWx0RmlsdGVyID0gXyA9PiBfO1xyXG4gICAgICAgIGlmIChlbGVtZW50KSBtYXRjaEZpbHRlciA9IGwgPT4gbC5ldmVudCA9PSB0eXBlICYmIGwuZWxlbWVudCA9PSBlbGVtZW50LCBkZWZhdWx0RmlsdGVyID0gbCA9PiBsLmVsZW1lbnQgPT0gZWxlbWVudDtcclxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdIHx8IFtdO1xyXG4gICAgICAgIGNvbnN0IGxpc3QgPSB0eXBlID8gbGlzdGVuZXJzLmZpbHRlcihtYXRjaEZpbHRlcikgOiBsaXN0ZW5lcnMuZmlsdGVyKGRlZmF1bHRGaWx0ZXIpO1xyXG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbGlzdC5sZW5ndGg7IGMrKykgbGlzdFtjXS5jYW5jZWwoKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlzIHNpbWlsYXIgdG8galF1ZXJ5J3MgYG9mZmAgZnVuY3Rpb24gYW5kIGNhbiAqaG9wZWZ1bGx5KiBiZSB1c2VkIGluIHRoZSBzYW1lIHdheS5cclxuICAgICAqIFxyXG4gICAgICogUmF0aGVyIHRoYW4gYXR0ZW1wdCB0byBleHBsYWluLCBJJ2xsIHNob3cgc29tZSBleGFtcGxlIHVzYWdlcy5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhIGNsaWNrIGxpc3RlbmVyIGNhbGxlZCBgb25DbGlja2AgKGluIHRoZSBgbXlQbHVnaW5gIG5hbWVzcGFjZSkgZnJvbSBgZWxlbWVudGAuXHJcbiAgICAgKiBgRE9NVG9vbHMub2ZmKGVsZW1lbnQsIFwiY2xpY2subXlQbHVnaW5cIiwgb25DbGljayk7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGEgY2xpY2sgbGlzdGVuZXIgY2FsbGVkIGBvbkNsaWNrYCAoaW4gdGhlIGBteVBsdWdpbmAgbmFtZXNwYWNlKSBmcm9tIGBlbGVtZW50YCB0aGF0IG9ubHkgZmlyZWQgd2hlbiB0aGUgdGFyZ2V0IGlzIGEgYC5ibG9ja2AgZWxlbWVudC5cclxuICAgICAqIGBET01Ub29scy5vZmYoZWxlbWVudCwgXCJjbGljay5teVBsdWdpblwiLCBcIi5ibG9ja1wiLCBvbkNsaWNrKTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYSBjbGljayBsaXN0ZW5lciAod2l0aG91dCBuYW1lc3BhY2UpIGZyb20gYGVsZW1lbnRgLlxyXG4gICAgICogYERPTVRvb2xzLm9mZihlbGVtZW50LCBcImNsaWNrXCIsIG9uQ2xpY2spO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhbGwgbGlzdGVuZXJzIGluIG5hbWVzcGFjZSBgbXlQbHVnaW5gIGZyb20gYGVsZW1lbnRgLlxyXG4gICAgICogYERPTVRvb2xzLm9mZihlbGVtZW50LCBcIi5teVBsdWdpblwiKTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYWxsIGNsaWNrIGxpc3RlbmVycyBpbiBuYW1lc3BhY2UgYG15UGx1Z2luYCBmcm9tICphbGwgZWxlbWVudHMqLlxyXG4gICAgICogYERPTVRvb2xzLm9mZihcImNsaWNrLm15UGx1Z2luXCIpO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhbGwgbGlzdGVuZXJzIGluIG5hbWVzcGFjZSBgbXlQbHVnaW5gIGZyb20gKmFsbCBlbGVtZW50cyouXHJcbiAgICAgKiBgRE9NVG9vbHMub2ZmKFwiLm15UGx1Z2luXCIpO2BcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHsoRWxlbWVudHxzdHJpbmcpfSBlbGVtZW50IC0gRWxlbWVudCB0byByZW1vdmUgbGlzdGVuZXIgZnJvbVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtldmVudF0gLSBFdmVudCB0byBsaXN0ZW4gdG8gd2l0aCBvcHRpb24gbmFtZXNwYWNlIChlLmcuIFwiZXZlbnQubmFtZXNwYWNlXCIpXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8Y2FsbGFibGUpfSBbZGVsZWdhdGVdIC0gU2VsZWN0b3IgdG8gcnVuIG9uIGVsZW1lbnQgdG8gbGlzdGVuIHRvXHJcbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBbY2FsbGJhY2tdIC0gRnVuY3Rpb24gdG8gZmlyZSBvbiBldmVudFxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gVGhlIG9yaWdpbmFsIGVsZW1lbnQgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBvZmYoZWxlbWVudCwgZXZlbnQsIGRlbGVnYXRlLCBjYWxsYmFjaykge1xyXG4gICAgICAgIGlmICh0eXBlb2YoZWxlbWVudCkgPT0gXCJzdHJpbmdcIikgcmV0dXJuIHRoaXMuX19vZmZBbGwoZWxlbWVudCk7XHJcbiAgICAgICAgY29uc3QgW3R5cGUsIG5hbWVzcGFjZV0gPSBldmVudC5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgaWYgKG5hbWVzcGFjZSkgcmV0dXJuIHRoaXMuX19vZmZBbGwoZXZlbnQsIGVsZW1lbnQpO1xyXG5cclxuICAgICAgICBjb25zdCBoYXNEZWxlZ2F0ZSA9IGRlbGVnYXRlICYmIGNhbGxiYWNrO1xyXG4gICAgICAgIGlmICghY2FsbGJhY2spIGNhbGxiYWNrID0gZGVsZWdhdGU7XHJcbiAgICAgICAgY29uc3QgZXZlbnRGdW5jID0gIWhhc0RlbGVnYXRlID8gY2FsbGJhY2sgOiBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoZGVsZWdhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciBmb3Igd2hlbiB0aGUgbm9kZSBpcyBhZGRlZC9yZW1vdmVkIGZyb20gdGhlIGRvY3VtZW50IGJvZHkuXHJcbiAgICAgKiBUaGUgbGlzdGVuZXIgaXMgYXV0b21hdGljYWxseSByZW1vdmVkIHVwb24gZmlyaW5nLlxyXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSAtIG5vZGUgdG8gd2FpdCBmb3JcclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IGNhbGxiYWNrIC0gZnVuY3Rpb24gdG8gYmUgcGVyZm9ybWVkIG9uIGV2ZW50XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9uTW91bnQgLSBkZXRlcm1pbmVzIGlmIGl0IHNob3VsZCBmaXJlIG9uIE1vdW50IG9yIG9uIFVubW91bnRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG9uTW91bnRDaGFuZ2Uobm9kZSwgY2FsbGJhY2ssIG9uTW91bnQgPSB0cnVlKSB7XHJcbiAgICAgICAgY29uc3Qgd3JhcHBlZENhbGxiYWNrID0gKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLnVuc3Vic2NyaWJlKHdyYXBwZWRDYWxsYmFjayk7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLm9ic2VydmVyLnN1YnNjcmliZSh3cmFwcGVkQ2FsbGJhY2ssIG11dGF0aW9uID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBBcnJheS5mcm9tKG9uTW91bnQgPyBtdXRhdGlvbi5hZGRlZE5vZGVzIDogbXV0YXRpb24ucmVtb3ZlZE5vZGVzKTtcclxuICAgICAgICAgICAgY29uc3QgZGlyZWN0TWF0Y2ggPSBub2Rlcy5pbmRleE9mKG5vZGUpID4gLTE7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudE1hdGNoID0gbm9kZXMuc29tZShwYXJlbnQgPT4gcGFyZW50LmNvbnRhaW5zKG5vZGUpKTtcclxuICAgICAgICAgICAgcmV0dXJuIGRpcmVjdE1hdGNoIHx8IHBhcmVudE1hdGNoO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBub2RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBTaG9ydGhhbmQgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMub25Nb3VudENoYW5nZX0gd2l0aCB0aGlyZCBwYXJhbWV0ZXIgYHRydWVgICovXHJcbiAgICBzdGF0aWMgb25Nb3VudChub2RlLCBjYWxsYmFjaykgeyByZXR1cm4gdGhpcy5vbk1vdW50Q2hhbmdlKG5vZGUsIGNhbGxiYWNrKTsgfVxyXG5cclxuICAgIC8qKiBTaG9ydGhhbmQgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMub25Nb3VudENoYW5nZX0gd2l0aCB0aGlyZCBwYXJhbWV0ZXIgYGZhbHNlYCAqL1xyXG4gICAgc3RhdGljIG9uVW5tb3VudChub2RlLCBjYWxsYmFjaykgeyByZXR1cm4gdGhpcy5vbk1vdW50Q2hhbmdlKG5vZGUsIGNhbGxiYWNrLCBmYWxzZSk7IH1cclxuXHJcbiAgICAvKiogQWxpYXMgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMub25Nb3VudH0gKi9cclxuICAgIHN0YXRpYyBvbkFkZGVkKG5vZGUsIGNhbGxiYWNrKSB7IHJldHVybiB0aGlzLm9uTW91bnQobm9kZSwgY2FsbGJhY2spOyB9XHJcblxyXG4gICAgLyoqIEFsaWFzIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLm9uVW5tb3VudH0gKi9cclxuICAgIHN0YXRpYyBvblJlbW92ZWQobm9kZSwgY2FsbGJhY2spIHsgcmV0dXJuIHRoaXMub25Vbm1vdW50KG5vZGUsIGNhbGxiYWNrLCBmYWxzZSk7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciBmdW5jdGlvbiB3aGljaCBjb21iaW5lcyBtdWx0aXBsZSBlbGVtZW50cyBpbnRvIG9uZSBwYXJlbnQgZWxlbWVudFxyXG4gICAgICogQHBhcmFtIHtBcnJheTxIVE1MRWxlbWVudD59IGVsZW1lbnRzIC0gYXJyYXkgb2YgZWxlbWVudHMgdG8gcHV0IGludG8gYSBzaW5nbGUgcGFyZW50XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyB3cmFwKGVsZW1lbnRzKSB7XHJcbiAgICAgICAgY29uc3QgZG9tV3JhcHBlciA9IHRoaXMucGFyc2VIVE1MKGA8ZGl2IGNsYXNzPVwiZG9tLXdyYXBwZXJcIj48L2Rpdj5gKTtcclxuICAgICAgICBmb3IgKGxldCBlID0gMDsgZSA8IGVsZW1lbnRzLmxlbmd0aDsgZSsrKSBkb21XcmFwcGVyLmFwcGVuZENoaWxkKGVsZW1lbnRzW2VdKTtcclxuICAgICAgICByZXR1cm4gZG9tV3JhcHBlcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc29sdmVzIHRoZSBub2RlIHRvIGFuIEhUTUxFbGVtZW50LiBUaGlzIGlzIG1haW5seSB1c2VkIGJ5IGxpYnJhcnkgbW9kdWxlcy5cclxuICAgICAqIEBwYXJhbSB7KGpRdWVyeXxFbGVtZW50KX0gbm9kZSAtIG5vZGUgdG8gcmVzb2x2ZVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcmVzb2x2ZUVsZW1lbnQobm9kZSkge1xyXG4gICAgICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiBqUXVlcnkpICYmICEobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIHJldHVybiBub2RlIGluc3RhbmNlb2YgalF1ZXJ5ID8gbm9kZVswXSA6IG5vZGU7XHJcbiAgICB9XHJcbn1cclxuXHJcbndpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5ET00gPSBET01Ub29scyIsImltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5cclxuY29uc3QgQ29uc3RhbnRzID0ge1xyXG4gICAgRW1vamlSZWdleDogLzxhP1xcLihcXHcrKVxcLihcXGQrKT4vZ1xyXG59XHJcblxyXG5sZXQgQ3VzdG9tRW1vamlNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5DdXN0b21FbW9qaSlbMF1cclxubGV0IEVtb2ppTW9kdWxlQXBpID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VzdG9tRW1vamlCeUlkKVswXVxyXG5sZXQgQXV0b2NvbXBsZXRlTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUgPT09IFwiQXV0b2NvbXBsZXRlXCIpWzBdXHJcbmxldCBBdXRvQ29tcGxldGlvblRlbXBsYXRlcyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmdldEF1dG9jb21wbGV0ZU9wdGlvbnMpWzBdXHJcbmxldCBFbW9qaU1vZHVsZVF1ZXJ5ID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQucXVlcnlFbW9qaVJlc3VsdHMpWzBdXHJcbmxldCBNZXNzYWdlcyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzICYmIGUuZGVmYXVsdC5NZXNzYWdlcy5FTU9KSV9NQVRDSElORylbMF1cclxubGV0IGd1aWxkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGQgJiYgZS5kZWZhdWx0LmdldEd1aWxkcyAmJiAhZS5kZWZhdWx0LmlzRmV0Y2hpbmcpWzBdXHJcbmxldCBlbW9qaVNlYXJjaCA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldERpc2FtYmlndWF0ZWRFbW9qaUNvbnRleHQpXHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRW1vamlNb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB0aGlzLmluaXQoKS5jYXRjaChlcnIgPT4gVXRpbHMuZXJyKFwiRW1vamlNb2R1bGVcIiwgXCJBbiBlcnJvciBvY2N1cmVkXCIsIGVycikpIC8vIGJldHRlciBsb2dnaW5nXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdCgpe1xyXG4gICAgICAgIC8qKiBFbW9qaSBBdXRvQ29tcGxldGUgKi9cclxuICAgICAgICBpZighQXV0b2NvbXBsZXRlTW9kdWxlKUF1dG9jb21wbGV0ZU1vZHVsZSA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJBdXRvY29tcGxldGVcIilcclxuICAgICAgICBpZighQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMpQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucylcclxuICAgICAgICBpZighRW1vamlNb2R1bGVRdWVyeSlFbW9qaU1vZHVsZVF1ZXJ5ID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LnF1ZXJ5RW1vamlSZXN1bHRzKVxyXG4gICAgICAgIGlmKCFNZXNzYWdlcylNZXNzYWdlcyA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5NZXNzYWdlcyAmJiBlLmRlZmF1bHQuTWVzc2FnZXMuRU1PSklfTUFUQ0hJTkcpXHJcbiAgICAgICAgaWYoIWd1aWxkTW9kdWxlKWd1aWxkTW9kdWxlID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEd1aWxkICYmIGUuZGVmYXVsdC5nZXRHdWlsZHMgJiYgIWUuZGVmYXVsdC5pc0ZldGNoaW5nKVxyXG4gICAgICAgIGlmKCFlbW9qaVNlYXJjaCllbW9qaVNlYXJjaCA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXREaXNhbWJpZ3VhdGVkRW1vamlDb250ZXh0KVxyXG5cclxuICAgICAgICBpZihBdXRvY29tcGxldGVNb2R1bGUgJiYgQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMgJiYgRW1vamlNb2R1bGVRdWVyeSAmJiBNZXNzYWdlcyAmJiBndWlsZE1vZHVsZSAmJiBlbW9qaVNlYXJjaCl7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBQYXRjaGluZyBnZXRBdXRvY29tcGxldGVPcHRpb25zIG9mIEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzYCwgQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMpXHJcbiAgICAgICAgICAgIGNvbnN0IGdldEF1dG9jb21wbGV0ZU9wdGlvbnMgPSBBdXRvQ29tcGxldGlvblRlbXBsYXRlcy5nZXRBdXRvY29tcGxldGVPcHRpb25zXHJcbiAgICAgICAgICAgIEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzLmdldEF1dG9jb21wbGV0ZU9wdGlvbnMgPSBmdW5jdGlvbihlLCB0LCBuLCByLCBhKXtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucy5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cylcclxuICAgICAgICAgICAgICAgIHZhbHVlLkxJR0hUQ09SRF9FTU9KSVMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyhhcmcxLCBhcmcyKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmRpdGlvbiA9IGFyZzIubGVuZ3RoID4gMSAmJiBcIi5cIiA9PT0gYXJnMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRFbW9qaVVzYWJsZShjb25kaXRpb24pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb25cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5UmVzdWx0cyh0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBFbW9qaU1vZHVsZVF1ZXJ5LmRlZmF1bHQucXVlcnlFbW9qaVJlc3VsdHModCwgZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlclJlc3VsdHMoZSwgdCwgbiwgciwgYSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEKGUsIHQsIGEuZW1vamlzLCBuLCByLCBNZXNzYWdlcy5kZWZhdWx0Lk1lc3NhZ2VzLkVNT0pJX01BVENISU5HLCBNZXNzYWdlcy5kZWZhdWx0Lk1lc3NhZ2VzLkVNT0pJLCBBdXRvY29tcGxldGVNb2R1bGUuZGVmYXVsdC5FbW9qaSwgKGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamk6IGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlLmlkIHx8IGUudW5pcXVlTmFtZSB8fCBlLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VudGluZWw6IFwiLlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWxkOiBudWxsICE9IGUuZ3VpbGRJZCA/IGd1aWxkTW9kdWxlLmRlZmF1bHQuZ2V0R3VpbGQoZS5ndWlsZElkKSA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSksIChmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIuXCIgKyBlICsgXCIuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBnZXRQbGFpblRleHQoaWQsIGd1aWxkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVtb2ppcyA9IGd1aWxkLmVtb2ppcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZW1vamlzIHx8IG51bGwgPT0gZW1vamlzW2lkXSkgcmV0dXJuIFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbW9qaSA9IGVtb2ppc1tpZF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FuaW1hdGVkID0gZW1vamkuYW5pbWF0ZWQgPyBcImFcIiA6IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbW9qaS5tYW5hZ2VkIHx8IG51bGwgPT0gZW1vamkuaWQgPyBcIi5cIiArIGVtb2ppLm5hbWUgKyBcIi5cIiA6IFwiPFwiICsgaXNBbmltYXRlZCArIFwiLlwiICsgKGVtb2ppLm9yaWdpbmFsTmFtZSB8fCBlbW9qaS5uYW1lKSArIFwiLlwiICsgZW1vamkuaWQgKyBcIj5cIlxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0UmF3VGV4dChpZCwgZ3VpbGQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1vamlzID0gZ3VpbGQuZW1vamlzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBlbW9qaXMgfHwgbnVsbCA9PSBlbW9qaXNbaWRdKSByZXR1cm4gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVtb2ppID0gZW1vamlzW2lkXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQW5pbWF0ZWQgPSBlbW9qaS5hbmltYXRlZCA/IFwiYVwiIDogXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtb2ppLm1hbmFnZWQgfHwgbnVsbCA9PSBlbW9qaS5pZCA/IFwiLlwiICsgZW1vamkubmFtZSArIFwiLlwiIDogXCI8XCIgKyBpc0FuaW1hdGVkICsgXCIuXCIgKyAoZW1vamkub3JpZ2luYWxOYW1lIHx8IGVtb2ppLm5hbWUpICsgXCIuXCIgKyBlbW9qaS5pZCArIFwiPlwiXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihuZXcgRXJyb3IoXCJDb3VsZG4ndCBzdGFydCBhdXRvY29tcGxldGlvbiBvZiBMaWdodGNvcmQncyBlbW9qaXMuXCIpKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqIEVtb2ppIGRpc3BsYXkgKi9cclxuICAgICAgICB3aGlsZSAoIUJEVjIuTWVzc2FnZUNvbXBvbmVudCkgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMCkpO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuY2FuY2VsRW1vamlSZW5kZXIpeyAvLyBUT0RPOiBQcm9wZXIgZW1vamkgZm9ybWF0dGluZyAvIHJlbmRlcmluZ1xyXG4gICAgICAgICAgICB0aGlzLmNhbmNlbEVtb3RlUmVuZGVyID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5NZXNzYWdlQ29tcG9uZW50LCBcImRlZmF1bHRcIiwge2JlZm9yZTogKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLCBcImNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMubWVzc2FnZVwiKVxyXG4gICAgICAgICAgICAgICAgaWYoIW1lc3NhZ2UpcmV0dXJuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLm1ldGhvZEFyZ3VtZW50c1swXSwgXCJjaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLmNvbnRlbnRcIilcclxuICAgICAgICAgICAgICAgIGlmKCFjb250ZW50IHx8ICFjb250ZW50Lmxlbmd0aClyZXR1cm5cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBAdHlwZSB7e1xyXG4gICAgICAgICAgICAgICAgICogIHJhdzogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICogIG5hbWU6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAqICBpZDogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICogIGFuaW1hdGVkOiBib29sZWFuXHJcbiAgICAgICAgICAgICAgICAgKiB9W119XHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGxldCBlbW9qaXMgPSBbXVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gW11cclxuICAgICAgICAgICAgICAgIGZvcihsZXQgbm9kZSBvZiBjb250ZW50KXtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKG5vZGUpICE9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQucHVzaChub2RlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcnNlZDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaGFzUGFyc2VkID0gZmFsc2VcclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZCA9IENvbnN0YW50cy5FbW9qaVJlZ2V4LmV4ZWMobm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1BhcnNlZCA9IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFFbW9qaU1vZHVsZUFwaSlFbW9qaU1vZHVsZUFwaSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1c3RvbUVtb2ppQnlJZClbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtb2ppID0gRW1vamlNb2R1bGVBcGkuZGVmYXVsdC5nZXRDdXN0b21FbW9qaUJ5SWQocGFyc2VkWzJdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZW1vamkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZWQ6IGVtb2ppLmFuaW1hdGVkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBlbW9qaS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZW1vamkuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdzogcGFyc2VkWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZWQ6IHBhcnNlZFswXS5zdGFydHNXaXRoKFwiPGFcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcnNlZFsxXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHBhcnNlZFsyXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3OiBwYXJzZWRbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAocGFyc2VkKTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGlmKGhhc1BhcnNlZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdvcmRzID0gbm9kZS5zcGxpdChcIiBcIikubWFwKCh3b3JkLCBpbmRleCwgYXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighd29yZClyZXR1cm4gXCJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1vamkgPSBlbW9qaXMuZmluZChlID0+IGUucmF3ID09IHdvcmQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZW1vamkpcmV0dXJuIHdvcmRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFDdXN0b21FbW9qaU1vZHVsZSlDdXN0b21FbW9qaU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLkN1c3RvbUVtb2ppKVswXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ3VzdG9tRW1vamlNb2R1bGUuQ3VzdG9tRW1vamksIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBgLiR7ZW1vamkubmFtZX0uYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamlJZDogZW1vamkuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVkOiBlbW9qaS5hbmltYXRlZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVtYm9hYmxlOiBhcnIubGVuZ3RoID09PSAxICYmIGNvbnRlbnQubGVuZ3RoID09PSAxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkucmVkdWNlKChwcmV2aW91cywgY3VycmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJldmlvdXMubGVuZ3RoID09PSAwKXJldHVybiBbY3VycmVudF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBjdXJyZW50ID09PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgcHJldmlvdXNbcHJldmlvdXMubGVuZ3RoIC0gMV0gPT09IFwic3RyaW5nXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1twcmV2aW91cy5sZW5ndGggLSAxXSArPSBgICR7Y3VycmVudH1gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy5wdXNoKFwiIFwiK2N1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy5wdXNoKFwiIFwiLCBjdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50LnB1c2goLi4ud29yZHMpXHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQucHVzaChub2RlKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHdoaWxlKGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMuY29udGVudFswXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5tZXRob2RBcmd1bWVudHNbMF0uY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5jb250ZW50LnNoaWZ0KClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHdoaWxlKG5ld0NvbnRlbnRbMF0pe1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMuY29udGVudC5wdXNoKG5ld0NvbnRlbnQuc2hpZnQoKSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfX0pO1xyXG4gICAgICAgIH0vKlxyXG4gICAgICAgIGxldCB1c2VyTW9kdWxlXHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIkVtb2ppUGlja2VyTGlzdFJvd1wiKVxyXG4gICAgICAgIC50aGVuKEVtb2ppUGlja2VyTGlzdFJvdyA9PiB7XHJcbiAgICAgICAgICAgIGxldCBjbGFzc3MgPSBFbW9qaVBpY2tlckxpc3RSb3cuZGVmYXVsdFxyXG4gICAgICAgICAgICBFbW9qaVBpY2tlckxpc3RSb3cuZGVmYXVsdCA9IGNsYXNzIEVtb2ppUGlja2VyTGlzdFJvdyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XHJcbiAgICAgICAgICAgICAgICAgICAgc3VwZXIocHJvcHMpXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmVuZGVyKCl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIXVzZXJNb2R1bGUpdXNlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKVswXVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKCF1c2VyTW9kdWxlKXJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGNsYXNzcywgdGhpcy5wcm9wcylcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdXNlciA9IHVzZXJNb2R1bGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIXVzZXIuaGFzUHJlbWl1bVN1YnNjcmlwdGlvbilyZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChjbGFzc3MsIHRoaXMucHJvcHMpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGNsYXNzcywgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wcm9wcywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbW9qaURlc2NyaXB0b3JzOiB0aGlzLnByb3BzLmVtb2ppRGVzY3JpcHRvcnMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5pc0Rpc2FibGVkID0gZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9KSkgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEVtb2ppUGlja2VyTGlzdFJvdy5kZWZhdWx0LmRpc3BsYXlOYW1lID0gXCJFbW9qaVBpY2tlckxpc3RSb3dcIlxyXG4gICAgICAgIH0pKi9cclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKCl7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNhbmNlbEVtb3RlUmVuZGVyKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5jYW5jZWxFbW90ZVJlbmRlcigpO1xyXG4gICAgICAgIHRoaXMuY2FuY2VsRW1vdGVSZW5kZXIgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCl7XHJcbiAgICAgICAgXHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEQoZSwgdCwgbiwgciwgbywgaSwgcywgdSwgbCwgYykge1xyXG4gICAgaWYgKG51bGwgPT0gbiB8fCAwID09PSBuLmxlbmd0aCkgcmV0dXJuIG51bGw7XHJcbiAgICB2YXIgZCA9IG4ubWFwKChmdW5jdGlvbihlLCBuKSB7XHJcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQodSwgT2JqZWN0LmFzc2lnbih7XHJcbiAgICAgICAgICAgIG9uQ2xpY2s6IG8sXHJcbiAgICAgICAgICAgIG9uSG92ZXI6IHIsXHJcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0ID09PSBuLFxyXG4gICAgICAgICAgICBpbmRleDogblxyXG4gICAgICAgIH0sIGwoZSwgbikpKVxyXG4gICAgfSkpO1xyXG4gICAgcmV0dXJuIFtSKGksIHMsIGUsIGMpLCBkXVxyXG59XHJcblxyXG5mdW5jdGlvbiBSKGUsIHQsIG4sIHIpIHtcclxuICAgIHZhciBhID0gKG4ubGVuZ3RoID4gMCA/IGUuZm9ybWF0KHtcclxuICAgICAgICBwcmVmaXg6IHIobilcclxuICAgIH0pIDogdClcclxuICAgIGlmKEFycmF5LmlzQXJyYXkoYSkpe1xyXG4gICAgICAgIGEudW5zaGlmdChSZWFjdC5jcmVhdGVFbGVtZW50KFwic3Ryb25nXCIsIHt9LCBcIltMaWdodGNvcmRdIFwiKSlcclxuICAgIH1lbHNle1xyXG4gICAgICAgIGEgPSBcIltMSUdIVENPUkRdIFwiK2FcclxuICAgIH1cclxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEF1dG9jb21wbGV0ZU1vZHVsZS5kZWZhdWx0LlRpdGxlLCB7XHJcbiAgICAgICAgdGl0bGU6IGFcclxuICAgIH0sIGEpXHJcbn1cclxuUi5kaXNwbGF5TmFtZSA9IFwicmVuZGVySGVhZGVyXCI7XHJcblxyXG5sZXQgRW1vamlGaWx0ZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5pc0Vtb2ppRGlzYWJsZWQpWzBdXHJcbmxldCBpc0Vtb2ppRGlzYWJsZWQgPSBFbW9qaUZpbHRlck1vZHVsZSAmJiBFbW9qaUZpbHRlck1vZHVsZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZFxyXG5sZXQgaXNVc2FibGUgPSBmYWxzZVxyXG5sZXQgaGFzUGF0Y2hlZCA9IGZhbHNlXHJcblxyXG5mdW5jdGlvbiBzZXRFbW9qaVVzYWJsZSh1c2FibGUpe1xyXG4gICAgaXNVc2FibGUgPSB1c2FibGVcclxuICAgIGlmKGhhc1BhdGNoZWQpcmV0dXJuXHJcbiAgICBpZighRW1vamlGaWx0ZXJNb2R1bGUpRW1vamlGaWx0ZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5pc0Vtb2ppRGlzYWJsZWQpWzBdXHJcbiAgICBpZighRW1vamlGaWx0ZXJNb2R1bGUpcmV0dXJuXHJcbiAgICBpZighaXNFbW9qaURpc2FibGVkKWlzRW1vamlEaXNhYmxlZCA9IEVtb2ppRmlsdGVyTW9kdWxlLmRlZmF1bHQuaXNFbW9qaURpc2FibGVkXHJcblxyXG4gICAgaGFzUGF0Y2hlZCA9IHRydWVcclxuICAgIEVtb2ppRmlsdGVyTW9kdWxlLmRlZmF1bHQuaXNFbW9qaURpc2FibGVkID0gZnVuY3Rpb24oZW1vamkpe1xyXG4gICAgICAgIGlmKGlzVXNhYmxlKXtcclxuICAgICAgICAgICAgaWYoZW1vamkuc3Vycm9nYXRlcyB8fCBlbW9qaS5kaXZlcnNpdHkpcmV0dXJuIHRydWVcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpc0Vtb2ppRGlzYWJsZWQuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgbm9kZUZldGNoIGZyb20gXCJub2RlLWZldGNoXCJcclxuaW1wb3J0ICogYXMgZWxlY3Ryb24gZnJvbSBcImVsZWN0cm9uXCJcclxuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gXCJjcnlwdG9cIlxyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiXHJcbmltcG9ydCB0b29sdGlwV3JhcCBmcm9tIFwiLi4vdWkvdG9vbHRpcFdyYXBcIlxyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIlxyXG5pbXBvcnQgeyBjcmVhdGVSZWFkU3RyZWFtLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcImZzXCJcclxuaW1wb3J0IHsgYmFzZW5hbWUsIGpvaW4gfSBmcm9tIFwicGF0aFwiXHJcbmltcG9ydCBjb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiXHJcbmltcG9ydCB7IGFkZG9uQ2FjaGUgfSBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiXHJcblxyXG5jb25zdCBjYWNoZSA9IHt9XHJcbmNvbnN0IGNhY2hlMiA9IHt9XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgUGx1Z2luQ2VydGlmaWVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLlBsdWdpbkNlcnRpZmllciA9IHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBwYXRjaChhdHRhY2htZW50LCBpZCl7XHJcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XHJcbiAgICAgICAgICAgIHByb2Nlc3NBdHRhY2htZW50KGF0dGFjaG1lbnQsIGlkKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnQoKXtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgaXNUcnVzdGVkKGhhc2gpe1xyXG4gICAgICAgIHJldHVybiBjYWNoZVtoYXNoXSAmJiAhY2FjaGVbaGFzaF0uc3VzcGVjdFxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tWaXJ1c2VzKGhhc2gsIGRhdGEsIHJlc3VsdENhbGxiYWNrLCByZW1vdmVDYWxsYmFjaywgZmlsZW5hbWUpe1xyXG4gICAgZGF0YSA9IGRhdGEudG9TdHJpbmcoXCJ1dGY4XCIpXHJcbiAgICBsZXQgaXNIYXJtZnVsID0gZmFsc2VcclxuICAgIGZvcihsZXQga2V5d29yZCBvZiBkYXRhLnNwbGl0KC9bXlxcd1xcZF0rL2cpKXtcclxuICAgICAgICBmb3IobGV0IG9vZiBvZiBbXHJcbiAgICAgICAgICAgIFwidG9rZW5cIixcclxuICAgICAgICAgICAgXCJlbWFpbFwiLFxyXG4gICAgICAgICAgICBcInBob25lXCIsXHJcbiAgICAgICAgICAgIFwiTUZBXCIsXHJcbiAgICAgICAgICAgIFwiMmZhXCIsXHJcbiAgICAgICAgICAgIFwiY2hpbGRfcHJvY2Vzc1wiLFxyXG4gICAgICAgICAgICBcImxvY2FsU3RvcmFnZVwiLFxyXG4gICAgICAgICAgICBcImV2YWxcIixcclxuICAgICAgICAgICAgXCJnZXRHbG9iYWxcIixcclxuICAgICAgICAgICAgXCJCcm93c2VyV2luZG93XCJcclxuICAgICAgICBdKXtcclxuICAgICAgICAgICAgaWYoa2V5d29yZC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKG9vZi50b0xvd2VyQ2FzZSgpKSAmJiAha2V5d29yZC50b0xvd2VyQ2FzZSgpID09PSBcImRvbXRva2VubGlzdFwiKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG9vZiwga2V5d29yZClcclxuICAgICAgICAgICAgICAgIGlzSGFybWZ1bCA9IFwidG9rZW4gc3RlYWxlci92aXJ1c1wiXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9IFxyXG4gICAgICAgIH1cclxuICAgICAgICBpZihpc0hhcm1mdWwpYnJlYWtcclxuICAgIH1cclxuXHJcbiAgICBpZighaXNIYXJtZnVsKXtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IG5vX2NvbW1lbnRzID0gZGF0YS5yZXBsYWNlKC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvfChbXlxcXFw6XXxeKVxcL1xcLy4qJC9nbSwgXCJcIikudHJpbSgpLy8gcmVtb3ZpbmcgdGhlIE1FVEEgY29tbWVudCBmcm9tIHBsdWdpbnNcclxuICAgICAgICBpZigoL3ZhciBbXFx3XFxkXyRdKz1cXFtcIi9naSkudGVzdChub19jb21tZW50cykpe1xyXG4gICAgICAgICAgICBpc0hhcm1mdWwgPSBcIm9iZnVzY2F0aW9uL2hpZGRlbiBjb2RlXCJcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKCFpc0hhcm1mdWwpe1xyXG4gICAgICAgICAgICBjb25zdCByZWdleHBzID0gW1xyXG4gICAgICAgICAgICAgICAgLyoqIGhleGFkZWNpbWFsICovXHJcbiAgICAgICAgICAgICAgICAvXzB4XFx3ezR9XFwoJzB4W1xcZGFiY2RlZl0rJ1xcKS9nLFxyXG4gICAgICAgICAgICAgICAgL18weFxcd3s0fVxcKCcweFtcXGRhYmNkZWZdKydbLCBdKydbXiddezR9J1xcKS9nLCAvLyBfMHg4ZGI3KCcweDAnLCAneDFdZicpXHJcbiAgICAgICAgICAgICAgICAvKiogbWFuZ2xlZCAqL1xyXG4gICAgICAgICAgICAgICAgL1xcdytcXCgnMHhbXFxkYWJjZGVmXSsnXFwpL2csIC8vIGIoJzB4MCcpXHJcbiAgICAgICAgICAgICAgICAvXFx3K1xcKCcweFtcXGRhYmNkZWZdKydbLCBdKydbXiddezR9J1xcKS9nLCAvLyBiKCcweDAnLCAneDFdZicpXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgZm9yKGxldCByZWdleCBvZiByZWdleHBzKXtcclxuICAgICAgICAgICAgICAgIGlmKGlzSGFybWZ1bClicmVha1xyXG4gICAgICAgICAgICAgICAgaWYocmVnZXgudGVzdChub19jb21tZW50cykpaXNIYXJtZnVsID0gXCJvYmZ1c2NhdGlvbi9oaWRkZW4gY29kZVwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYoIWlzSGFybWZ1bClyZXR1cm4gcmVtb3ZlQ2FsbGJhY2soaGFzaClcclxuICAgIGNhY2hlW2hhc2hdID0ge1xyXG4gICAgICAgIHN1c3BlY3Q6IHRydWUsXHJcbiAgICAgICAgbmFtZTogaGFzaFRvVXJsW2hhc2hdLnNwbGl0KFwiL1wiKS5wb3AoKSxcclxuICAgICAgICB0eXBlOiBoYXNoVG9VcmxbaGFzaF0uZW5kc1dpdGgoXCIuanNcIikgPyBcIlBsdWdpblwiIDogXCJUaGVtZVwiLFxyXG4gICAgICAgIGhhcm06IGlzSGFybWZ1bCxcclxuICAgICAgICBoYXNoOiBoYXNoLFxyXG4gICAgICAgIGZpbGVuYW1lXHJcbiAgICB9XHJcbiAgICBcclxuICAgIGNvbnNvbGUubG9nKGBGb3VuZCBwb3RlbnRpYWxseSBkYW5nZXJvdXMgJHtjYWNoZVtoYXNoXS50eXBlLnRvTG93ZXJDYXNlKCl9OiAke2NhY2hlW2hhc2hdLm5hbWV9YClcclxuXHJcbiAgICByZXN1bHRDYWxsYmFjayhjYWNoZVtoYXNoXSlcclxufVxyXG5cclxuY29uc3QgaGFzaFRvVXJsID0ge31cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjaGVja0hhc2goaGFzaCwgZGF0YSwgZmlsZW5hbWUsIHJlc3VsdENhbGxiYWNrLCByZW1vdmVDYWxsYmFjayl7XHJcbiAgICBjb25zb2xlLmxvZyhgRmlsZTogJHtmaWxlbmFtZX0gaGFzaDogJHtoYXNofWApXHJcbiAgICBpZighY2FjaGVbaGFzaF0pe1xyXG4gICAgICAgIG5vZGVGZXRjaChcImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC9MaWdodGNvcmQvZmlsZWhhc2hlc0BtYXN0ZXIvaGFzaGVzL1wiK2hhc2gsIHsgLy8gVXNpbmcgbm9kZS1mZXRjaCB0byBieXBhc3MgY29yc1xyXG4gICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICBcIlVzZXItQWdlbnRcIjogZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpLnVzZXJBZ2VudCAvLyBoYXZlIHRvIHNldCB1c2VyLWFnZW50XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KS50aGVuKGFzeW5jIHJlcyA9PiB7XHJcbiAgICAgICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl7XHJcbiAgICAgICAgICAgICAgICBpZihmaWxlbmFtZS5lbmRzV2l0aChcIi50aGVtZS5jc3NcIikpcmV0dXJuIHJlbW92ZUNhbGxiYWNrKGhhc2gpXHJcbiAgICAgICAgICAgICAgICBjaGVja1ZpcnVzZXMoaGFzaCwgZGF0YSwgcmVzdWx0Q2FsbGJhY2ssIHJlbW92ZUNhbGxiYWNrLCBmaWxlbmFtZSlcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcy5qc29uKClcclxuICAgICAgICAgICAgcmVzdWx0Lmhhc2ggPSBoYXNoXHJcbiAgICAgICAgICAgIHJlc3VsdC5maWxlbmFtZSA9IGZpbGVuYW1lXHJcblxyXG4gICAgICAgICAgICBjYWNoZVtoYXNoXSA9IHJlc3VsdFxyXG5cclxuICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2socmVzdWx0KVxyXG4gICAgICAgIH0pLmNhdGNoKGNvbnNvbGUuZXJyb3IpXHJcbiAgICB9ZWxzZXtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBjYWNoZVtoYXNoXVxyXG5cclxuICAgICAgICByZXN1bHRDYWxsYmFjayhyZXN1bHQpXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzRmlsZShfX3BhdGgsIHJlc3VsdENhbGxiYWNrLCByZW1vdmVDYWxsYmFjayA9IChoYXNoKSA9PiB7fSwgaXNGcm9tTG9hZGVyID0gZmFsc2UpeyAgICBcclxuICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTI1NlwiKVxyXG4gICAgbGV0IGRhdGEgPSBCdWZmZXIuYWxsb2MoMClcclxuXHJcbiAgICBjcmVhdGVSZWFkU3RyZWFtKF9fcGF0aCkub24oXCJkYXRhXCIsIGNodW5rID0+IHtcclxuICAgICAgICBkYXRhID0gQnVmZmVyLmNvbmNhdChbZGF0YSwgY2h1bmtdKVxyXG4gICAgICAgIGhhc2gudXBkYXRlKGNodW5rKVxyXG4gICAgfSkub24oXCJlbmRcIiwgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGhhc2hSZXN1bHQgPSBoYXNoLmRpZ2VzdChcImhleFwiKVxyXG5cclxuICAgICAgICBoYXNoVG9VcmxbaGFzaFJlc3VsdF0gPSBfX3BhdGhcclxuXHJcbiAgICAgICAgaWYoaXNGcm9tTG9hZGVyICYmIGFkZG9uQ2FjaGVbaGFzaFJlc3VsdF0pe1xyXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBhZGRvbkNhY2hlW2hhc2hSZXN1bHRdXHJcbiAgICAgICAgICAgIGlmKHZhbHVlLnRpbWVzdGFtcCA8IChEYXRlLm5vdygpIC0gNi4wNDhlKzgpKXtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBhZGRvbkNhY2hlW2hhc2hSZXN1bHRdXHJcbiAgICAgICAgICAgICAgICBjb250ZW50TWFuYWdlci5zYXZlQWRkb25DYWNoZSgpXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2sodmFsdWUucmVzdWx0KVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNoZWNrSGFzaChoYXNoUmVzdWx0LCBkYXRhLCBiYXNlbmFtZShfX3BhdGgpLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2spXHJcbiAgICB9KVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0F0dGFjaG1lbnQoYXR0YWNobWVudCwgaWQpe1xyXG4gICAgaWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSlyZXR1cm5cclxuICAgIGlmKCFhdHRhY2htZW50LnVybC5zdGFydHNXaXRoKFwiaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vXCIpKXJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkucmVtb3ZlKClcclxuICAgIGlmKCFhdHRhY2htZW50LmZpbGVuYW1lLmVuZHNXaXRoKFwiLnBsdWdpbi5qc1wiKSAmJiAhYXR0YWNobWVudC5maWxlbmFtZS5lbmRzV2l0aChcIi50aGVtZS5jc3NcIikpcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5yZW1vdmUoKVxyXG5cclxuICAgIG5vZGVGZXRjaChhdHRhY2htZW50LnVybCwge1xyXG4gICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgXCJVc2VyLUFnZW50XCI6IGVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKS51c2VyQWdlbnRcclxuICAgICAgICB9XHJcbiAgICB9KS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXRocm93IG5ldyBFcnJvcihcIkZpbGUgZG9lc24ndCBleGlzdC5cIilcclxuICAgICAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGEyNTZcIilcclxuICAgICAgICBsZXQgZGF0YSA9IEJ1ZmZlci5hbGxvYygwKVxyXG4gICAgICAgIHJlcy5ib2R5Lm9uKFwiZGF0YVwiLCBjaHVuayA9PiB7XHJcbiAgICAgICAgICAgIGRhdGEgPSBCdWZmZXIuY29uY2F0KFtkYXRhLCBjaHVua10pXHJcbiAgICAgICAgICAgIGhhc2gudXBkYXRlKGNodW5rKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmVzLmJvZHkub24oXCJlbmRcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBoYXNoUmVzdWx0ID0gaGFzaC5kaWdlc3QoXCJoZXhcIilcclxuXHJcbiAgICAgICAgICAgIGNhY2hlMlthdHRhY2htZW50LnVybF0gPSBoYXNoUmVzdWx0XHJcbiAgICAgICAgICAgIGhhc2hUb1VybFtoYXNoUmVzdWx0XSA9IGF0dGFjaG1lbnQudXJsXHJcblxyXG4gICAgICAgICAgICBjaGVja0hhc2goaGFzaFJlc3VsdCwgZGF0YSwgYXR0YWNobWVudC5maWxlbmFtZSwgKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVuZGVyVG9FbGVtZW50cyhpZCwgcmVzdWx0LCBhdHRhY2htZW50LmZpbGVuYW1lKVxyXG4gICAgICAgICAgICB9LCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxyXG4gICAgICAgICAgICAgICAgaWYoZWxlbSllbGVtLnJlbW92ZSgpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH0pLmNhdGNoKCgpPT57fSlcclxufVxyXG5cclxubGV0IGZsb3dlclN0YXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbG93ZXJTdGFyQ29udGFpbmVyKVswXVxyXG5sZXQgY2hpbGRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGlsZENvbnRhaW5lcilbMF1cclxuXHJcbi8qKlxyXG4gKiBcclxuICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudFtdfSBlbGVtZW50cyBcclxuICogQHBhcmFtIHt7dHlwZTogXCJUaGVtZVwifFwiUGx1Z2luXCIsIG5hbWU6IHN0cmluZywgb2ZmaWNpYWw/OiBib29sZWFufXx7c3VzcGVjdDp0cnVlLCB0eXBlOiBcIlRoZW1lXCJ8XCJQbHVnaW5cIiwgbmFtZTogc3RyaW5nLCBoYXJtOiBzdHJpbmd9fSByZXN1bHRcclxuICovXHJcbmZ1bmN0aW9uIHJlbmRlclRvRWxlbWVudHMoaWQsIHJlc3VsdCwgZmlsZW5hbWUpe1xyXG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXHJcbiAgICBpZighZGl2IHx8IGRpdi5jaGlsZE5vZGVzLmxlbmd0aCA+IDApcmV0dXJuIC8vIGFscmVhZHkgY2VydGlmaWVkL2RpdiBkb2VzIG5vdCBleGlzdCBhbnltb3JlLlxyXG5cclxuICAgIGlmKCFmbG93ZXJTdGFyTW9kdWxlKWZsb3dlclN0YXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbG93ZXJTdGFyQ29udGFpbmVyKVswXVxyXG4gICAgaWYoIWNoaWxkTW9kdWxlKWNoaWxkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY2hpbGRDb250YWluZXIpWzBdXHJcbiAgICBcclxuICAgIGlmKHJlc3VsdC5zdXNwZWN0KXtcclxuICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgIGRpdi5wYXJlbnROb2RlLnN0eWxlLmJvcmRlckNvbG9yID0gXCJyZ2IoMjQwLCA3MSwgNzEpXCJcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIFxyXG4gICAgICAgICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIFxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgbGV0IG5leHROb2RlID0gKG5vZGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbil7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoY2hpbGQudGFnTmFtZSA9PT0gXCJBXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkb3dubG9hZCB0aGlzID9cIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJUaGUgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiAqKlwiK2ZpbGVuYW1lK1wiKiogbWlnaHQgYmUgZGFuZ2Vyb3VzICoqKFwiK3Jlc3VsdC5oYXJtK1wiKSoqLiBcXG5cXG4qKldlIGRvbid0IHJlY29tbWFuZCB0byBkb3dubG9hZCBpdCoqLiBIb3dldmVyLCB5b3UgY2FuIHN0aWxsIGRvIGl0IGJlbG93LlwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0OiBcIkRvd25sb2FkIEFueXdheVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxUZXh0OiBcIkRvbid0ICFcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFuZ2VyOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbDogKCkgPT4ge30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29uZmlybTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlY3Ryb24ucmVtb3RlLnNoZWxsLm9wZW5FeHRlcm5hbChjaGlsZC5ocmVmKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKFtcImRpdlwiXS5pbmNsdWRlcyhjaGlsZC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dE5vZGUoY2hpbGQpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5leHROb2RlKGRpdi5wYXJlbnROb2RlKVxyXG4gICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICAgIH1cclxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcihCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQodG9vbHRpcFdyYXAsIHt0ZXh0OiByZXN1bHQudHlwZStcIiBcIityZXN1bHQubmFtZStcIiBpcyBwb3RlbnRpYWxseSBkYW5nZXJvdXMuXCJ9LCBcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhckNvbnRhaW5lciwgc3R5bGU6IHt3aWR0aDogXCIyMHB4XCIsIGhlaWdodDogXCIyMHB4XCJ9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7Y2xhc3NOYW1lOiBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zdmcpWzBdLnN2ZywgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCA0MCAzMlwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgeDpcIjBcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgeTpcIjBcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6XCIzMlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6XCIzMlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXNrOlwidXJsKCNzdmctbWFzay1hdmF0YXItc3RhdHVzLXJvdW5kLTMyKVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsOlwiI2YwNDc0N1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXNrOlwidXJsKCNzdmctbWFzay1zdGF0dXMtZG5kKVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6QkRNb2R1bGVzLmdldChlID0+IGUucG9pbnRlckV2ZW50cylbMF0ucG9pbnRlckV2ZW50c1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApLCBkaXYpXHJcbiAgICB9ZWxzZSBpZighcmVzdWx0Lm9mZmljaWFsKXtcclxuICAgICAgICBkaXYucGFyZW50Tm9kZS5zdHlsZS5ib3JkZXJDb2xvciA9IFwiIzQwODdlZFwiXHJcbiAgICAgICAgbGV0IHNwYW4gPSBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtzdHlsZToge2Rpc3BsYXk6IFwiaW5oZXJpdFwifX0sIFtcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7dGV4dDogcmVzdWx0LnR5cGUrXCIgXCIrcmVzdWx0Lm5hbWUrXCIgaXMgY2VydGlmaWVkIGJ5IExpZ2h0Y29yZC5cIn0sIFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhckNvbnRhaW5lciwgc3R5bGU6IHt3aWR0aDogXCIyMHB4XCIsIGhlaWdodDogXCIyMHB4XCIsIGZsb2F0OiBcImxlZnRcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXIsIFwiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIyMHB4XCIsaGVpZ2h0OlwiMjBweFwiLHZpZXdCb3g6XCIwIDAgMTYgMTUuMlwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZmlsbDpcIiM0ZjU0NWNcIiwgXCJmaWxsLXJ1bGVcIjpcImV2ZW5vZGRcIixkOlwibTE2IDcuNmMwIC43OS0xLjI4IDEuMzgtMS41MiAyLjA5cy40NCAyIDAgMi41OS0xLjg0LjM1LTIuNDYuOC0uNzkgMS44NC0xLjU0IDIuMDktMS42Ny0uOC0yLjQ3LS44LTEuNzUgMS0yLjQ3LjgtLjkyLTEuNjQtMS41NC0yLjA5LTItLjE4LTIuNDYtLjguMjMtMS44NCAwLTIuNTktMS41NC0xLjMtMS41NC0yLjA5IDEuMjgtMS4zOCAxLjUyLTIuMDktLjQ0LTIgMC0yLjU5IDEuODUtLjM1IDIuNDgtLjguNzgtMS44NCAxLjUzLTIuMTIgMS42Ny44MyAyLjQ3LjgzIDEuNzUtMSAyLjQ3LS44LjkxIDEuNjQgMS41MyAyLjA5IDIgLjE4IDIuNDYuOC0uMjMgMS44NCAwIDIuNTkgMS41NCAxLjMgMS41NCAyLjA5elwifSlcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBjaGlsZE1vZHVsZS5jaGlsZENvbnRhaW5lcn0sIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1wiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIyMHB4XCIsaGVpZ2h0OlwiMjBweFwiLHZpZXdCb3g6XCIwIDAgMTYgMTUuMlwifSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtmaWxsOlwiI2ZmZmZmZlwiLGQ6XCJNNy40LDExLjE3LDQsOC42Miw1LDcuMjZsMiwxLjUzTDEwLjY0LDRsMS4zNiwxWlwifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7dGV4dDogXCJJbnN0YWxsIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiBvbiBMaWdodGNvcmQuXCJ9LCBcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXJDb250YWluZXIsIHN0eWxlOiB7d2lkdGg6IFwiMjBweFwiLCBoZWlnaHQ6IFwiMjBweFwifSwgb25DbGljaygpe1xyXG4gICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZG93bmxvYWQgdGhpcyBcIityZXN1bHQudHlwZS50b0xvd2VyQ2FzZSgpK1wiID9cIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiTGlnaHRjb3JkIHdpbGwgYXV0b21hdGljYWxseSBpbnN0YWxsIGFuZCBsYXVuY2ggdGhpcyBcIityZXN1bHQudHlwZS50b0xvd2VyQ2FzZSgpK1wiLiBZb3UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byBkby5cIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0OiBcIkRvd25sb2FkIGFuZCBJbnN0YWxsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxUZXh0OiBcIkkndmUgY2hhbmdlZCBteSBtaW5kXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYW5nZXI6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DYW5jZWw6ICgpID0+IHt9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Db25maXJtOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmsgPSBnZXRLZXllZEFycmF5KGNhY2hlMikuZmluZChlID0+IGVbMV0gPT09IHJlc3VsdC5oYXNoKVswXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGxpbmspXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUZldGNoKGxpbmspXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXRocm93IG5ldyBFcnJvcihcIlN0YXR1cyB3YXMgbm90IDIwMFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGF3YWl0IHJlcy5idWZmZXIoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5zdGFsbFBhdGggPSBqb2luKHJlc3VsdC50eXBlID09PSBcIlBsdWdpblwiID8gY29udGVudE1hbmFnZXIuX3BsdWdpbnNGb2xkZXIgOiBjb250ZW50TWFuYWdlci5fdGhlbWVzRm9sZGVyLCByZXN1bHQuZmlsZW5hbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGluc3RhbGxQYXRoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUZpbGVTeW5jKGluc3RhbGxQYXRoLCBjb250ZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QocmVzdWx0LnR5cGUrXCIgc3VjY2VzZnVsbHkgaW5zdGFsbGVkLlwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyIDogbmV3IEVycm9yKGVycilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KGVyci5tZXNzYWdlLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhciwgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCAyNCAyNFwiLHN0eWxlOntcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFwicmdiKDY3LCAxODEsIDEyOSlcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJmaWxsXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIF0pXHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoc3BhbiwgZGl2KVxyXG4gICAgfWVsc2V7XHJcbiAgICAgICAgZGl2LnBhcmVudE5vZGUuc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiM0MDg3ZWRcIlxyXG4gICAgICAgIGxldCBzcGFuID0gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7c3R5bGU6IHtkaXNwbGF5OiBcImluaGVyaXRcIn19LCBbXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IHJlc3VsdC50eXBlK1wiIFwiK3Jlc3VsdC5uYW1lK1wiIHdhcyBtYWRlIGJ5IHRoZSBkZXZlbG9wZXJzIG9mIExpZ2h0Y29yZC5cIiwgc3R5bGU6XCJicmFuZFwifSwgXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyQ29udGFpbmVyLCBzdHlsZToge3dpZHRoOiBcIjIwcHhcIiwgaGVpZ2h0OiBcIjIwcHhcIiwgZmxvYXQ6IFwibGVmdFwifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhciwgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCAxNiAxNS4yXCIsc3Ryb2tlOlwiIzM2MzkzZlwiLHN0eWxlOntjb2xvcjpcIiM0MDg3ZWRcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtmaWxsOlwiY3VycmVudENvbG9yXCIsIFwiZmlsbC1ydWxlXCI6XCJldmVub2RkXCIsZDpcIm0xNiA3LjZjMCAuNzktMS4yOCAxLjM4LTEuNTIgMi4wOXMuNDQgMiAwIDIuNTktMS44NC4zNS0yLjQ2LjgtLjc5IDEuODQtMS41NCAyLjA5LTEuNjctLjgtMi40Ny0uOC0xLjc1IDEtMi40Ny44LS45Mi0xLjY0LTEuNTQtMi4wOS0yLS4xOC0yLjQ2LS44LjIzLTEuODQgMC0yLjU5LTEuNTQtMS4zLTEuNTQtMi4wOSAxLjI4LTEuMzggMS41Mi0yLjA5LS40NC0yIDAtMi41OSAxLjg1LS4zNSAyLjQ4LS44Ljc4LTEuODQgMS41My0yLjEyIDEuNjcuODMgMi40Ny44MyAxLjc1LTEgMi40Ny0uOC45MSAxLjY0IDEuNTMgMi4wOSAyIC4xOCAyLjQ2LjgtLjIzIDEuODQgMCAyLjU5IDEuNTQgMS4zIDEuNTQgMi4wOXpcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogY2hpbGRNb2R1bGUuY2hpbGRDb250YWluZXJ9LCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDE2IDE1LjJcIn0sIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZmlsbDpcIiNmZmZmZmZcIixkOlwiTTEwLjcsNS4yOGEyLjksMi45LDAsMCwwLTIuMTEuODYuMTEuMTEsMCwwLDAsMCwuMTZsMS4wNS45NGEuMTEuMTEsMCwwLDAsLjE1LDAsMS4yNywxLjI3LDAsMCwxLC45LS4zM2MuNjUsMCwuNjUuNzMuNjUuNzNhLjY0LjY0LDAsMCwxLS42NS42NSwxLjczLDEuNzMsMCwwLDEtMS4xOC0uNTRjLS4zMS0uMjYtLjM2LS4zMi0uNzMtLjY2UzcuMDYsNS4yOCw1LjY1LDUuMjhBMi4yNiwyLjI2LDAsMCwwLDMuMzcsNy41NiwyLjU5LDIuNTksMCwwLDAsMy44Miw5YTIuMTgsMi4xOCwwLDAsMCwxLjgzLjg5LDIuOTQsMi45NCwwLDAsMCwyLjEtLjgxLjExLjExLDAsMCwwLDAtLjE2TDYuNzQsOEEuMTEuMTEsMCwwLDAsNi42LDhhMS41OCwxLjU4LDAsMCwxLS45NC4yOWgwQS43MS43MSwwLDAsMSw1LDcuNTZINWEuNjMuNjMsMCwwLDEsLjY1LS42NGMuNzEsMCwxLjQyLjc1LDEuOTQsMS4yNy43NS43NiwxLjY2LDEuNzksMy4xMSwxLjc0QTIuMjgsMi4yOCwwLDAsMCwxMyw3LjY0YTIuNTksMi41OSwwLDAsMC0uNDUtMS40N0EyLjE0LDIuMTQsMCwwLDAsMTAuNyw1LjI4WlwifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7dGV4dDogXCJJbnN0YWxsIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiBvbiBMaWdodGNvcmQuXCJ9LCBcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXJDb250YWluZXIsIHN0eWxlOiB7d2lkdGg6IFwiMjBweFwiLCBoZWlnaHQ6IFwiMjBweFwifSwgb25DbGljaygpe1xyXG4gICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZG93bmxvYWQgdGhpcyBcIityZXN1bHQudHlwZS50b0xvd2VyQ2FzZSgpK1wiID9cIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiTGlnaHRjb3JkIHdpbGwgYXV0b21hdGljYWxseSBkb3dubG9hZCBhbmQgbG9hZCB0aGlzIFwiK3Jlc3VsdC50eXBlLnRvTG93ZXJDYXNlKCkrXCIuIFlvdSBtdXN0IGVuYWJsZSBpdCBpbiB0aGUgc2V0dGluZ3MuXCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogXCJEb3dubG9hZCBhbmQgSW5zdGFsbFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsVGV4dDogXCJJJ3ZlIGNoYW5nZWQgbXkgbWluZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFuZ2VyOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsOiAoKSA9PiB7fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29uZmlybTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rID0gZ2V0S2V5ZWRBcnJheShjYWNoZTIpLmZpbmQoZSA9PiBlWzFdID09PSByZXN1bHQuaGFzaClbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlRmV0Y2gobGluaylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihhc3luYyByZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApdGhyb3cgbmV3IEVycm9yKFwiU3RhdHVzIHdhcyBub3QgMjAwXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgcmVzLmJ1ZmZlcigpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbnN0YWxsUGF0aCA9IGpvaW4ocmVzdWx0LnR5cGUgPT09IFwiUGx1Z2luXCIgPyBjb250ZW50TWFuYWdlci5fcGx1Z2luc0ZvbGRlciA6IGNvbnRlbnRNYW5hZ2VyLl90aGVtZXNGb2xkZXIsIHJlc3VsdC5maWxlbmFtZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRmlsZVN5bmMoaW5zdGFsbFBhdGgsIGNvbnRlbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChyZXN1bHQudHlwZStcIiBzdWNjZXNmdWxseSBpbnN0YWxsZWQuXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiBuZXcgRXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoZXJyLm1lc3NhZ2UsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZXJyb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyLCBcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDI0IDI0XCIsc3R5bGU6e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogXCJyZ2IoNjcsIDE4MSwgMTI5KVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IFwicG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxnIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBjbGFzcz1cImZpbGxcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk0xOSA5aC00VjNIOXY2SDVsNyA3IDctN3pNNSAxOHYyaDE0di0ySDV6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgXSlcclxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcihzcGFuLCBkaXYpXHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEtleWVkQXJyYXkob2JqKXtcclxuICAgIGxldCBhcnIgPSBbXVxyXG4gICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGsgPT4ge1xyXG4gICAgICAgIGFyci5wdXNoKFtrLCBvYmpba11dKVxyXG4gICAgfSlcclxuICAgIHJldHVybiBhcnJcclxufVxyXG5cclxubGV0IGtleSA9IG51bGxcclxubGV0IHNhdmUgPSBudWxsXHJcblxyXG53aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChtPT5tLk9iamVjdFN0b3JhZ2UpXHJcbi50aGVuKGxvY2FsU3RvcmFnZU1vZHVsZSA9PiB7XHJcbiAgICBsZXQgbG9jYWxTdG9yYWdlID0gbG9jYWxTdG9yYWdlTW9kdWxlLmltcGxcclxuICAgIHNhdmUgPSBmdW5jdGlvbigpe1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXQoXCJQbHVnaW5DZXJ0aWZpZXJLZXlFbmNyeXB0aW9uX19cIiwgYnRvYShKU09OLnN0cmluZ2lmeShrZXkpKSlcclxuICAgIH1cclxuICAgIHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICBzYXZlKClcclxuICAgIH0sIDEwMDAwMCk7XHJcbiAgICB0cnl7XHJcbiAgICAgICAgbGV0IHZhbCA9IHNhZmVKU09OUGFyc2UoYXRvYihsb2NhbFN0b3JhZ2UuZ2V0KFwiUGx1Z2luQ2VydGlmaWVyS2V5RW5jcnlwdGlvbl9fXCIpKSlcclxuICAgICAgICBpZih2YWwgaW5zdGFuY2VvZiBFcnJvciB8fCAhQXJyYXkuaXNBcnJheSh2YWwpIHx8IHZhbC5sZW5ndGggIT09IDIgfHwgdmFsLmZpbmQoZSA9PiB0eXBlb2YgZSAhPT0gXCJzdHJpbmdcIikgfHwgQnVmZmVyLmZyb20odmFsWzBdLCBcImJhc2U2NFwiKS5sZW5ndGggIT09IDE2IHx8IEJ1ZmZlci5mcm9tKHZhbFsxXSwgXCJiYXNlNjRcIikubGVuZ3RoICE9PSAzMil7XHJcbiAgICAgICAgICAgIGdlbmVyYXRlS2V5KClcclxuICAgICAgICAgICAgc2F2ZSgpXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICBrZXkgPSB2YWxcclxuICAgIH1jYXRjaChlKXtcclxuICAgICAgICBnZW5lcmF0ZUtleSgpXHJcbiAgICAgICAgc2F2ZSgpXHJcbiAgICB9XHJcbn0pXHJcblxyXG5mdW5jdGlvbiBnZW5lcmF0ZUtleSgpe1xyXG4gICAga2V5ID0gW2NyeXB0by5yYW5kb21CeXRlcygxNikudG9TdHJpbmcoXCJiYXNlNjRcIiksIGNyeXB0by5yYW5kb21CeXRlcygzMikudG9TdHJpbmcoXCJiYXNlNjRcIildXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNhZmVKU09OUGFyc2UoanNvbil7XHJcbiAgICB0cnl7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoanNvbilcclxuICAgIH1jYXRjaChlKXtcclxuICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIEVycm9yID8gbmV3IEVycm9yKGUpIDogZVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGVjcnlwdFNldHRpbmdzQ2FjaGUoZGF0YSl7XHJcbiAgICB0cnl7XHJcbiAgICAgICAgbGV0IGRlY2lwaGVyID0gY3J5cHRvLmNyZWF0ZURlY2lwaGVyaXYoXCJhZXMtMjU2LWNiY1wiLCBCdWZmZXIuZnJvbShrZXlbMV0sIFwiYmFzZTY0XCIpLCBCdWZmZXIuZnJvbShrZXlbMF0sIFwiYmFzZTY0XCIpKVxyXG4gICAgICAgIGxldCBkZWNyeXB0ZWQgPSBkZWNpcGhlci51cGRhdGUoQnVmZmVyLmZyb20oZGF0YSwgXCJiYXNlNjRcIikpO1xyXG4gICAgICAgIGRlY3J5cHRlZCA9IEJ1ZmZlci5jb25jYXQoW2RlY3J5cHRlZCwgZGVjaXBoZXIuZmluYWwoKV0pO1xyXG4gICAgICAgIHJldHVybiBkZWNyeXB0ZWQudG9TdHJpbmcoXCJ1dGY4XCIpXHJcbiAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgcmV0dXJuIFwie31cIlxyXG4gICAgfVxyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBlbmNyeXB0U2V0dGluZ3NDYWNoZShkYXRhKXtcclxuICAgIGxldCBhcmdzID0gW0J1ZmZlci5mcm9tKGtleVsxXSwgXCJiYXNlNjRcIiksIEJ1ZmZlci5mcm9tKGtleVswXSwgXCJiYXNlNjRcIildXHJcbiAgICBcclxuICAgIGxldCBjaXBoZXIgPSBjcnlwdG8uY3JlYXRlQ2lwaGVyaXYoJ2Flcy0yNTYtY2JjJywgLi4uYXJncyk7XHJcbiAgICBsZXQgZW5jcnlwdGVkID0gY2lwaGVyLnVwZGF0ZShCdWZmZXIuZnJvbShkYXRhLCBcInV0ZjhcIikpO1xyXG4gICAgZW5jcnlwdGVkID0gQnVmZmVyLmNvbmNhdChbZW5jcnlwdGVkLCBjaXBoZXIuZmluYWwoKV0pO1xyXG4gICAgcmV0dXJuIGVuY3J5cHRlZC50b1N0cmluZyhcImJhc2U2NFwiKVxyXG59IiwiaW1wb3J0IHtiZHBsdWdpbkVycm9ycywgcGx1Z2luQ29va2llLCBzZXR0aW5nc0Nvb2tpZSwgYmRwbHVnaW5zfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBCREV2ZW50cyBmcm9tIFwiLi9iZEV2ZW50c1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmNsYXNzIFBsdWdpbk1vZHVsZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5QbHVnaW5Nb2R1bGUgPSB0aGlzXHJcbiAgICB9XHJcbiAgICBnZXQgZm9sZGVyKCkge3JldHVybiBDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyO31cclxufVxyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5sb2FkUGx1Z2lucyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcclxuICAgIHRoaXMubG9hZFBsdWdpbkRhdGEoKTtcclxuICAgIGJkcGx1Z2luRXJyb3JzLnNwbGljZSgwLCAwLCAuLi4oYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZFBsdWdpbnMoKSkpO1xyXG4gICAgY29uc3QgcGx1Z2lucyA9IE9iamVjdC5rZXlzKGJkcGx1Z2lucyk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgcGx1Z2luLCBuYW1lO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBwbHVnaW4gPSBiZHBsdWdpbnNbcGx1Z2luc1tpXV0ucGx1Z2luO1xyXG4gICAgICAgICAgICBuYW1lID0gcGx1Z2luLmdldE5hbWUoKTtcclxuICAgICAgICAgICAgaWYgKHBsdWdpbi5sb2FkICYmIHR5cGVvZihwbHVnaW4ubG9hZCkgPT0gXCJmdW5jdGlvblwiKSBwbHVnaW4ubG9hZCgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBwbHVnaW5Db29raWVbbmFtZV0gPSBmYWxzZTtcclxuICAgICAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBuYW1lICsgXCIgY291bGQgbm90IGJlIGxvYWRlZC5cIiwgZXJyKTtcclxuICAgICAgICAgICAgYmRwbHVnaW5FcnJvcnMucHVzaCh7bmFtZTogbmFtZSwgZmlsZTogYmRwbHVnaW5zW3BsdWdpbnNbaV1dLmZpbGVuYW1lLCBtZXNzYWdlOiBcImxvYWQoKSBjb3VsZCBub3QgYmUgZmlyZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyLm1lc3NhZ2UsIHN0YWNrOiBlcnIuc3RhY2t9fSk7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbbmFtZV0pIHBsdWdpbkNvb2tpZVtuYW1lXSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAocGx1Z2luQ29va2llW25hbWVdKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBwbHVnaW4uc3RhcnQoKTtcclxuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbi5nZXROYW1lKCl9IHYke3BsdWdpbi5nZXRWZXJzaW9uKCl9IGhhcyBzdGFydGVkLmApO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIHBsdWdpbkNvb2tpZVtuYW1lXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBuYW1lICsgXCIgY291bGQgbm90IGJlIHN0YXJ0ZWQuXCIsIGVycik7XHJcbiAgICAgICAgICAgICAgICBiZHBsdWdpbkVycm9ycy5wdXNoKHtuYW1lOiBuYW1lLCBmaWxlOiBiZHBsdWdpbnNbcGx1Z2luc1tpXV0uZmlsZW5hbWUsIG1lc3NhZ2U6IFwic3RhcnQoKSBjb3VsZCBub3QgYmUgZmlyZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyLm1lc3NhZ2UsIHN0YWNrOiBlcnIuc3RhY2t9fSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwKSlcclxuICAgIH1cclxuICAgIHRoaXMuc2F2ZVBsdWdpbkRhdGEoKTtcclxuXHJcbiAgICByZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpLm9uKFwiZGlkLW5hdmlnYXRlLWluLXBhZ2VcIiwgdGhpcy5jaGFubmVsU3dpdGNoLmJpbmQodGhpcykpO1xyXG4gICAgLy8gaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy01XCJdKSBDb250ZW50TWFuYWdlci53YXRjaENvbnRlbnQoXCJwbHVnaW5cIik7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnN0YXJ0UGx1Z2luID0gZnVuY3Rpb24ocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uc3RhcnQoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCl9IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IGhhcyBzdGFydGVkLmApO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldE5hbWUoKX0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gY291bGQgbm90IGJlIHN0YXJ0ZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xyXG4gICAgICAgIHBsdWdpbkNvb2tpZVtwbHVnaW5dID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zYXZlUGx1Z2luRGF0YSgpO1xyXG4gICAgICAgIFV0aWxzLmVycihcIlBsdWdpbnNcIiwgcGx1Z2luICsgXCIgY291bGQgbm90IGJlIHN0YXJ0ZWQuXCIsIGVycik7XHJcbiAgICB9XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnN0b3BQbHVnaW4gPSBmdW5jdGlvbihwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5zdG9wKCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpfSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSBoYXMgc3RvcHBlZC5gKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCl9IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IGNvdWxkIG5vdCBiZSBzdG9wcGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCkgKyBcIiBjb3VsZCBub3QgYmUgc3RvcHBlZC5cIiwgZXJyKTtcclxuICAgIH1cclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZW5hYmxlUGx1Z2luID0gZnVuY3Rpb24gKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIGlmIChwbHVnaW5Db29raWVbcGx1Z2luXSkgcmV0dXJuO1xyXG4gICAgcGx1Z2luQ29va2llW3BsdWdpbl0gPSB0cnVlO1xyXG4gICAgdGhpcy5zYXZlUGx1Z2luRGF0YSgpO1xyXG4gICAgdGhpcy5zdGFydFBsdWdpbihwbHVnaW4sIHJlbG9hZCk7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lbmFibGVQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5kaXNhYmxlUGx1Z2luID0gZnVuY3Rpb24gKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIGlmICghcGx1Z2luQ29va2llW3BsdWdpbl0pIHJldHVybjtcclxuICAgIHBsdWdpbkNvb2tpZVtwbHVnaW5dID0gZmFsc2U7XHJcbiAgICB0aGlzLnNhdmVQbHVnaW5EYXRhKCk7XHJcbiAgICB0aGlzLnN0b3BQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHJldHVybiB0aGlzLmRpc2FibGVQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS50b2dnbGVQbHVnaW4gPSBmdW5jdGlvbiAocGx1Z2luKSB7XHJcbiAgICBpZiAocGx1Z2luQ29va2llW3BsdWdpbl0pIHRoaXMuZGlzYWJsZVBsdWdpbihwbHVnaW4pO1xyXG4gICAgZWxzZSB0aGlzLmVuYWJsZVBsdWdpbihwbHVnaW4pO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlUGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUubG9hZFBsdWdpbiA9IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lKSB7XHJcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IENvbnRlbnRNYW5hZ2VyLmxvYWRDb250ZW50KGZpbGVuYW1lLCBcInBsdWdpblwiKTtcclxuICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IFtlcnJvcl19KTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtmaWxlbmFtZX0gY291bGQgbm90IGJlIGxvYWRlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke2ZpbGVuYW1lfSBjb3VsZCBub3QgYmUgbG9hZGVkLmAsIGVycm9yKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKS5maW5kKHAgPT4gKGNvbnNvbGUubG9nKHAuZmlsZW5hbWUsIGZpbGVuYW1lKSkgfHwgcC5maWxlbmFtZSA9PSBmaWxlbmFtZSkucGx1Z2luO1xyXG4gICAgdHJ5IHsgaWYgKHBsdWdpbi5sb2FkICYmIHR5cGVvZihwbHVnaW4ubG9hZCkgPT0gXCJmdW5jdGlvblwiKSBwbHVnaW4ubG9hZCgpO31cclxuICAgIGNhdGNoIChlcnIpIHtpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBbZXJyXX0pO31cclxuICAgIFV0aWxzLmxvZyhcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3BsdWdpbi5nZXROYW1lKCl9IHYke3BsdWdpbi5nZXRWZXJzaW9uKCl9IHdhcyBsb2FkZWQuYCk7XHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW4uZ2V0TmFtZSgpfSB2JHtwbHVnaW4uZ2V0VmVyc2lvbigpfSB3YXMgbG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xyXG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJwbHVnaW4tbG9hZGVkXCIsIHBsdWdpbi5nZXROYW1lKCkpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS51bmxvYWRQbHVnaW4gPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xyXG4gICAgY29uc3QgYmRwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkcGx1Z2luc1tmaWxlbmFtZU9yTmFtZV07XHJcbiAgICBpZiAoIWJkcGx1Z2luKSByZXR1cm47XHJcbiAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbi5wbHVnaW4uZ2V0TmFtZSgpO1xyXG4gICAgaWYgKHBsdWdpbkNvb2tpZVtwbHVnaW5dKSB0aGlzLmRpc2FibGVQbHVnaW4ocGx1Z2luLCB0cnVlKTtcclxuICAgIGNvbnN0IGVycm9yID0gQ29udGVudE1hbmFnZXIudW5sb2FkQ29udGVudChiZHBsdWdpbnNbcGx1Z2luXS5maWxlbmFtZSwgXCJwbHVnaW5cIik7XHJcbiAgICBkZWxldGUgYmRwbHVnaW5zW3BsdWdpbl07XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBbZXJyb3JdfSk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2lufSBjb3VsZCBub3QgYmUgdW5sb2FkZWQuIEl0IG1heSBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xyXG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW59IGNvdWxkIG5vdCBiZSB1bmxvYWRlZC4gSXQgbWF5IGhhdmUgbm90IGJlZW4gbG9hZGVkIHlldC5gLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW59IHdhcyB1bmxvYWRlZC5gKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbn0gd2FzIHVubG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xyXG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJwbHVnaW4tdW5sb2FkZWRcIiwgcGx1Z2luKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHBsdWdpbnNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xyXG4gICAgdGhpcy51bmxvYWRQbHVnaW4oYmRwbHVnaW4uZmlsZW5hbWUpO1xyXG4gICAgY29uc3QgZnVsbFBhdGggPSByZXF1aXJlKFwicGF0aFwiKS5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIsIGJkcGx1Z2luLmZpbGVuYW1lKTtcclxuICAgIHJlcXVpcmUoXCJmc1wiKS51bmxpbmtTeW5jKGZ1bGxQYXRoKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUucmVsb2FkUGx1Z2luID0gYXN5bmMgZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHBsdWdpbnNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuIHRoaXMubG9hZFBsdWdpbihmaWxlbmFtZU9yTmFtZSk7XHJcbiAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbi5wbHVnaW4uZ2V0TmFtZSgpO1xyXG4gICAgY29uc3QgZW5hYmxlZCA9IHBsdWdpbkNvb2tpZVtwbHVnaW5dO1xyXG4gICAgaWYgKGVuYWJsZWQpIHRoaXMuc3RvcFBsdWdpbihwbHVnaW4sIHRydWUpO1xyXG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCBDb250ZW50TWFuYWdlci5yZWxvYWRDb250ZW50KGJkcGx1Z2luc1twbHVnaW5dLmZpbGVuYW1lLCBcInBsdWdpblwiKTtcclxuICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IFtlcnJvcl19KTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW59IGNvdWxkIG5vdCBiZSByZWxvYWRlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3BsdWdpbn0gY291bGQgbm90IGJlIHJlbG9hZGVkLmAsIGVycm9yKTtcclxuICAgIH1cclxuICAgIGlmIChiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4ubG9hZCAmJiB0eXBlb2YoYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmxvYWQpID09IFwiZnVuY3Rpb25cIikgYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmxvYWQoKTtcclxuICAgIGlmIChlbmFibGVkKSB0aGlzLnN0YXJ0UGx1Z2luKHBsdWdpbiwgdHJ1ZSk7XHJcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW59IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IHdhcyByZWxvYWRlZC5gKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbn0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gd2FzIHJlbG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xyXG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJwbHVnaW4tcmVsb2FkZWRcIiwgcGx1Z2luKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUucmVsb2FkID0gZnVuY3Rpb24obmFtZSkge1xyXG4gICAgcmV0dXJuIHRoaXMucmVsb2FkUGx1Z2luKG5hbWUpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5lZGl0ID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiRWRpdCBcIiArIGZpbGVuYW1lT3JOYW1lKTtcclxuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHBsdWdpbnNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xyXG4gICAgY29uc3QgZnVsbFBhdGggPSByZXF1aXJlKFwicGF0aFwiKS5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIsIGJkcGx1Z2luLmZpbGVuYW1lKTtcclxuICAgIGNvbnNvbGUubG9nKFwiRWRpdCBcIiArIGZ1bGxQYXRoKTtcclxuICAgIHJlcXVpcmUoXCJlbGVjdHJvblwiKS5zaGVsbC5vcGVuSXRlbShgJHtmdWxsUGF0aH1gKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUudXBkYXRlUGx1Z2luTGlzdCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3QgcmVzdWx0cyA9IENvbnRlbnRNYW5hZ2VyLmxvYWROZXdDb250ZW50KFwicGx1Z2luXCIpO1xyXG4gICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiByZXN1bHRzLmFkZGVkKSB0aGlzLmxvYWRQbHVnaW4oZmlsZW5hbWUpO1xyXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHJlc3VsdHMucmVtb3ZlZCkgdGhpcy51bmxvYWRQbHVnaW4obmFtZSk7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmxvYWRQbHVnaW5EYXRhID0gZnVuY3Rpb24gKCkge1xyXG4gICAgY29uc3Qgc2F2ZWQgPSBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicGx1Z2luc1wiKTtcclxuICAgIGlmIChzYXZlZCkge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24ocGx1Z2luQ29va2llLCBzYXZlZCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnNhdmVQbHVnaW5EYXRhID0gZnVuY3Rpb24gKCkge1xyXG4gICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInBsdWdpbnNcIiwgcGx1Z2luQ29va2llKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUubmV3TWVzc2FnZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGNvbnN0IHBsdWdpbnMgPSBPYmplY3Qua2V5cyhiZHBsdWdpbnMpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW5zW3BsdWdpbnNbaV1dLnBsdWdpbjtcclxuICAgICAgICBpZiAoIXBsdWdpbkNvb2tpZVtwbHVnaW4uZ2V0TmFtZSgpXSkgY29udGludWU7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW4ub25NZXNzYWdlID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgdHJ5IHsgcGx1Z2luLm9uTWVzc2FnZSgpOyB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBcIlVuYWJsZSB0byBmaXJlIG9uTWVzc2FnZSBmb3IgXCIgKyBwbHVnaW4uZ2V0TmFtZSgpICsgXCIuXCIsIGVycik7IH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmNoYW5uZWxTd2l0Y2ggPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmtleXMoYmRwbHVnaW5zKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5wbHVnaW47XHJcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbcGx1Z2luLmdldE5hbWUoKV0pIGNvbnRpbnVlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgcGx1Z2luLm9uU3dpdGNoID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgdHJ5IHsgcGx1Z2luLm9uU3dpdGNoKCk7IH1cclxuICAgICAgICAgICAgY2F0Y2ggKGVycikgeyBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIFwiVW5hYmxlIHRvIGZpcmUgb25Td2l0Y2ggZm9yIFwiICsgcGx1Z2luLmdldE5hbWUoKSArIFwiLlwiLCBlcnIpOyB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5yYXdPYnNlcnZlciA9IGZ1bmN0aW9uKGUpIHtcclxuICAgIGNvbnN0IHBsdWdpbnMgPSBPYmplY3Qua2V5cyhiZHBsdWdpbnMpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW5zW3BsdWdpbnNbaV1dLnBsdWdpbjtcclxuICAgICAgICBpZiAoIXBsdWdpbkNvb2tpZVtwbHVnaW4uZ2V0TmFtZSgpXSkgY29udGludWU7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW4ub2JzZXJ2ZXIgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICB0cnkgeyBwbHVnaW4ub2JzZXJ2ZXIoZSk7IH1cclxuICAgICAgICAgICAgY2F0Y2ggKGVycikgeyBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIFwiVW5hYmxlIHRvIGZpcmUgb2JzZXJ2ZXIgZm9yIFwiICsgcGx1Z2luLmdldE5hbWUoKSArIFwiLlwiLCBlcnIpOyB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IFBsdWdpbk1vZHVsZSgpOyIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgd2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmltcG9ydCBWMkNfUHVibGljU2VydmVycyBmcm9tIFwiLi4vdWkvcHVibGljc2VydmVycy9wdWJsaWNTZXJ2ZXJzXCI7XHJcbmltcG9ydCBMYXllciBmcm9tIFwiLi4vdWkvcHVibGljc2VydmVycy9sYXllclwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFYyX1B1YmxpY1NlcnZlcnMge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuX2FwcGVuZEJ1dHRvbiA9IHRoaXMuX2FwcGVuZEJ1dHRvbi5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5WMl9QdWJsaWNTZXJ2ZXJzID0gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChMYXllciwge3Jvb3RJZDogXCJwdWJzbGF5ZXJyb290XCIsIGlkOiBcInB1YnNsYXllclwifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19QdWJsaWNTZXJ2ZXJzLCB7cm9vdElkOiBcInB1YnNsYXllcnJvb3RcIn0pKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcm9vdCgpIHtcclxuICAgICAgICBjb25zdCBfcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicHVic2xheWVycm9vdFwiKTtcclxuICAgICAgICBpZiAoIV9yb290KSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbmplY3RSb290KCkpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX3Jvb3Q7XHJcbiAgICB9XHJcblxyXG4gICAgaW5qZWN0Um9vdCgpIHtcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBjbGFzc05hbWVMYXllcnNcclxuICAgICAgICBdID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5sYXllcnMgJiYgZS5sYXllcilbMF0ubGF5ZXJzLnNwbGl0KFwiIFwiKVswXVxyXG4gICAgICAgIF1cclxuICAgICAgICBjb25zdCBsYXllcnMgPSBET00ucXVlcnkoXCIubGF5ZXJzLCAuXCIrY2xhc3NOYW1lTGF5ZXJzKTtcclxuICAgICAgICBpZiAoIWxheWVycykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGxheWVycy5hcHBlbmQoRE9NLmNyZWF0ZUVsZW1lbnQoXCI8ZGl2IGlkPSdwdWJzbGF5ZXJyb290Jz5cIikpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCByb290ID0gdGhpcy5yb290O1xyXG4gICAgICAgIGlmICghcm9vdCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkZBSUxFRCBUTyBMT0NBVEUgUk9PVDogLmxheWVyc1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcih0aGlzLmNvbXBvbmVudCwgcm9vdCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGJ1dHRvbigpIHtcclxuICAgICAgICBjb25zdCBidG4gPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBpZD1cImJkLXB1Yi1saVwiIGNsYXNzPVwiJHtCRFYyLmd1aWxkQ2xhc3Nlcy5saXN0SXRlbX1cIj5gKTtcclxuICAgICAgICBpZiAoIXNldHRpbmdzQ29va2llW1wiYmRhLWdzLTFcIl0pIGJ0bi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgY29uc3QgbGFiZWwgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBpZD1cImJkLXB1Yi1idXR0b25cIiBjbGFzcz1cIiR7XCJ3cmFwcGVyLTI1ZVZJbiBcIiArIEJEVjIuZ3VpbGRDbGFzc2VzLmNpcmNsZUJ1dHRvbk1hc2t9XCI+cHVibGljPC9kaXY+YCk7XHJcbiAgICAgICAgbGFiZWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHt0aGlzLnJlbmRlcigpO30pO1xyXG4gICAgICAgIGJ0bi5hcHBlbmQobGFiZWwpO1xyXG4gICAgICAgIHJldHVybiBidG47XHJcbiAgICB9XHJcblxyXG4gICAgX2FwcGVuZEJ1dHRvbigpIHtcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBjbGFzc05hbWV0dXRvcmlhbENvbnRhaW5lclxyXG4gICAgICAgIF0gPSBbXHJcbiAgICAgICAgICAgIFV0aWxzLnJlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLmRvd25sb2FkUHJvZ3Jlc3MgJiYgZS50dXRvcmlhbENvbnRhaW5lcilbMF0udHV0b3JpYWxDb250YWluZXIpXHJcbiAgICAgICAgXVxyXG4gICAgICAgIGlmIChET00ucXVlcnkoXCIjYmQtcHViLWxpXCIpKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgZ3VpbGRzID0gRE9NLnF1ZXJ5KGBkaXYuJHtjbGFzc05hbWV0dXRvcmlhbENvbnRhaW5lcn0gPiBkaXZgKTtcclxuICAgICAgICBET00uYWZ0ZXIoZ3VpbGRzLCB0aGlzLmJ1dHRvbik7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkQnV0dG9uKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmd1aWxkUGF0Y2gpIHJldHVybjtcclxuICAgICAgICBjb25zdCBHdWlsZExpc3QgPSB3ZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0ICYmIG0uZGVmYXVsdC5kaXNwbGF5TmFtZSA9PSBcIk5hdmlnYWJsZUd1aWxkc1wiKTtcclxuICAgICAgICBjb25zdCBHdWlsZExpc3RPbGQgPSB3ZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIkd1aWxkc1wiKTtcclxuICAgICAgICBpZiAoIUd1aWxkTGlzdCAmJiAhR3VpbGRMaXN0T2xkKSBVdGlscy53YXJuKFwiUHVibGljU2VydmVyXCIsIFwiQ2FuJ3QgZmluZCBHdWlsZExpc3QgY29tcG9uZW50XCIpO1xyXG4gICAgICAgIHRoaXMuZ3VpbGRQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKEd1aWxkTGlzdCA/IEd1aWxkTGlzdCA6IEd1aWxkTGlzdE9sZC5wcm90b3R5cGUsIEd1aWxkTGlzdCA/IFwiZGVmYXVsdFwiIDogXCJyZW5kZXJcIiwge2FmdGVyOiB0aGlzLl9hcHBlbmRCdXR0b259KTtcclxuICAgICAgICB0aGlzLl9hcHBlbmRCdXR0b24oKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVCdXR0b24oKSB7XHJcbiAgICAgICAgdGhpcy5ndWlsZFBhdGNoKCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuZ3VpbGRQYXRjaDtcclxuICAgICAgICBET00ucXVlcnkoXCIjYmQtcHViLWxpXCIpLnJlbW92ZSgpO1xyXG4gICAgfVxyXG59OyIsImltcG9ydCB7c2V0dGluZ3MsIHNldHRpbmdzQ29va2llLCBzZXR0aW5nc1JQQ30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBWMl9TZXR0aW5nc1BhbmVsX1NpZGViYXIgZnJvbSBcIi4vc2V0dGluZ3NQYW5lbFNpZGViYXJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgY29sb3JlZFRleHQgZnJvbSBcIi4vY29sb3JlZFRleHRcIjtcclxuaW1wb3J0IHRmSG91ciBmcm9tIFwiLi8yNGhvdXJcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuaW1wb3J0IHB1YmxpY1NlcnZlcnNNb2R1bGUgZnJvbSBcIi4vcHVibGljU2VydmVyc1wiO1xyXG5pbXBvcnQgdm9pY2VNb2RlIGZyb20gXCIuL3ZvaWNlTW9kZVwiO1xyXG5pbXBvcnQgQ2xhc3NOb3JtYWxpemVyIGZyb20gXCIuL2NsYXNzTm9ybWFsaXplclwiO1xyXG5pbXBvcnQgZE1vZGUgZnJvbSBcIi4vZGV2TW9kZVwiO1xyXG5cclxuaW1wb3J0IFNlY3Rpb25lZFNldHRpbmdzUGFuZWwgZnJvbSBcIi4uL3VpL3NlY3Rpb25lZFNldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IENzc0VkaXRvciBmcm9tIFwiLi4vdWkvY3NzRWRpdG9yXCI7XHJcbmltcG9ydCBDYXJkTGlzdCBmcm9tIFwiLi4vdWkvYWRkb25saXN0XCI7XHJcbmltcG9ydCBWMkNfUHJlc2VuY2VTZXR0aW5ncyBmcm9tIFwiLi4vdWkvcHJlc2VuY2VTZXR0aW5nc1wiO1xyXG5pbXBvcnQgQ3VzdG9tUmljaFByZXNlbmNlIGZyb20gXCIuL0N1c3RvbVJpY2hQcmVzZW5jZVwiO1xyXG5pbXBvcnQgVjJDX0FjY291bnRJbmZvcyBmcm9tIFwiLi4vdWkvQWNjb3VudEluZm9zXCI7XHJcbmltcG9ydCB7IHJlbW90ZSB9IGZyb20gXCJlbGVjdHJvblwiO1xyXG5pbXBvcnQgQW50aUFkRE0gZnJvbSBcIi4vQW50aUFkRE1cIjtcclxuaW1wb3J0IGJsdXJQcml2YXRlIGZyb20gXCIuL2JsdXJQcml2YXRlXCI7XHJcbmltcG9ydCBkaXNhYmxlVHlwaW5nIGZyb20gXCIuL2Rpc2FibGVUeXBpbmdcIjtcclxuaW1wb3J0IEFwaVByZXZpZXcgZnJvbSBcIi4uL3VpL0FwaVByZXZpZXdcIjtcclxuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi4vdWkvc3dpdGNoXCI7XHJcbmltcG9ydCBNYXJnaW5Ub3AgZnJvbSBcIi4uL3VpL21hcmdpbnRvcFwiO1xyXG5pbXBvcnQgd2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuaW1wb3J0IHRvb2x0aXBXcmFwIGZyb20gXCIuLi91aS90b29sdGlwV3JhcFwiO1xyXG5pbXBvcnQgSGlzdG9yeSBmcm9tIFwiLi4vdWkvaWNvbnMvaGlzdG9yeVwiO1xyXG5cclxuY2xhc3MgQkRTaWRlYmFySGVhZGVyIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgc2lkZWJhckNvbXBvbmVudHMgPSB3ZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5TZXBhcmF0b3IgJiYgZS5IZWFkZXIgJiYgZS5JdGVtKVxyXG5cclxuICAgICAgICBjb25zdCBjaGFuZ2Vsb2dCdXR0b24gPSBSZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJDaGFuZ2Vsb2dcIn0sIFxyXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7c3R5bGU6IHtmbG9hdDogXCJyaWdodFwiLCBjdXJzb3I6IFwicG9pbnRlclwifSwgY2xhc3NOYW1lOiBcImJkLWNoYW5nZWxvZy1idXR0b25cIiwgb25DbGljazogKCkgPT4ge1V0aWxzLnNob3dDaGFuZ2Vsb2dNb2RhbChiYmRDaGFuZ2Vsb2cpO319LFxyXG4gICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChIaXN0b3J5LCB7Y2xhc3NOYW1lOiBcImJkLWljb25cIiwgc2l6ZTogXCIxNnB4XCJ9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgcmVuZGVyZWQgPSBuZXcgc2lkZWJhckNvbXBvbmVudHMuSGVhZGVyKHtcclxuICAgICAgICAgICAgY2hpbGRyZW46IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIFwiQmFuZGFnZWQgQkRcIiwgY2hhbmdlbG9nQnV0dG9uKSxcclxuICAgICAgICAgICAgY2xhc3NOYW1lOiBcInVpLXRhYi1iYXItaGVhZGVyXCJcclxuICAgICAgICB9KVxyXG4gICAgICAgIHJldHVybiByZW5kZXJlZFxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVjJfU2V0dGluZ3NQYW5lbCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNldHRpbmdzID0gdGhpcy51cGRhdGVTZXR0aW5ncy5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2lkZWJhciA9IG5ldyBWMl9TZXR0aW5nc1BhbmVsX1NpZGViYXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWdpc3RlckNvbXBvbmVudHMoKVxyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyQ29tcG9uZW50cygpe1xyXG4gICAgICAgIC8qKiBMaWdodGNvcmQgKi9cclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJsaWdodGNvcmRcIiwgbWFrZUNvbXBvbmVudCh0aGlzLmxpZ2h0Y29yZENvbXBvbmVudC5iaW5kKHRoaXMpKSlcclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJzdGF0dXNcIiwgbWFrZUNvbXBvbmVudCh0aGlzLlByZXNlbmNlQ29tcG9uZW50LmJpbmQodGhpcykpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcImFjY291bnRpbmZvXCIsIG1ha2VDb21wb25lbnQodGhpcy5BY2NvdW50SW5mb3NDb21wb25lbnQuYmluZCh0aGlzKSkpXHJcbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwibGNhcGlwcmV2aWV3XCIsIG1ha2VDb21wb25lbnQodGhpcy5BcGlQcmV2aWV3Q29tcG9uZW50LmJpbmQodGhpcykpKVxyXG5cclxuICAgICAgICAvKiBCYW5kYWdlZCBCRCAqL1xyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcIkJEQ2hhbmdlbG9nVGl0bGVcIiwgbWFrZUNvbXBvbmVudCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQkRTaWRlYmFySGVhZGVyKCkucmVuZGVyKClcclxuICAgICAgICB9KSlcclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJjb3JlXCIsIG1ha2VDb21wb25lbnQodGhpcy5jb3JlQ29tcG9uZW50LmJpbmQodGhpcykpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcImN1c3RvbWNzc1wiLCBtYWtlQ29tcG9uZW50KHRoaXMuY3VzdG9tQ3NzQ29tcG9uZW50LmJpbmQodGhpcykpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcInBsdWdpbnNcIiwgbWFrZUNvbXBvbmVudCh0aGlzLnJlbmRlckFkZG9uUGFuZShcInBsdWdpbnNcIikpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcInRoZW1lc1wiLCBtYWtlQ29tcG9uZW50KHRoaXMucmVuZGVyQWRkb25QYW5lKFwidGhlbWVzXCIpKSlcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcm9vdCgpIHtcclxuICAgICAgICBjb25zdCBfcm9vdCA9IERPTS5xdWVyeShcIiNiZC1zZXR0aW5nc3BhbmUtY29udGFpbmVyXCIpO1xyXG4gICAgICAgIGlmICghX3Jvb3QpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluamVjdFJvb3QoKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfcm9vdDtcclxuICAgIH1cclxuXHJcbiAgICBpbmplY3RSb290KCkge1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZUxheWVyLFxyXG4gICAgICAgICAgICBjbGFzc1NpZGViYXJcclxuICAgICAgICBdID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5sYXllciAmJiBlLmFuaW1hdGluZylbMF0ubGF5ZXIuc3BsaXQoXCIgXCIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zdGFuZGFyZFNpZGViYXJWaWV3KVswXVxyXG4gICAgICAgIF1cclxuICAgICAgICBjb25zdCBzaWRlYmFyID0gRE9NLnF1ZXJ5KFwiLlwiK2NsYXNzTmFtZUxheWVyK1wiIC5cIitjbGFzc1NpZGViYXIuc3RhbmRhcmRTaWRlYmFyVmlldy5zcGxpdChcIiBcIilbMF0rXCIsIC5cIitjbGFzc05hbWVMYXllcitcIiAudWktc3RhbmRhcmQtc2lkZWJhci12aWV3XCIpO1xyXG4gICAgICAgIGlmICghc2lkZWJhcikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHJvb3QgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBpZD1cImJkLXNldHRpbmdzcGFuZS1jb250YWluZXJcIiBjbGFzcz1cIiR7Y2xhc3NTaWRlYmFyLmNvbnRlbnRSZWdpb259IGNvbnRlbnQtcmVnaW9uXCI+YCk7XHJcbiAgICAgICAgc2lkZWJhci5hcHBlbmQocm9vdCk7XHJcblxyXG4gICAgICAgIFV0aWxzLm9uUmVtb3ZlZChyb290LCAoKSA9PiB7XHJcbiAgICAgICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZShyb290KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29yZVNldHRpbmdzKCkge1xyXG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5nZXRTZXR0aW5ncyhcImNvcmVcIik7XHJcbiAgICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFsuLi5uZXcgU2V0KHNldHRpbmdzLm1hcChzID0+IHMuY2F0ZWdvcnkpKV07XHJcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBjYXRlZ29yaWVzLm1hcChjID0+IHtyZXR1cm4ge3RpdGxlOiBjLCBzZXR0aW5nczogc2V0dGluZ3MuZmlsdGVyKHMgPT4gcy5jYXRlZ29yeSA9PSBjKX07fSk7XHJcbiAgICAgICAgcmV0dXJuIHNlY3Rpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBsaWdodGNvcmRTZXR0aW5ncygpIHtcclxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoXCJsaWdodGNvcmRcIik7XHJcbiAgICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFsuLi5uZXcgU2V0KHNldHRpbmdzLm1hcChzID0+IHMuY2F0ZWdvcnkpKV07XHJcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBjYXRlZ29yaWVzLm1hcChjID0+IHtyZXR1cm4ge3RpdGxlOiBjLCBzZXR0aW5nczogc2V0dGluZ3MuZmlsdGVyKHMgPT4gcy5jYXRlZ29yeSA9PSBjKX07fSk7XHJcbiAgICAgICAgcmV0dXJuIHNlY3Rpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBQcmVzZW5jZVNldHRpbmdzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFNldHRpbmdzKFwic3RhdHVzXCIpXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IE1zZ0xvZ1NldHRpbmdzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFNldHRpbmdzKFwibXNnbG9nXCIpXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2V0dGluZ3MoY2F0ZWdvcnkpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoc2V0dGluZ3MpLnJlZHVjZSgoYXJyLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2V0dGluZyA9IHNldHRpbmdzW2tleV07XHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5nLmNhdCA9PT0gY2F0ZWdvcnkgJiYgc2V0dGluZy5pbXBsZW1lbnRlZCAmJiAhc2V0dGluZy5oaWRkZW4pIHtcclxuICAgICAgICAgICAgICAgIHNldHRpbmcudGV4dCA9IGtleTtcclxuICAgICAgICAgICAgICAgIGFyci5wdXNoKHNldHRpbmcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBhcnI7XHJcbiAgICAgICAgfSwgW10pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soKSB7fVxyXG5cclxuICAgIG9uQ2hhbmdlKGlkLCBjaGVja2VkLCBzaWRlYmFyKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTZXR0aW5ncyhpZCwgY2hlY2tlZCwgc2lkZWJhcik7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlU2V0dGluZ3MoaWQsIGVuYWJsZWQsIHNpZGViYXIpIHtcclxuICAgICAgICBpZighW1wibGlnaHRjb3JkLThcIiwgXCJub193aW5kb3dfYm91bmRcIiwgXCJlbmFibGVfZ2xhc3N0cm9uXCJdLmluY2x1ZGVzKGlkKSlzZXR0aW5nc0Nvb2tpZVtpZF0gPSBlbmFibGVkO1xyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtMlwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsXCIpO1xyXG4gICAgICAgICAgICBlbHNlIERPTS5yZW1vdmVDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWxcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtM1wiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsLWNoYW5cIik7XHJcbiAgICAgICAgICAgIGVsc2UgRE9NLnJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbC1jaGFuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgcHVibGljU2VydmVyc01vZHVsZS5hZGRCdXR0b24oKTtcclxuICAgICAgICAgICAgZWxzZSBwdWJsaWNTZXJ2ZXJzTW9kdWxlLnJlbW92ZUJ1dHRvbigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTRcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgdm9pY2VNb2RlLnN0YXJ0KCk7XHJcbiAgICAgICAgICAgIGVsc2Ugdm9pY2VNb2RlLnN0b3AoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy01XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIERPTS5hZGRDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkYS1kYXJrXCIpO1xyXG4gICAgICAgICAgICBlbHNlIERPTS5yZW1vdmVDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkYS1kYXJrXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVuYWJsZWQgJiYgaWQgPT0gXCJiZGEtZ3MtNlwiKSB0ZkhvdXIuaW5qZWN0MjRIb3VyKCk7XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy03XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIGNvbG9yZWRUZXh0LmluamVjdENvbG9yZWRUZXh0KCk7XHJcbiAgICAgICAgICAgIGVsc2UgY29sb3JlZFRleHQucmVtb3ZlQ29sb3JlZFRleHQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImZvcmstcHMtNFwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBDbGFzc05vcm1hbGl6ZXIuc3RhcnQoKTtcclxuICAgICAgICAgICAgZWxzZSBDbGFzc05vcm1hbGl6ZXIuc3RvcCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiZm9yay1wcy01XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInBsdWdpblwiKTtcclxuICAgICAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgQ29udGVudE1hbmFnZXIudW53YXRjaENvbnRlbnQoXCJwbHVnaW5cIik7XHJcbiAgICAgICAgICAgICAgICBDb250ZW50TWFuYWdlci51bndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJmb3JrLXdwLTFcIikge1xyXG4gICAgICAgICAgICBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKFwidHJhbnNwYXJlbnRcIiwgZW5hYmxlZCk7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKFwiYmFja2dyb3VuZENvbG9yXCIsIG51bGwpO1xyXG4gICAgICAgICAgICBlbHNlIFV0aWxzLnNldFdpbmRvd1ByZWZlcmVuY2UoXCJiYWNrZ3JvdW5kQ29sb3JcIiwgXCIjMmYzMTM2XCIpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy04XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIGRNb2RlLnN0YXJ0RGVidWdMaXN0ZW5lcigpO1xyXG4gICAgICAgICAgICBlbHNlIGRNb2RlLnN0b3BEZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJmb3JrLWRtLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgZE1vZGUuc3RhcnRDb3B5U2VsZWN0b3IoKTtcclxuICAgICAgICAgICAgZWxzZSBkTW9kZS5zdG9wQ29weVNlbGVjdG9yKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKmlmIChpZCA9PT0gXCJyZWFjdERldlRvb2xzXCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHJlYWN0RGV2VG9vbHMuc3RhcnQoKTtcclxuICAgICAgICAgICAgZWxzZSByZWFjdERldlRvb2xzLnN0b3AoKTtcclxuICAgICAgICB9Ki9cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5kZXZNb2RlID0gdHJ1ZVxyXG4gICAgICAgICAgICBlbHNlIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSA9IGZhbHNlXHJcbiAgICAgICAgICAgIHNpZGViYXIuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTJcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5jYWxsUmluZ2luZ0JlYXQgPSB0cnVlXHJcbiAgICAgICAgICAgIGVsc2Ugd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5jYWxsUmluZ2luZ0JlYXQgPSBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLXByZXNlbmNlLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgQ3VzdG9tUmljaFByZXNlbmNlLmVuYWJsZSgpXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5nc1N0b3JlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiB0eXBlb2YgZS5kZWZhdWx0ID09PSBcIm9iamVjdFwiICYmIFwic2hvd0N1cnJlbnRHYW1lXCIgaW4gZS5kZWZhdWx0KVswXVxyXG4gICAgICAgICAgICAgICAgaWYoc2V0dGluZ3NTdG9yZSAmJiAhc2V0dGluZ3NTdG9yZS5kZWZhdWx0LnNob3dDdXJyZW50R2FtZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQudXBkYXRlUmVtb3RlU2V0dGluZ3MpWzBdLmRlZmF1bHQudXBkYXRlUmVtb3RlU2V0dGluZ3Moe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93Q3VycmVudEdhbWU6IHRydWVcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgQ3VzdG9tUmljaFByZXNlbmNlLmRpc2FibGUoKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTNcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKS5zZXRBbHdheXNPblRvcCh0cnVlKVxyXG4gICAgICAgICAgICBlbHNlIHJlbW90ZS5nZXRDdXJyZW50V2luZG93KCkuc2V0QWx3YXlzT25Ub3AoZmFsc2UpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtNFwiKSB7XHJcbiAgICAgICAgICAgIGlmKGVuYWJsZWQpe1xyXG4gICAgICAgICAgICAgICAgQW50aUFkRE0uZW5hYmxlKClcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBBbnRpQWRETS5kaXNhYmxlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTZcIikge1xyXG4gICAgICAgICAgICBpZihlbmFibGVkKXtcclxuICAgICAgICAgICAgICAgIGJsdXJQcml2YXRlLmVuYWJsZSgpXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgYmx1clByaXZhdGUuZGlzYWJsZSgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC03XCIpIHtcclxuICAgICAgICAgICAgaWYoZW5hYmxlZCl7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlVHlwaW5nLmVuYWJsZSgpXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgZGlzYWJsZVR5cGluZy5kaXNhYmxlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLThcIil7XHJcbiAgICAgICAgICAgIGxldCBhcHBTZXR0aW5ncyA9IHJlbW90ZS5nZXRHbG9iYWwoXCJhcHBTZXR0aW5nc1wiKVxyXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zZXQoXCJpc1RhYnNcIiwgZW5hYmxlZClcclxuICAgICAgICAgICAgYXBwU2V0dGluZ3Muc2F2ZSgpXHJcbiAgICAgICAgICAgIHJlbW90ZS5hcHAucmVsYXVuY2goKVxyXG4gICAgICAgICAgICByZW1vdGUuYXBwLmV4aXQoKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibm9fd2luZG93X2JvdW5kXCIpe1xyXG4gICAgICAgICAgICBsZXQgYXBwU2V0dGluZ3MgPSByZW1vdGUuZ2V0R2xvYmFsKFwiYXBwU2V0dGluZ3NcIilcclxuICAgICAgICAgICAgYXBwU2V0dGluZ3Muc2V0KFwiTk9fV0lORE9XU19CT1VORFwiLCBlbmFibGVkKVxyXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zYXZlKClcclxuICAgICAgICAgICAgcmVtb3RlLmFwcC5yZWxhdW5jaCgpXHJcbiAgICAgICAgICAgIHJlbW90ZS5hcHAuZXhpdCgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJlbmFibGVfZ2xhc3N0cm9uXCIpe1xyXG4gICAgICAgICAgICBsZXQgYXBwU2V0dGluZ3MgPSByZW1vdGUuZ2V0R2xvYmFsKFwiYXBwU2V0dGluZ3NcIilcclxuICAgICAgICAgICAgYXBwU2V0dGluZ3Muc2V0KFwiR0xBU1NUUk9OXCIsIGVuYWJsZWQpXHJcbiAgICAgICAgICAgIGFwcFNldHRpbmdzLnNhdmUoKVxyXG4gICAgICAgICAgICByZW1vdGUuYXBwLnJlbGF1bmNoKClcclxuICAgICAgICAgICAgcmVtb3RlLmFwcC5leGl0KClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2F2ZVNldHRpbmdzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdGlhbGl6ZVNldHRpbmdzKCkge1xyXG4gICAgICAgIC8vaWYgKHNldHRpbmdzQ29va2llLnJlYWN0RGV2VG9vbHMpIHJlYWN0RGV2VG9vbHMuc3RhcnQoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtMlwiXSkgRE9NLmFkZENsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbFwiKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtM1wiXSkgRE9NLmFkZENsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbC1jaGFuXCIpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy0xXCJdKSBwdWJsaWNTZXJ2ZXJzTW9kdWxlLmFkZEJ1dHRvbigpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy00XCJdKSB2b2ljZU1vZGUuc3RhcnQoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtNVwiXSkgRE9NLmFkZENsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmRhLWRhcmtcIik7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTZcIl0pIHRmSG91ci5pbmplY3QyNEhvdXIoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtN1wiXSkgY29sb3JlZFRleHQuaW5qZWN0Q29sb3JlZFRleHQoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTRcIl0pIENsYXNzTm9ybWFsaXplci5zdGFydCgpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC0xXCJdKSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmRldk1vZGUgPSB0cnVlXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTJcIl0pIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuY2FsbFJpbmdpbmdCZWF0ID0gdHJ1ZVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC1wcmVzZW5jZS0xXCJdKSBDdXN0b21SaWNoUHJlc2VuY2UuZW5hYmxlKClcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtM1wiXSkgcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKS5zZXRBbHdheXNPblRvcCh0cnVlKVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC00XCJdKSBBbnRpQWRETS5lbmFibGUoKVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC02XCJdKSBibHVyUHJpdmF0ZS5lbmFibGUoKVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC03XCJdKSBkaXNhYmxlVHlwaW5nLmVuYWJsZSgpXHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSkge1xyXG4gICAgICAgICAgICBDb250ZW50TWFuYWdlci53YXRjaENvbnRlbnQoXCJwbHVnaW5cIik7XHJcbiAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLThcIl0pIGRNb2RlLnN0YXJ0RGVidWdMaXN0ZW5lcigpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstZG0tMVwiXSkgZE1vZGUuc3RhcnRDb3B5U2VsZWN0b3IoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBzYXZlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIsIHNldHRpbmdzQ29va2llKTtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwicnBjXCIsIHNldHRpbmdzUlBDKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5nc0Nvb2tpZSwgRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIpKTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzUlBDLCBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJTaWRlYmFyKHNpZGViYXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zaWRlYmFyLnJlbmRlcihzaWRlYmFyKTtcclxuICAgIH1cclxuXHJcbiAgICBjb3JlQ29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VjdGlvbmVkU2V0dGluZ3NQYW5lbCwge2tleTogXCJjc3BhbmVsXCIsIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLCBzZWN0aW9uczogdGhpcy5jb3JlU2V0dGluZ3N9KVxyXG4gICAgfVxyXG5cclxuICAgIGxpZ2h0Y29yZENvbXBvbmVudChzaWRlYmFyKSB7XHJcbiAgICAgICAgbGV0IGFwcFNldHRpbmdzID0gcmVtb3RlLmdldEdsb2JhbChcImFwcFNldHRpbmdzXCIpXHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgdGhpcy5saWdodGNvcmRTZXR0aW5ncy5tYXAoKHNlY3Rpb24sIGkpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgICAgICAgICAgKGkgPT09IDAgPyBudWxsIDogQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KE1hcmdpblRvcCkpLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImgyXCIsIHtjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMiBtYXJnaW4tcmVzZXQgbWFyZ2luLWJvdHRvbS0yMFwifSwgc2VjdGlvbi50aXRsZSksXHJcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5zZXR0aW5ncy5tYXAoc2V0dGluZyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc0NoZWNrZWQgPSBzZXR0aW5nc0Nvb2tpZVtzZXR0aW5nLmlkXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihzZXR0aW5nLmlkID09PSBcImxpZ2h0Y29yZC04XCIpaXNDaGVja2VkID0gYXBwU2V0dGluZ3MuZ2V0KFwiaXNUYWJzXCIsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0dGluZy5pZCA9PT0gXCJub193aW5kb3dfYm91bmRcIilpc0NoZWNrZWQgPSBhcHBTZXR0aW5ncy5nZXQoXCJOT19XSU5ET1dTX0JPVU5EXCIsIGZhbHNlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihzZXR0aW5nLmlkID09PSBcImVuYWJsZV9nbGFzc3Ryb25cIilpc0NoZWNrZWQgPSBhcHBTZXR0aW5ncy5nZXQoXCJHTEFTU1RST05cIiwgdHJ1ZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJldHVyblZhbHVlID0gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFN3aXRjaCwge2lkOiBzZXR0aW5nLmlkLCBrZXk6IHNldHRpbmcuaWQsIGRhdGE6IHNldHRpbmcsIGNoZWNrZWQ6IGlzQ2hlY2tlZCwgb25DaGFuZ2U6IChpZCwgY2hlY2tlZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZShpZCwgY2hlY2tlZCwgc2lkZWJhcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH19KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihzZXR0aW5nLmlkID09IFwibGlnaHRjb3JkLThcIiAmJiBpc0NoZWNrZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBcImdyZWVuXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2s6IFwib3V0bGluZWRcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogXCJzbWFsbFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3ZlckNvbG9yOiBcImJyYW5kXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2NvcmROYXRpdmUuaXBjLnNlbmQoXCJORVdfVEFCXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXI6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBcIk9wZW4gYSBuZXcgVGFiXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgfSksIFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQod2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uLCB7XHJcbiAgICAgICAgICAgICAgICBjb2xvcjogXCJ5ZWxsb3dcIixcclxuICAgICAgICAgICAgICAgIGxvb2s6IFwiZ2hvc3RcIixcclxuICAgICAgICAgICAgICAgIHNpemU6IFwibWVkaXVtXCIsXHJcbiAgICAgICAgICAgICAgICBob3ZlckNvbG9yOiBcInJlZFwiLFxyXG4gICAgICAgICAgICAgICAgb25DbGljaygpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiU2hvdWxkIHJlbGF1bmNoXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlLmFwcC5yZWxhdW5jaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IHJlbW90ZS5wcm9jZXNzLmFyZ3Yuc2xpY2UoMSkuY29uY2F0KFtcIi0tZGlzYWJsZS1iZXR0ZXJkaXNjb3JkXCJdKVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlLmFwcC5xdWl0KClcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB3cmFwcGVyOiB0cnVlXHJcbiAgICAgICAgICAgIH0sIFwiUmVsYXVuY2ggd2l0aG91dCBCZXR0ZXJEaXNjb3JkXCIpXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIFByZXNlbmNlQ29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVjJDX1ByZXNlbmNlU2V0dGluZ3MsIHtcclxuICAgICAgICAgICAga2V5OiBcImxwcGFubmVsXCIsXHJcbiAgICAgICAgICAgIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLCBcclxuICAgICAgICAgICAgc2V0dGluZ3M6IHRoaXMuUHJlc2VuY2VTZXR0aW5nc1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgQWNjb3VudEluZm9zQ29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVjJDX0FjY291bnRJbmZvcywge1xyXG4gICAgICAgICAgICBrZXk6IFwibGFwYW5uZWxcIlxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgQXBpUHJldmlld0NvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KEFwaVByZXZpZXcsIHtcclxuICAgICAgICAgICAga2V5OiBcImxhcGlwYW5uZWxcIlxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgY3VzdG9tQ3NzQ29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQ3NzRWRpdG9yLCB7a2V5OiBcImNzc2VkaXRvclwifSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJBZGRvblBhbmUodHlwZSkge1xyXG4gICAgICAgIC8vIEkga25vdyB0aGlzIHNob3VsZG4ndCBiZSBoZXJlLCBidXQgd2hlbiBpdCBpc24ndCxcclxuICAgICAgICAvLyBSZWFjdCByZWZ1c2VzIHRvIGNoYW5nZSB0aGUgYnV0dG9uIHdoZW4gZ29pbmdcclxuICAgICAgICAvLyBiZXR3ZWVuIHBsdWdpbnMgYW5kIHRoZW1lcyBwYWdlLi4uIHNvbWV0aGluZ1xyXG4gICAgICAgIC8vIHRvIGRlYnVnIGxhdGVyLlxyXG4gICAgICAgIGNsYXNzIENvbnRlbnRMaXN0IGV4dGVuZHMgQkRWMi5yZWFjdC5Db21wb25lbnQge1xyXG4gICAgICAgICAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgICAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcmVmaXggPSB0aGlzLnByb3BzLnR5cGUucmVwbGFjZShcInNcIiwgXCJcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAgICAgb25DaGFuZ2UoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKHRoaXMucHJvcHMudHlwZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAgICAgcmVuZGVyKCkge3JldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuO31cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxSZW5kZXIgPSBDb250ZW50TGlzdC5wcm90b3R5cGUucmVuZGVyO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb250ZW50TGlzdC5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHtcclxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24oKSB7Y29uc29sZS53YXJuKFwiQWRkb24gcG9saWN5IGZvciBwbHVnaW5zICM1IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvd2lraS9BZGRvbi1Qb2xpY2llcyNwbHVnaW5zXCIpO30sXHJcbiAgICAgICAgICAgIGdldDogKCkgPT4gb3JpZ2luYWxSZW5kZXJcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDb250ZW50TGlzdCwge3R5cGV9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2FyZExpc3QsIHt0eXBlfSkpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIE5vIG5lZWQgdG8gZXhwb3J0IHNldHRpbmdzUGFuZWwgb24gd2luZG93XHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gbWFrZUNvbXBvbmVudChjaGlsZHJlbil7XHJcbiAgICBjbGFzcyBTZXR0aW5nQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgICAgICByZW5kZXIoKXtcclxuICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuKHNpZGViYXIpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IHNpZGViYXJcclxuICAgIHJldHVybiAocykgPT4ge1xyXG4gICAgICAgIHNpZGViYXIgPSBzXHJcbiAgICAgICAgcmV0dXJuIFNldHRpbmdDb21wb25lbnRcclxuICAgIH1cclxufSIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyX1NldHRpbmdzUGFuZWxfU2lkZWJhciB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5wYW5lbHMgPSB7fVxyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyKHBhbmVsLCBjb21wb25lbnQpe1xyXG4gICAgICAgIHRoaXMucGFuZWxzW3BhbmVsXSA9IGNvbXBvbmVudFxyXG4gICAgfVxyXG5cclxuICAgIGdldENvbXBvbmVudChwYW5lbCwgc2lkZWJhcil7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGFuZWxzW3BhbmVsXShzaWRlYmFyKVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBpdGVtcygpIHtcclxuICAgICAgICByZXR1cm4gW3tcclxuICAgICAgICAgICAgdGV4dDogXCJCZXR0ZXJEaXNjb3JkIFNldHRpbmdzXCIsIFxyXG4gICAgICAgICAgICBpZDogXCJjb3JlXCJcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHRleHQ6IFwiUGx1Z2luc1wiLCBcclxuICAgICAgICAgICAgaWQ6IFwicGx1Z2luc1wiXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICB0ZXh0OiBcIlRoZW1lc1wiLCBcclxuICAgICAgICAgICAgaWQ6IFwidGhlbWVzXCJcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHRleHQ6IFwiQ3VzdG9tIENTU1wiLCBcclxuICAgICAgICAgICAgaWQ6IFwiY3VzdG9tY3NzXCJcclxuICAgICAgICB9XTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgTENpdGVtcygpe1xyXG4gICAgICAgIGxldCBpdGVtcyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGV4dDogXCJMaWdodGNvcmQgU2V0dGluZ3NcIixcclxuICAgICAgICAgICAgICAgIGlkOiBcImxpZ2h0Y29yZFwiXHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIHRleHQ6IFwiUmljaFByZXNlbmNlXCIsIFxyXG4gICAgICAgICAgICAgICAgaWQ6IFwic3RhdHVzXCJcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgdGV4dDogXCJBY2NvdW50IEluZm9cIixcclxuICAgICAgICAgICAgICAgIGlkOiBcImFjY291bnRpbmZvXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgICAgICBpZih3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmRldk1vZGUpaXRlbXMucHVzaCh7XHJcbiAgICAgICAgICAgIHRleHQ6IFwiQXBpIENvbXBvbmVudHMgUHJldmlld1wiLFxyXG4gICAgICAgICAgICBpZDogXCJsY2FwaXByZXZpZXdcIlxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKHNpZGViYXIpIHtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uOiBcIkhFQURFUlwiLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IFwiTGlnaHRjb3JkXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgLi4udGhpcy5MQ2l0ZW1zLm1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbjogZS5pZCxcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogZS50ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZ2V0Q29tcG9uZW50KGUuaWQsIHNpZGViYXIpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uOiBcIkRJVklERVJcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uOiBcIkNVU1RPTVwiLFxyXG4gICAgICAgICAgICAgICAgZWxlbWVudDogdGhpcy5nZXRDb21wb25lbnQoXCJCRENoYW5nZWxvZ1RpdGxlXCIpXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIC4uLnRoaXMuaXRlbXMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uOiBlLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBlLnRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogdGhpcy5nZXRDb21wb25lbnQoZS5pZCwgc2lkZWJhcilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNlY3Rpb246IFwiRElWSURFUlwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBObyBuZWVkIHRvIGV4cG9ydCBzZXR0aW5nc1BhbmVsU2lkZWJhciBvbiB3aW5kb3dcclxuICovIiwiaW1wb3J0IHtiZHRoZW1lRXJyb3JzLCB0aGVtZUNvb2tpZSwgc2V0dGluZ3NDb29raWUsIGJkdGhlbWVzfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBCREV2ZW50cyBmcm9tIFwiLi9iZEV2ZW50c1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuY2xhc3MgVGhlbWVNb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuVGhlbWVNb2R1bGUgPSB0aGlzXHJcbiAgICB9XHJcbiAgICBnZXQgZm9sZGVyKCkge3JldHVybiBDb250ZW50TWFuYWdlci50aGVtZXNGb2xkZXI7fVxyXG59XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUubG9hZFRoZW1lcyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcclxuICAgIHRoaXMubG9hZFRoZW1lRGF0YSgpO1xyXG4gICAgYmR0aGVtZUVycm9ycy5zcGxpY2UoMCwgMCwgLi4uKGF3YWl0IENvbnRlbnRNYW5hZ2VyLmxvYWRUaGVtZXMoKSkpO1xyXG4gICAgY29uc3QgdGhlbWVzID0gT2JqZWN0LmtleXMoYmR0aGVtZXMpO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhlbWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lc1t0aGVtZXNbaV1dO1xyXG4gICAgICAgIGlmICghdGhlbWVDb29raWVbdGhlbWUubmFtZV0pIHRoZW1lQ29va2llW3RoZW1lLm5hbWVdID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoZW1lQ29va2llW3RoZW1lLm5hbWVdKSBET00uYWRkU3R5bGUoRE9NLmVzY2FwZUlEKHRoZW1lLmlkKSwgdW5lc2NhcGUodGhlbWUuY3NzKSk7XHJcblxyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwKSlcclxuICAgIH1cclxuICAgIGZvciAoY29uc3QgdGhlbWUgaW4gdGhlbWVDb29raWUpIHtcclxuICAgICAgICBpZiAoIWJkdGhlbWVzW3RoZW1lXSkgZGVsZXRlIHRoZW1lQ29va2llW3RoZW1lXTtcclxuICAgIH1cclxuICAgIHRoaXMuc2F2ZVRoZW1lRGF0YSgpO1xyXG4gICAgLy8gaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy01XCJdKSBDb250ZW50TWFuYWdlci53YXRjaENvbnRlbnQoXCJ0aGVtZVwiKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5lbmFibGVUaGVtZSA9IGZ1bmN0aW9uKG5hbWUsIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICB0aGVtZUNvb2tpZVtuYW1lXSA9IHRydWU7XHJcbiAgICB0aGlzLnNhdmVUaGVtZURhdGEoKTtcclxuICAgIGNvbnN0IHRoZW1lID0gYmR0aGVtZXNbbmFtZV07XHJcbiAgICBET00uYWRkU3R5bGUoRE9NLmVzY2FwZUlEKHRoZW1lLmlkKSwgdW5lc2NhcGUodGhlbWUuY3NzKSk7XHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lLm5hbWV9IHYke3RoZW1lLnZlcnNpb259IGhhcyBiZWVuIGFwcGxpZWQuYCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKG5hbWUsIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lbmFibGVUaGVtZShuYW1lLCByZWxvYWQpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmRpc2FibGVUaGVtZSA9IGZ1bmN0aW9uKG5hbWUsIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICB0aGVtZUNvb2tpZVtuYW1lXSA9IGZhbHNlO1xyXG4gICAgdGhpcy5zYXZlVGhlbWVEYXRhKCk7XHJcbiAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWVzW25hbWVdO1xyXG4gICAgRE9NLnJlbW92ZVN0eWxlKERPTS5lc2NhcGVJRCh0aGVtZS5pZCkpO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZS5uYW1lfSB2JHt0aGVtZS52ZXJzaW9ufSBoYXMgYmVlbiBkaXNhYmxlZC5gKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKG5hbWUsIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlVGhlbWUobmFtZSwgcmVsb2FkKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS50b2dnbGVUaGVtZSA9IGZ1bmN0aW9uKHRoZW1lKSB7XHJcbiAgICBpZiAodGhlbWVDb29raWVbdGhlbWVdKSB0aGlzLmRpc2FibGVUaGVtZSh0aGVtZSk7XHJcbiAgICBlbHNlIHRoaXMuZW5hYmxlVGhlbWUodGhlbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uIChuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlVGhlbWUobmFtZSwgcmVsb2FkKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5sb2FkVGhlbWUgPSBhc3luYyBmdW5jdGlvbihmaWxlbmFtZSkge1xyXG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCBDb250ZW50TWFuYWdlci5sb2FkQ29udGVudChmaWxlbmFtZSwgXCJ0aGVtZVwiKTtcclxuICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3RoZW1lczogW2Vycm9yXX0pO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke2ZpbGVuYW1lfSBjb3VsZCBub3QgYmUgbG9hZGVkLiBJdCBtYXkgbm90IGhhdmUgYmVlbiBsb2FkZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xyXG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHtmaWxlbmFtZX0gY291bGQgbm90IGJlIGxvYWRlZC5gLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgICBjb25zdCB0aGVtZSA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lKTtcclxuICAgIFV0aWxzLmxvZyhcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lLm5hbWV9IHYke3RoZW1lLnZlcnNpb259IHdhcyBsb2FkZWQuYCk7XHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZS5uYW1lfSB2JHt0aGVtZS52ZXJzaW9ufSB3YXMgbG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xyXG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJ0aGVtZS1sb2FkZWRcIiwgdGhlbWUubmFtZSk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUudW5sb2FkVGhlbWUgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xyXG4gICAgY29uc3QgYmR0aGVtZSA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHRoZW1lc1tmaWxlbmFtZU9yTmFtZV07XHJcbiAgICBpZiAoIWJkdGhlbWUpIHJldHVybjtcclxuICAgIGNvbnN0IHRoZW1lID0gYmR0aGVtZS5uYW1lO1xyXG4gICAgaWYgKHRoZW1lQ29va2llW3RoZW1lXSkgdGhpcy5kaXNhYmxlVGhlbWUodGhlbWUsIHRydWUpO1xyXG4gICAgY29uc3QgZXJyb3IgPSBDb250ZW50TWFuYWdlci51bmxvYWRDb250ZW50KGJkdGhlbWVzW3RoZW1lXS5maWxlbmFtZSwgXCJ0aGVtZVwiKTtcclxuICAgIGRlbGV0ZSBiZHRoZW1lc1t0aGVtZV07XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHt0aGVtZXM6IFtlcnJvcl19KTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZX0gY291bGQgbm90IGJlIHVubG9hZGVkLiBJdCBtYXkgaGF2ZSBub3QgYmVlbiBsb2FkZWQgeWV0LmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7dGhlbWV9IGNvdWxkIG5vdCBiZSB1bmxvYWRlZC4gSXQgbWF5IGhhdmUgbm90IGJlZW4gbG9hZGVkIHlldC5gLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHt0aGVtZX0gd2FzIHVubG9hZGVkLmApO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWV9IHdhcyB1bmxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwidGhlbWUtdW5sb2FkZWRcIiwgdGhlbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XHJcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHRoZW1lc1tmaWxlbmFtZU9yTmFtZV07XHJcbiAgICBpZiAoIWJkcGx1Z2luKSByZXR1cm47XHJcbiAgICB0aGlzLnVubG9hZFRoZW1lKGJkcGx1Z2luLmZpbGVuYW1lKTtcclxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVxdWlyZShcInBhdGhcIikucmVzb2x2ZShDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyLCBiZHBsdWdpbi5maWxlbmFtZSk7XHJcbiAgICByZXF1aXJlKFwiZnNcIikudW5saW5rU3luYyhmdWxsUGF0aCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUucmVsb2FkVGhlbWUgPSBhc3luYyBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xyXG4gICAgY29uc3QgYmR0aGVtZSA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHRoZW1lc1tmaWxlbmFtZU9yTmFtZV07XHJcbiAgICBpZiAoIWJkdGhlbWUpIHJldHVybiB0aGlzLmxvYWRUaGVtZShmaWxlbmFtZU9yTmFtZSk7XHJcbiAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWUubmFtZTtcclxuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgQ29udGVudE1hbmFnZXIucmVsb2FkQ29udGVudChiZHRoZW1lc1t0aGVtZV0uZmlsZW5hbWUsIFwidGhlbWVcIik7XHJcbiAgICBpZiAodGhlbWVDb29raWVbdGhlbWVdKSB0aGlzLmRpc2FibGVUaGVtZSh0aGVtZSwgdHJ1ZSksIHRoaXMuZW5hYmxlVGhlbWUodGhlbWUsIHRydWUpO1xyXG4gICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7dGhlbWVzOiBbZXJyb3JdfSk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWV9IGNvdWxkIG5vdCBiZSByZWxvYWRlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lfSBjb3VsZCBub3QgYmUgcmVsb2FkZWQuYCwgZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7dGhlbWV9IHYke2JkdGhlbWVzW3RoZW1lXS52ZXJzaW9ufSB3YXMgcmVsb2FkZWQuYCk7XHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZX0gdiR7YmR0aGVtZXNbdGhlbWVdLnZlcnNpb259IHdhcyByZWxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwidGhlbWUtcmVsb2FkZWRcIiwgdGhlbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnJlbG9hZCA9IGZ1bmN0aW9uKG5hbWUpIHtcclxuICAgIHJldHVybiB0aGlzLnJlbG9hZFRoZW1lKG5hbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmVkaXQgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xyXG4gICAgY29uc3QgYmRwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmR0aGVtZXNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xyXG4gICAgY29uc3QgZnVsbFBhdGggPSByZXF1aXJlKFwicGF0aFwiKS5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnRoZW1lc0ZvbGRlciwgYmRwbHVnaW4uZmlsZW5hbWUpO1xyXG4gICAgcmVxdWlyZShcImVsZWN0cm9uXCIpLnNoZWxsLm9wZW5JdGVtKGAke2Z1bGxQYXRofWApO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnVwZGF0ZVRoZW1lTGlzdCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3QgcmVzdWx0cyA9IENvbnRlbnRNYW5hZ2VyLmxvYWROZXdDb250ZW50KFwidGhlbWVcIik7XHJcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIHJlc3VsdHMuYWRkZWQpIHRoaXMubG9hZFRoZW1lKGZpbGVuYW1lKTtcclxuICAgIGZvciAoY29uc3QgbmFtZSBvZiByZXN1bHRzLnJlbW92ZWQpIHRoaXMudW5sb2FkVGhlbWUobmFtZSk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUubG9hZFRoZW1lRGF0YSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3Qgc2F2ZWQgPSBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwidGhlbWVzXCIpO1xyXG4gICAgaWYgKHNhdmVkKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGVtZUNvb2tpZSwgc2F2ZWQpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnNhdmVUaGVtZURhdGEgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBEYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwidGhlbWVzXCIsIHRoZW1lQ29va2llKTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBUaGVtZU1vZHVsZSgpOyIsImltcG9ydCB7YmJkVmVyc2lvbiwgc2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXRpbHMge1xyXG4gICAgLyoqIERvY3VtZW50L3dpbmRvdyB3aWR0aCAqL1xyXG4gICAgc3RhdGljIGdldCBzY3JlZW5XaWR0aCgpIHsgcmV0dXJuIE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7IH1cclxuICAgIC8qKiBEb2N1bWVudC93aW5kb3cgaGVpZ2h0ICovXHJcbiAgICBzdGF0aWMgZ2V0IHNjcmVlbkhlaWdodCgpIHsgcmV0dXJuIE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCAwKTsgfVxyXG5cclxuICAgIHN0YXRpYyBnZXQgV2luZG93Q29uZmlnRmlsZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fd2luZG93Q29uZmlnRmlsZSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldEFsbFdpbmRvd1ByZWZlcmVuY2VzKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxyXG4gICAgICAgICAgICBmcmFtZTogZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBzdGF0aWMgZ2V0V2luZG93UHJlZmVyZW5jZShrZXkpIHtcclxuICAgICAgICBpZiAoa2V5ID09PSBcInRyYW5zcGFyZW50XCIpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmIChrZXkgPT09IFwiZnJhbWVcIikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBzdGF0aWMgc2V0V2luZG93UHJlZmVyZW5jZShrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKGtleSA9PT0gXCJ0cmFuc3BhcmVudFwiKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAoa2V5ID09PSBcImZyYW1lXCIpIHJldHVybiBmYWxzZTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc3RyaXBCT00oY29udGVudCkge1xyXG4gICAgICAgIGlmIChjb250ZW50LmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xyXG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldFRleHRBcmVhKCkge1xyXG4gICAgICAgIHJldHVybiBET00ucXVlcnkoXCIuXCIrQkRNb2R1bGVzLmdldChlID0+IGUuY2hhbm5lbFRleHRBcmVhICYmIGUudGl0bGVXcmFwcGVyKVswXS5jaGFubmVsVGV4dEFyZWEuc3BsaXQoXCIgXCIpWzBdK1wiIHRleHRhcmVhXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpbnNlcnRUZXh0KHRleHRhcmVhLCB0ZXh0KSB7XHJcbiAgICAgICAgdGV4dGFyZWEuZm9jdXMoKTtcclxuICAgICAgICB0ZXh0YXJlYS5zZWxlY3Rpb25TdGFydCA9IDA7XHJcbiAgICAgICAgdGV4dGFyZWEuc2VsZWN0aW9uRW5kID0gdGV4dGFyZWEudmFsdWUubGVuZ3RoO1xyXG4gICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaW5zZXJ0VGV4dFwiLCBmYWxzZSwgdGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVzY2FwZUlEKGlkKSB7XHJcbiAgICAgICAgcmV0dXJuIGlkLnJlcGxhY2UoL15bXmEtel0rfFteXFx3LV0rL2dpLCBcIi1cIik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGxvZyhtb2R1bGVOYW1lLCBtZXNzYWdlKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYCVjW0JhbmRhZ2VkQkRdJWMgWyR7bW9kdWxlTmFtZX1dJWMgJHttZXNzYWdlfWAsIFwiY29sb3I6ICMzYTcxYzE7IGZvbnQtd2VpZ2h0OiA3MDA7XCIsIFwiY29sb3I6ICMzYTcxYzE7XCIsIFwiXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyB3YXJuKG1vZHVsZU5hbWUsIG1lc3NhZ2UpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oYCVjW0JhbmRhZ2VkQkRdJWMgWyR7bW9kdWxlTmFtZX1dJWMgJHttZXNzYWdlfWAsIFwiY29sb3I6ICNFOEE0MDA7IGZvbnQtd2VpZ2h0OiA3MDA7XCIsIFwiY29sb3I6ICNFOEE0MDA7XCIsIFwiXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlcnIobW9kdWxlTmFtZSwgbWVzc2FnZSwgZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgJWNbQmFuZGFnZWRCRF0lYyBbJHttb2R1bGVOYW1lfV0lYyAke21lc3NhZ2V9YCwgXCJjb2xvcjogcmVkOyBmb250LXdlaWdodDogNzAwO1wiLCBcImNvbG9yOiByZWQ7XCIsIFwiXCIpO1xyXG4gICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFwiJWNFcnJvcjogXCIgKyBlcnJvci5tZXNzYWdlLCBcImNvbG9yOiByZWQ7XCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yLnN0YWNrKTtcclxuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZXNjYXBlKHMpIHtcclxuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLS9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCBcIlxcXFwkJlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgdGVzdEpTT04oZGF0YSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzRW1wdHkob2JqKSB7XHJcbiAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IG9iaiA9PSB1bmRlZmluZWQgfHwgb2JqID09IFwiXCIpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmICh0eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmoubGVuZ3RoID09IDA7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc3VwcHJlc3NFcnJvcnMobWV0aG9kLCBtZXNzYWdlKSB7XHJcbiAgICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHsgcmV0dXJuIG1ldGhvZCguLi5wYXJhbXMpO1x0fVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkgeyB0aGlzLmVycihcIlN1cHByZXNzZWRFcnJvclwiLCBcIkVycm9yIG9jY3VycmVkIGluIFwiICsgbWVzc2FnZSwgZSk7IH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBtb25rZXlQYXRjaCh3aGF0LCBtZXRob2ROYW1lLCBvcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3Qge2JlZm9yZSwgYWZ0ZXIsIGluc3RlYWQsIG9uY2UgPSBmYWxzZSwgc2lsZW50ID0gZmFsc2UsIGZvcmNlID0gZmFsc2V9ID0gb3B0aW9ucztcclxuICAgICAgICBjb25zdCBkaXNwbGF5TmFtZSA9IG9wdGlvbnMuZGlzcGxheU5hbWUgfHwgd2hhdC5kaXNwbGF5TmFtZSB8fCB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lIHx8IHdoYXQubmFtZSB8fCB3aGF0LmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IHdoYXQuY29uc3RydWN0b3IubmFtZTtcclxuICAgICAgICBpZiAoIXNpbGVudCkgY29uc29sZS5sb2coXCJwYXRjaFwiLCBtZXRob2ROYW1lLCBcIm9mXCIsIGRpc3BsYXlOYW1lKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXHJcbiAgICAgICAgaWYgKCF3aGF0W21ldGhvZE5hbWVdKSB7XHJcbiAgICAgICAgICAgIGlmIChmb3JjZSkgd2hhdFttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge307XHJcbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIGNvbnNvbGUuZXJyb3IobWV0aG9kTmFtZSwgXCJkb2VzIG5vdCBleGlzdCBmb3JcIiwgZGlzcGxheU5hbWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgb3JpZ01ldGhvZCA9IHdoYXRbbWV0aG9kTmFtZV07XHJcbiAgICAgICAgbGV0IGNhbmNlbGVkID0gZmFsc2VcclxuICAgICAgICBjb25zdCBjYW5jZWwgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc2lsZW50KSBjb25zb2xlLmxvZyhcInVucGF0Y2hcIiwgbWV0aG9kTmFtZSwgXCJvZlwiLCBkaXNwbGF5TmFtZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxyXG4gICAgICAgICAgICAvL3doYXRbbWV0aG9kTmFtZV0gPSBvcmlnTWV0aG9kO1xyXG4gICAgICAgICAgICBjYW5jZWxlZCA9IHRydWUgLy8gdGhpcyBhbGxvdyB0byBtb25rZXlwYXRjaCBtb3JlIHRoYW4gb25lIHRpbWUuXHJcbiAgICAgICAgfTtcclxuICAgICAgICB3aGF0W21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGlmKGNhbmNlbGVkKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnTWV0aG9kLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzT2JqZWN0OiB0aGlzLFxyXG4gICAgICAgICAgICAgICAgbWV0aG9kQXJndW1lbnRzOiBhcmd1bWVudHMsXHJcbiAgICAgICAgICAgICAgICBjYW5jZWxQYXRjaDogY2FuY2VsLFxyXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxNZXRob2Q6IG9yaWdNZXRob2QsXHJcbiAgICAgICAgICAgICAgICBjYWxsT3JpZ2luYWxNZXRob2Q6ICgpID0+IGRhdGEucmV0dXJuVmFsdWUgPSBkYXRhLm9yaWdpbmFsTWV0aG9kLmFwcGx5KGRhdGEudGhpc09iamVjdCwgZGF0YS5tZXRob2RBcmd1bWVudHMpXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmIChpbnN0ZWFkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wUmV0ID0gVXRpbHMuc3VwcHJlc3NFcnJvcnMoaW5zdGVhZCwgXCJgaW5zdGVhZGAgY2FsbGJhY2sgb2YgXCIgKyB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lKShkYXRhKTtcclxuICAgICAgICAgICAgICAgIGlmICh0ZW1wUmV0ICE9PSB1bmRlZmluZWQpIGRhdGEucmV0dXJuVmFsdWUgPSB0ZW1wUmV0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGJlZm9yZSkgVXRpbHMuc3VwcHJlc3NFcnJvcnMoYmVmb3JlLCBcImBiZWZvcmVgIGNhbGxiYWNrIG9mIFwiICsgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSkoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBkYXRhLmNhbGxPcmlnaW5hbE1ldGhvZCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFmdGVyKSBVdGlscy5zdXBwcmVzc0Vycm9ycyhhZnRlciwgXCJgYWZ0ZXJgIGNhbGxiYWNrIG9mIFwiICsgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSkoZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG9uY2UpIGNhbmNlbCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YS5yZXR1cm5WYWx1ZTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24od2hhdFttZXRob2ROYW1lXSwgb3JpZ01ldGhvZCk7XHJcbiAgICAgICAgd2hhdFttZXRob2ROYW1lXS5fX21vbmtleVBhdGNoZWQgPSB0cnVlO1xyXG4gICAgICAgIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcclxuICAgICAgICBpZiAoIXdoYXRbbWV0aG9kTmFtZV0uX19vcmlnaW5hbE1ldGhvZCkge1xyXG4gICAgICAgICAgICB3aGF0W21ldGhvZE5hbWVdLl9fb3JpZ2luYWxNZXRob2QgPSBvcmlnTWV0aG9kO1xyXG4gICAgICAgICAgICB3aGF0W21ldGhvZE5hbWVdLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7cmV0dXJuIG9yaWdNZXRob2QudG9TdHJpbmcoKTt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2FuY2VsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBvblJlbW92ZWQobm9kZSwgY2FsbGJhY2spIHtcclxuICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgbSA9IDA7IG0gPCBtdXRhdGlvbnMubGVuZ3RoOyBtKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG11dGF0aW9uID0gbXV0YXRpb25zW21dO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3RNYXRjaCA9IG5vZGVzLmluZGV4T2Yobm9kZSkgPiAtMTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudE1hdGNoID0gbm9kZXMuc29tZShwYXJlbnQgPT4gcGFyZW50LmNvbnRhaW5zKG5vZGUpKTtcclxuICAgICAgICAgICAgICAgIGlmIChkaXJlY3RNYXRjaCB8fCBwYXJlbnRNYXRjaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwge3N1YnRyZWU6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXROZXN0ZWRQcm9wKG9iaiwgcGF0aCkge1xyXG4gICAgICAgIHJldHVybiBwYXRoLnNwbGl0KC9cXHM/XFwuXFxzPy8pLnJlZHVjZShmdW5jdGlvbihvYmosIHByb3ApIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiBvYmpbcHJvcF07XHJcbiAgICAgICAgfSwgb2JqKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgc2hvd3MgYSB0b2FzdCBzaW1pbGFyIHRvIGFuZHJvaWQgdG93YXJkcyB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgVGhlIHN0cmluZyB0byBzaG93IGluIHRoZSB0b2FzdC5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0LiBPcHRpb25hbCBwYXJhbWV0ZXIuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy50eXBlIENoYW5nZXMgdGhlIHR5cGUgb2YgdGhlIHRvYXN0IHN0eWxpc3RpY2FsbHkgYW5kIHNlbWFudGljYWxseS4gQ2hvaWNlczogXCJcIiwgXCJpbmZvXCIsIFwic3VjY2Vzc1wiLCBcImRhbmdlclwiL1wiZXJyb3JcIiwgXCJ3YXJuaW5nXCIvXCJ3YXJuXCIuIERlZmF1bHQ6IFwiXCJcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5pY29uIERldGVybWluZXMgd2hldGhlciB0aGUgaWNvbiBzaG91bGQgc2hvdyBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlLiBBIHRvYXN0IHdpdGhvdXQgdHlwZSB3aWxsIGFsd2F5cyBoYXZlIG5vIGljb24uIERlZmF1bHQ6IHRydWVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLnRpbWVvdXQgQWRqdXN0cyB0aGUgdGltZSAoaW4gbXMpIHRoZSB0b2FzdCBzaG91bGQgYmUgc2hvd24gZm9yIGJlZm9yZSBkaXNhcHBlYXJpbmcgYXV0b21hdGljYWxseS4gRGVmYXVsdDogMzAwMFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgc2hvd1RvYXN0KGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5iZC10b2FzdHNcIikpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5cIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaWRlYmFyICYmIGUuaGFzTm90aWNlKVswXS5zaWRlYmFyLnNwbGl0KFwiIFwiKVs5XStcIiArIGRpdlwiKSB8fCBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBtZW1iZXJsaXN0ID0gY29udGFpbmVyID8gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoXCIuXCIrQkRNb2R1bGVzLmdldChlID0+IGUubWVtYmVyc1dyYXApWzBdLm1lbWJlcnNXcmFwKSA6IG51bGw7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm0gPSBjb250YWluZXIgPyBjb250YWluZXIucXVlcnlTZWxlY3RvcihcImZvcm1cIikgOiBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBsZWZ0ID0gY29udGFpbmVyID8gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgOiAzMTA7XHJcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gbWVtYmVybGlzdCA/IG1lbWJlcmxpc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCA6IDA7XHJcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gcmlnaHQgPyByaWdodCAtIGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IDogVXRpbHMuc2NyZWVuV2lkdGggLSBsZWZ0IC0gMjQwO1xyXG4gICAgICAgICAgICBjb25zdCBib3R0b20gPSBmb3JtID8gZm9ybS5vZmZzZXRIZWlnaHQgOiA4MDtcclxuICAgICAgICAgICAgY29uc3QgdG9hc3RXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAgICAgdG9hc3RXcmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJiZC10b2FzdHNcIik7XHJcbiAgICAgICAgICAgIHRvYXN0V3JhcHBlci5zdHlsZS5zZXRQcm9wZXJ0eShcImxlZnRcIiwgbGVmdCArIFwicHhcIik7XHJcbiAgICAgICAgICAgIHRvYXN0V3JhcHBlci5zdHlsZS5zZXRQcm9wZXJ0eShcIndpZHRoXCIsIHdpZHRoICsgXCJweFwiKTtcclxuICAgICAgICAgICAgdG9hc3RXcmFwcGVyLnN0eWxlLnNldFByb3BlcnR5KFwiYm90dG9tXCIsIGJvdHRvbSArIFwicHhcIik7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwLW1vdW50XCIpLmFwcGVuZENoaWxkKHRvYXN0V3JhcHBlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHt0eXBlID0gXCJcIiwgaWNvbiA9IHRydWUsIHRpbWVvdXQgPSAzMDAwfSA9IG9wdGlvbnM7XHJcbiAgICAgICAgY29uc3QgdG9hc3RFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB0b2FzdEVsZW0uY2xhc3NMaXN0LmFkZChcImJkLXRvYXN0XCIpO1xyXG4gICAgICAgIGlmICh0eXBlKSB0b2FzdEVsZW0uY2xhc3NMaXN0LmFkZChcInRvYXN0LVwiICsgdHlwZSk7XHJcbiAgICAgICAgaWYgKHR5cGUgJiYgaWNvbikgdG9hc3RFbGVtLmNsYXNzTGlzdC5hZGQoXCJpY29uXCIpO1xyXG4gICAgICAgIHRvYXN0RWxlbS5pbm5lclRleHQgPSBjb250ZW50O1xyXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYmQtdG9hc3RzXCIpLmFwcGVuZENoaWxkKHRvYXN0RWxlbSk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRvYXN0RWxlbS5jbGFzc0xpc3QuYWRkKFwiY2xvc2luZ1wiKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0b2FzdEVsZW0ucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIuYmQtdG9hc3RzIC5iZC10b2FzdFwiKS5sZW5ndGgpIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYmQtdG9hc3RzXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9LCAzMDApO1xyXG4gICAgICAgIH0sIHRpbWVvdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBhbGVydCh0aXRsZSwgY29udGVudCkge1xyXG4gICAgICAgIGxldCBtb2RhbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1vZGFsICYmIGUuaW5uZXIgJiYgIWUuaGlkZU9uRnVsbHNjcmVlbilbMF1cclxuICAgICAgICBsZXQgaGVhZGVyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGVhZGVyICYmIGUucmVzcG9uc2l2ZVdpZHRoTW9iaWxlICYmIGUuaGlkZU9uRnVsbHNjcmVlbilbMF1cclxuICAgICAgICBsZXQgZm9vdGVyMk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhlYWRlciAmJiBlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSAmJiBlLmZvY3VzTG9jaylbMF1cclxuICAgICAgICBjb25zdCBtb2RhbCA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtd3JhcHBlciB0aGVtZS1kYXJrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1iYWNrZHJvcCAke0JETW9kdWxlcy5nZXQoZSA9PiBlLmJhY2tkcm9wICYmIGUuYmFja2Ryb3BXaXRoTGF5ZXIpWzBdLmJhY2tkcm9wfVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwgJHttb2RhbE1vZHVsZS5tb2RhbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbC1pbm5lciAke21vZGFsTW9kdWxlLmlubmVyfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXIgJHtoZWFkZXJNb2R1bGUuaGVhZGVyfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj4ke3RpdGxlfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGxlci13cmFwIGZhZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGxlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Y29udGVudH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyICR7aGVhZGVyTW9kdWxlLmZvb3Rlcn0gJHtmb290ZXIyTW9kdWxlLmZvb3Rlcn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCI+T2theTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PmApO1xyXG4gICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIuZm9vdGVyIGJ1dHRvblwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IFxyXG4gICAgICAgICAgICAgICAgbW9kYWwucmVtb3ZlKCk7IFxyXG4gICAgICAgICAgICAgICAgY2xvc2luZ0xpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0sIDMwMCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcihcIi5iZC1iYWNrZHJvcFwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IFxyXG4gICAgICAgICAgICAgICAgbW9kYWwucmVtb3ZlKCk7IFxyXG4gICAgICAgICAgICAgICAgY2xvc2luZ0xpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0sIDMwMCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKS5hcHBlbmQobW9kYWwpO1xyXG4gICAgICAgIGNvbnN0IGNsb3NpbmdMaXN0ZW5lcnMgPSBbXVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGNsb3NlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBcclxuICAgICAgICAgICAgICAgICAgICBtb2RhbC5yZW1vdmUoKTsgXHJcbiAgICAgICAgICAgICAgICAgICAgY2xvc2luZ0xpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcigpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9LCAzMDApO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBvbkNsb3NlOiAobGlzdGVuZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIGNsb3NpbmdMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IHBsdWdpbkVycm9ycyA9IFtdLCB0aGVtZXM6IHRoZW1lRXJyb3JzID0gW119KSB7XHJcbiAgICAgICAgaWYgKCFwbHVnaW5FcnJvcnMgfHwgIXRoZW1lRXJyb3JzKSByZXR1cm47XHJcbiAgICAgICAgaWYgKCFwbHVnaW5FcnJvcnMubGVuZ3RoICYmICF0aGVtZUVycm9ycy5sZW5ndGgpIHJldHVybjtcclxuICAgICAgICBsZXQgbW9kYWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tb2RhbCAmJiBlLmlubmVyICYmICFlLmhpZGVPbkZ1bGxzY3JlZW4pWzBdXHJcbiAgICAgICAgbGV0IGhlYWRlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhlYWRlciAmJiBlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSAmJiBlLmhpZGVPbkZ1bGxzY3JlZW4pWzBdXHJcbiAgICAgICAgbGV0IGZvb3RlcjJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oZWFkZXIgJiYgZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUgJiYgZS5mb2N1c0xvY2spWzBdXHJcbiAgICAgICAgY29uc3QgbW9kYWwgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cImJkLW1vZGFsLXdyYXBwZXIgdGhlbWUtZGFya1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtYmFja2Ryb3AgJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5iYWNrZHJvcCAmJiBlLmJhY2tkcm9wV2l0aExheWVyKVswXS5iYWNrZHJvcH1cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsIGJkLWNvbnRlbnQtbW9kYWwgJHttb2RhbE1vZHVsZS5tb2RhbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbC1pbm5lciAke21vZGFsTW9kdWxlLmlubmVyfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXIgJHtoZWFkZXJNb2R1bGUuaGVhZGVyfVwiPjxkaXYgY2xhc3M9XCJ0aXRsZVwiPkNvbnRlbnQgRXJyb3JzPC9kaXY+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1iYXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhciBUT1BcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhci1pdGVtXCI+UGx1Z2luczwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYmFyLWl0ZW1cIj5UaGVtZXM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tbmFtZVwiPk5hbWU8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLW1lc3NhZ2VcIj5NZXNzYWdlPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1lcnJvclwiPkVycm9yPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsZXItd3JhcCBmYWRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsZXJcIj5cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXIgJHtoZWFkZXJNb2R1bGUuZm9vdGVyfSAke2Zvb3RlcjJNb2R1bGUuZm9vdGVyfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIj5Pa2F5PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+YCk7XHJcbiAgICBcclxuICAgICAgICBmdW5jdGlvbiBnZW5lcmF0ZVRhYihlcnJvcnMpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCJlcnJvcnNcIj5gKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBlcnIgb2YgZXJyb3JzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiZXJyb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tbmFtZVwiPiR7ZXJyLm5hbWUgPyBlcnIubmFtZSA6IGVyci5maWxlfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1tZXNzYWdlXCI+JHtlcnIubWVzc2FnZX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tZXJyb3JcIj48YSBjbGFzcz1cImVycm9yLWxpbmtcIiBocmVmPVwiXCI+JHtlcnIuZXJyb3IgPyBlcnIuZXJyb3IubWVzc2FnZSA6IFwiXCJ9PC9hPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PmApO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyLmVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IucXVlcnlTZWxlY3RvckFsbChcImFcIikuZm9yRWFjaChlbCA9PiBlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgRXJyb3IgZGV0YWlscyBmb3IgJHtlcnIubmFtZSA/IGVyci5uYW1lIDogZXJyLmZpbGV9LmAsIGVyci5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXI7XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgY29uc3QgdGFicyA9IFtnZW5lcmF0ZVRhYihwbHVnaW5FcnJvcnMpLCBnZW5lcmF0ZVRhYih0aGVtZUVycm9ycyldO1xyXG4gICAgXHJcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvckFsbChcIi50YWItYmFyLWl0ZW1cIikuZm9yRWFjaChlbCA9PiBlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIudGFiLWJhci1pdGVtLnNlbGVjdGVkXCIpO1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIERPTS5yZW1vdmVDbGFzcyhzZWxlY3RlZCwgXCJzZWxlY3RlZFwiKTtcclxuICAgICAgICAgICAgRE9NLmFkZENsYXNzKGUudGFyZ2V0LCBcInNlbGVjdGVkXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxlciA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIuc2Nyb2xsZXJcIik7XHJcbiAgICAgICAgICAgIHNjcm9sbGVyLmlubmVySFRNTCA9IFwiXCI7XHJcbiAgICAgICAgICAgIHNjcm9sbGVyLmFwcGVuZCh0YWJzW0RPTS5pbmRleChlLnRhcmdldCldKTtcclxuICAgICAgICB9KSk7XHJcbiAgICBcclxuICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLmZvb3RlciBidXR0b25cIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBtb2RhbC5yZW1vdmUoKTsgfSwgMzAwKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLmJkLWJhY2tkcm9wXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIERPTS5hZGRDbGFzcyhtb2RhbCwgXCJjbG9zaW5nXCIpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgbW9kYWwucmVtb3ZlKCk7IH0sIDMwMCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKS5hcHBlbmQobW9kYWwpO1xyXG4gICAgICAgIGlmIChwbHVnaW5FcnJvcnMubGVuZ3RoKSBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLnRhYi1iYXItaXRlbVwiKS5jbGljaygpO1xyXG4gICAgICAgIGVsc2UgbW9kYWwucXVlcnlTZWxlY3RvckFsbChcIi50YWItYmFyLWl0ZW1cIilbMV0uY2xpY2soKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc2hvd0NoYW5nZWxvZ01vZGFsKG9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIGNvbnN0IE1vZGFsU3RhY2sgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInB1c2hcIiwgXCJ1cGRhdGVcIiwgXCJwb3BcIiwgXCJwb3BXaXRoS2V5XCIpO1xyXG4gICAgICAgIGNvbnN0IENoYW5nZWxvZ0NsYXNzZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImZpeGVkXCIsIFwiaW1wcm92ZWRcIik7XHJcbiAgICAgICAgY29uc3QgVGV4dEVsZW1lbnQgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIlRleHRcIik7XHJcbiAgICAgICAgY29uc3QgRmxleENoaWxkID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJDaGlsZFwiKTtcclxuICAgICAgICBjb25zdCBUaXRsZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcIlRhZ3NcIiwgXCJkZWZhdWx0XCIpO1xyXG4gICAgICAgIGNvbnN0IENoYW5nZWxvZyA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHRQcm9wcyAmJiBtLmRlZmF1bHRQcm9wcy5zZWxlY3RhYmxlID09IGZhbHNlKTtcclxuICAgICAgICBjb25zdCBNYXJrZG93blBhcnNlciA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiZGVmYXVsdFJ1bGVzXCIsIFwicGFyc2VcIik7XHJcbiAgICAgICAgaWYgKCFDaGFuZ2Vsb2cgfHwgIU1vZGFsU3RhY2sgfHwgIUNoYW5nZWxvZ0NsYXNzZXMgfHwgIVRleHRFbGVtZW50IHx8ICFGbGV4Q2hpbGQgfHwgIVRpdGxlcyB8fCAhTWFya2Rvd25QYXJzZXIpIHJldHVybjtcclxuICAgIFxyXG4gICAgICAgIGNvbnN0IHtcclxuICAgICAgICAgICAgaW1hZ2UgPSBcImh0dHBzOi8vcmVwb3NpdG9yeS1pbWFnZXMuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzEwNTQ3MzUzNy85NTdiNTQ4MC03YzI2LTExZTktODQwMS01MGZhODIwY2JhZTVcIiwgXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gXCJcIiwgXHJcbiAgICAgICAgICAgIGNoYW5nZXMgPSBbXSwgXHJcbiAgICAgICAgICAgIHRpdGxlID0gXCJCYW5kYWdlZEJEXCIsIFxyXG4gICAgICAgICAgICBzdWJ0aXRsZSA9IGB2JHtiYmRWZXJzaW9ufWAsIFxyXG4gICAgICAgICAgICBmb290ZXJcclxuICAgICAgICB9ID0gb3B0aW9ucztcclxuICAgICAgICBjb25zdCBjZSA9IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudDtcclxuICAgICAgICBjb25zdCBjaGFuZ2Vsb2dJdGVtcyA9IFtjZShcImltZ1wiLCB7c3JjOiBpbWFnZX0pXTtcclxuICAgICAgICBpZiAoZGVzY3JpcHRpb24pIGNoYW5nZWxvZ0l0ZW1zLnB1c2goY2UoXCJwXCIsIG51bGwsIE1hcmtkb3duUGFyc2VyLnBhcnNlKGRlc2NyaXB0aW9uKSkpO1xyXG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hhbmdlcy5sZW5ndGg7IGMrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IGNoYW5nZXNbY107XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBDaGFuZ2Vsb2dDbGFzc2VzW2VudHJ5LnR5cGVdID8gQ2hhbmdlbG9nQ2xhc3Nlc1tlbnRyeS50eXBlXSA6IENoYW5nZWxvZ0NsYXNzZXMuYWRkZWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hcmdpbiA9IGMgPT0gMCA/IENoYW5nZWxvZ0NsYXNzZXMubWFyZ2luVG9wIDogXCJcIjtcclxuICAgICAgICAgICAgY2hhbmdlbG9nSXRlbXMucHVzaChjZShcImgxXCIsIHtjbGFzc05hbWU6IGAke3R5cGV9ICR7bWFyZ2lufWAsfSwgZW50cnkudGl0bGUpKTtcclxuICAgICAgICAgICAgY29uc3QgbGlzdCA9IGNlKFwidWxcIiwgbnVsbCwgZW50cnkuaXRlbXMubWFwKGkgPT4gY2UoXCJsaVwiLCBudWxsLCBNYXJrZG93blBhcnNlci5wYXJzZShpKSkpKTtcclxuICAgICAgICAgICAgY2hhbmdlbG9nSXRlbXMucHVzaChsaXN0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVuZGVySGVhZGVyID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjZShGbGV4Q2hpbGQuQ2hpbGQsIHtncm93OiAxLCBzaHJpbms6IDF9LFxyXG4gICAgICAgICAgICAgICAgY2UoVGl0bGVzLmRlZmF1bHQsIHt0YWc6IFRpdGxlcy5UYWdzLkg0fSwgdGl0bGUpLFxyXG4gICAgICAgICAgICAgICAgY2UoVGV4dEVsZW1lbnQse3NpemU6IFRleHRFbGVtZW50LlNpemVzLlNNQUxMLCBjb2xvcjogVGV4dEVsZW1lbnQuQ29sb3JzLlNUQU5EQVJELCBjbGFzc05hbWU6IENoYW5nZWxvZ0NsYXNzZXMuZGF0ZX0sIHN1YnRpdGxlKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH07XHJcbiAgICBcclxuICAgICAgICBjb25zdCByZW5kZXJGb290ZXIgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBBbmNob3JDbGFzc2VzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyXCIpIHx8IHthbmNob3I6IFwiYW5jaG9yLTNaLThCYlwiLCBhbmNob3JVbmRlcmxpbmVPbkhvdmVyOiBcImFuY2hvclVuZGVybGluZU9uSG92ZXItMkVTSFFCXCJ9O1xyXG4gICAgICAgICAgICBjb25zdCBqb2luU3VwcG9ydFNlcnZlciA9IChjbGljaykgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2xpY2sucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGNsaWNrLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgTW9kYWxTdGFjay5wb3AoKTtcclxuICAgICAgICAgICAgICAgIEJEVjIuam9pbkJEMigpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjb25zdCBzdXBwb3J0TGluayA9IEFuY2hvciA/IGNlKEFuY2hvciwge29uQ2xpY2s6IGpvaW5TdXBwb3J0U2VydmVyfSwgXCJKb2luIG91ciBEaXNjb3JkIFNlcnZlci5cIikgOiBjZShcImFcIiwge2NsYXNzTmFtZTogYCR7QW5jaG9yQ2xhc3Nlcy5hbmNob3J9ICR7QW5jaG9yQ2xhc3Nlcy5hbmNob3JVbmRlcmxpbmVPbkhvdmVyfWAsIG9uQ2xpY2s6IGpvaW5TdXBwb3J0U2VydmVyfSwgXCJKb2luIG91ciBEaXNjb3JkIFNlcnZlci5cIik7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRGb290ZXIgPSBjZShUZXh0RWxlbWVudCx7c2l6ZTogVGV4dEVsZW1lbnQuU2l6ZXMuU01BTEwsIGNvbG9yOiBUZXh0RWxlbWVudC5Db2xvcnMuU1RBTkRBUkR9LCBcIk5lZWQgc3VwcG9ydD8gXCIsIHN1cHBvcnRMaW5rKTtcclxuICAgICAgICAgICAgcmV0dXJuIGNlKEZsZXhDaGlsZC5DaGlsZCwge2dyb3c6IDEsIHNocmluazogMX0sIGZvb3RlciA/IGZvb3RlciA6IGRlZmF1bHRGb290ZXIpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiBNb2RhbFN0YWNrLnB1c2goZnVuY3Rpb24ocHJvcHMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNlKENoYW5nZWxvZywgT2JqZWN0LmFzc2lnbih7XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IENoYW5nZWxvZ0NsYXNzZXMuY29udGFpbmVyLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0YWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIG9uU2Nyb2xsOiBfID0+IF8sXHJcbiAgICAgICAgICAgICAgICBvbkNsb3NlOiBfID0+IF8sXHJcbiAgICAgICAgICAgICAgICByZW5kZXJIZWFkZXI6IHJlbmRlckhlYWRlcixcclxuICAgICAgICAgICAgICAgIHJlbmRlckZvb3RlcjogcmVuZGVyRm9vdGVyLFxyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IGNoYW5nZWxvZ0l0ZW1zXHJcbiAgICAgICAgICAgIH0sIHByb3BzKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG93cyBhIGdlbmVyaWMgYnV0IHZlcnkgY3VzdG9taXphYmxlIGNvbmZpcm1hdGlvbiBtb2RhbCB3aXRoIG9wdGlvbmFsIGNvbmZpcm0gYW5kIGNhbmNlbCBjYWxsYmFja3MuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSB0aXRsZSBvZiB0aGUgbW9kYWxcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xSZWFjdEVsZW1lbnR8QXJyYXk8c3RyaW5nfFJlYWN0RWxlbWVudD4pfSBjaGlsZHJlbiAtIGEgc2luZ2xlIG9yIG1peGVkIGFycmF5IG9mIHJlYWN0IGVsZW1lbnRzIGFuZCBzdHJpbmdzLiBFdmVyeSBzdHJpbmcgaXMgd3JhcHBlZCBpbiBEaXNjb3JkJ3MgYE1hcmtkb3duYCBjb21wb25lbnQgc28gc3RyaW5ncyB3aWxsIHNob3cgYW5kIHJlbmRlciBwcm9wZXJseS5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBvcHRpb25zIHRvIG1vZGlmeSB0aGUgbW9kYWxcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGFuZ2VyPWZhbHNlXSAtIHdoZXRoZXIgdGhlIG1haW4gYnV0dG9uIHNob3VsZCBiZSByZWQgb3Igbm90XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY29uZmlybVRleHQ9T2theV0gLSB0ZXh0IGZvciB0aGUgY29uZmlybWF0aW9uL3N1Ym1pdCBidXR0b25cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jYW5jZWxUZXh0PUNhbmNlbF0gLSB0ZXh0IGZvciB0aGUgY2FuY2VsIGJ1dHRvblxyXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gW29wdGlvbnMub25Db25maXJtPU5PT1BdIC0gY2FsbGJhY2sgdG8gb2NjdXIgd2hlbiBjbGlja2luZyB0aGUgc3VibWl0IGJ1dHRvblxyXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gW29wdGlvbnMub25DYW5jZWw9Tk9PUF0gLSBjYWxsYmFjayB0byBvY2N1ciB3aGVuIGNsaWNraW5nIHRoZSBjYW5jZWwgYnV0dG9uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMua2V5XSAtIGtleSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBtb2RhbC4gSWYgbm90IHByb3ZpZGVkLCBvbmUgaXMgZ2VuZXJhdGVkIGFuZCByZXR1cm5lZFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSB0aGUga2V5IHVzZWQgZm9yIHRoaXMgbW9kYWxcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHNob3dDb25maXJtYXRpb25Nb2RhbCh0aXRsZSwgY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICAgICAgY29uc3QgTW9kYWxTdGFjayA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwicHVzaFwiLCBcInVwZGF0ZVwiLCBcInBvcFwiLCBcInBvcFdpdGhLZXlcIik7XHJcbiAgICAgICAgY29uc3QgTWFya2Rvd24gPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIk1hcmtkb3duXCIpO1xyXG4gICAgICAgIGNvbnN0IENvbmZpcm1hdGlvbk1vZGFsID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdFByb3BzICYmIG0ua2V5ICYmIG0ua2V5KCkgPT0gXCJjb25maXJtLW1vZGFsXCIpO1xyXG4gICAgICAgIGlmICghTW9kYWxTdGFjayB8fCAhQ29uZmlybWF0aW9uTW9kYWwgfHwgIU1hcmtkb3duKSByZXR1cm4gVXRpbHMuYWxlcnQodGl0bGUsIGNvbnRlbnQpO1xyXG5cclxuICAgICAgICBjb25zdCBlbXB0eUZ1bmN0aW9uID0gKCkgPT4ge307XHJcbiAgICAgICAgY29uc3Qge29uQ29uZmlybSA9IGVtcHR5RnVuY3Rpb24sIG9uQ2FuY2VsID0gZW1wdHlGdW5jdGlvbiwgY29uZmlybVRleHQgPSBcIk9rYXlcIiwgY2FuY2VsVGV4dCA9IFwiQ2FuY2VsXCIsIGRhbmdlciA9IGZhbHNlLCBrZXkgPSB1bmRlZmluZWR9ID0gb3B0aW9ucztcclxuXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRlbnQpKSBjb250ZW50ID0gW2NvbnRlbnRdO1xyXG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50Lm1hcChjID0+IHR5cGVvZihjKSA9PT0gXCJzdHJpbmdcIiA/IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChNYXJrZG93biwgbnVsbCwgYykgOiBjKTtcclxuICAgICAgICByZXR1cm4gTW9kYWxTdGFjay5wdXNoKENvbmZpcm1hdGlvbk1vZGFsLCB7XHJcbiAgICAgICAgICAgIGhlYWRlcjogdGl0bGUsXHJcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjb250ZW50LFxyXG4gICAgICAgICAgICByZWQ6IGRhbmdlcixcclxuICAgICAgICAgICAgY29uZmlybVRleHQ6IGNvbmZpcm1UZXh0LFxyXG4gICAgICAgICAgICBjYW5jZWxUZXh0OiBjYW5jZWxUZXh0LFxyXG4gICAgICAgICAgICBvbkNvbmZpcm06IG9uQ29uZmlybSxcclxuICAgICAgICAgICAgb25DYW5jZWw6IG9uQ2FuY2VsXHJcbiAgICAgICAgfSwga2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgcmVtb3ZlRGEoY2xhc3NOYW1lKXtcclxuICAgICAgICBpZighY2xhc3NOYW1lKXJldHVybiBjbGFzc05hbWVcclxuICAgICAgICByZXR1cm4gY2xhc3NOYW1lLnNwbGl0KFwiIFwiKS5maWx0ZXIoZSA9PiAhZS5zdGFydHNXaXRoKFwiZGEtXCIpKS5qb2luKFwiIFwiKVxyXG4gICAgfVxyXG59XHJcblxyXG5VdGlscy5zaG93VG9hc3QgPSBVdGlscy5zdXBwcmVzc0Vycm9ycyhVdGlscy5zaG93VG9hc3QsIFwiQ291bGQgbm90IHNob3cgdG9hc3QuXCIpO1xyXG5cclxud2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLlV0aWxzID0gVXRpbHMiLCJpbXBvcnQge3NldHRpbmdzfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuL3RoZW1lTW9kdWxlXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVjIge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuZWRpdG9yRGV0YWNoZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLldlYnBhY2tNb2R1bGVzID0gKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmVxID0gd2VicGFja0pzb25wLnB1c2goW1tdLCB7X19leHRyYV9pZF9fOiAobW9kdWxlLCBleHBvcnRzLCByZXEpID0+IG1vZHVsZS5leHBvcnRzID0gcmVxfSwgW1tcIl9fZXh0cmFfaWRfX1wiXV1dKTtcclxuICAgICAgICAgICAgZGVsZXRlIHJlcS5tLl9fZXh0cmFfaWRfXztcclxuICAgICAgICAgICAgZGVsZXRlIHJlcS5jLl9fZXh0cmFfaWRfXztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFByb3RlY3QgPSB0aGVNb2R1bGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoZU1vZHVsZS5yZW1vdmUgJiYgdGhlTW9kdWxlLnNldCAmJiB0aGVNb2R1bGUuY2xlYXIgJiYgdGhlTW9kdWxlLmdldCAmJiAhdGhlTW9kdWxlLnNvcnQpIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoZU1vZHVsZS5nZXRUb2tlbiB8fCB0aGVNb2R1bGUuZ2V0RW1haWwgfHwgdGhlTW9kdWxlLnNob3dUb2tlbikgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBwcm90ZWN0ID0gKHRoZU1vZHVsZSwgaXNEZWZhdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbW9kID0gIWlzRGVmYXVsdCA/IHRoZU1vZHVsZS5kZWZhdWx0IDogdGhlTW9kdWxlXHJcbiAgICAgICAgICAgICAgICBpZighbW9kKXJldHVybiB0aGVNb2R1bGVcclxuICAgICAgICAgICAgICAgIGlmIChtb2QucmVtb3ZlICYmIG1vZC5zZXQgJiYgbW9kLmNsZWFyICYmIG1vZC5nZXQgJiYgIW1vZC5zb3J0KSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmICghbW9kLmdldFRva2VuICYmICFtb2QuZ2V0RW1haWwgJiYgIW1vZC5zaG93VG9rZW4pcmV0dXJuIHRoZU1vZHVsZVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KG1vZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24ob2JqLCBwcm9wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wID09PSBcImdldFRva2VuXCIgfHwgcHJvcCA9PT0gXCJnZXRFbWFpbFwiIHx8IHByb3AgPT09IFwic2hvd1Rva2VuXCIpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgcHJvcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKG9iaiwgZnVuYykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuYyA9PSBcImdldFRva2VuXCIgJiYgb2JqLmdldFRva2VuKSByZXR1cm4gKCkgPT4gXCJtZmEuWENuYkt6bzBDTElxZEp6Qm5MMEQ4UGZEcnVxa0pOSGp3SFh0cjM5VVUzRjhoSHg0M2pvaklTeWk1amRqTzUyZTlfZTlNam1hZlpGRnBjLXNlT01hXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jID09IFwiZ2V0RW1haWxcIiAmJiBvYmouZ2V0RW1haWwpIHJldHVybiAoKSA9PiBcInB1cHBldDExMTEyQGdtYWlsLmNvbVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuYyA9PSBcInNob3dUb2tlblwiICYmIG9iai5zaG93VG9rZW4pIHJldHVybiAoKSA9PiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuYyA9PSBcIl9fcHJvdG9fX1wiICYmIG9iai5fX3Byb3RvX18pIHJldHVybiBwcm94eTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmpbZnVuY107XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYoIWlzRGVmYXVsdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoZU1vZHVsZSwge2RlZmF1bHQ6IHByb3h5fSlcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJveHk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBmaW5kID0gKGZpbHRlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIHJlcS5jKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS5jLmhhc093blByb3BlcnR5KGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG0gPSByZXEuY1tpXS5leHBvcnRzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobSAmJiBtLl9fZXNNb2R1bGUgJiYgbS5kZWZhdWx0ICYmIGZpbHRlcihtLmRlZmF1bHQpKSByZXR1cm4gcHJvdGVjdChtLmRlZmF1bHQsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobSAmJiBmaWx0ZXIobSkpXHRyZXR1cm4gcHJvdGVjdChtLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKFwiQ2Fubm90IGZpbmQgbG9hZGVkIG1vZHVsZSBpbiBjYWNoZVwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZmluZEFsbCA9IChmaWx0ZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZHVsZXMgPSBbXTtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiByZXEuYykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXEuYy5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtID0gcmVxLmNbaV0uZXhwb3J0cztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0gJiYgbS5fX2VzTW9kdWxlICYmIG0uZGVmYXVsdCAmJiBmaWx0ZXIobS5kZWZhdWx0KSkgbW9kdWxlcy5wdXNoKHByb3RlY3QobS5kZWZhdWx0LCB0cnVlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG0gJiYgZmlsdGVyKG0pKSBtb2R1bGVzLnB1c2gocHJvdGVjdChtLCBmYWxzZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGVzO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZmluZEJ5VW5pcXVlUHJvcGVydGllcyA9IChwcm9wTmFtZXMpID0+IGZpbmQobW9kdWxlID0+IHByb3BOYW1lcy5ldmVyeShwcm9wID0+IG1vZHVsZVtwcm9wXSAhPT0gdW5kZWZpbmVkKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmRCeVByb3RvdHlwZXMgPSAocHJvdG9OYW1lcykgPT4gZmluZChtb2R1bGUgPT4gbW9kdWxlLnByb3RvdHlwZSAmJiBwcm90b05hbWVzLmV2ZXJ5KHByb3RvUHJvcCA9PiBtb2R1bGUucHJvdG90eXBlW3Byb3RvUHJvcF0gIT09IHVuZGVmaW5lZCkpO1xyXG4gICAgICAgICAgICBjb25zdCBmaW5kQnlEaXNwbGF5TmFtZSA9IChkaXNwbGF5TmFtZSkgPT4gZmluZChtb2R1bGUgPT4gbW9kdWxlLmRpc3BsYXlOYW1lID09PSBkaXNwbGF5TmFtZSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge2ZpbmQsIGZpbmRBbGwsIGZpbmRCeVVuaXF1ZVByb3BlcnRpZXMsIGZpbmRCeVByb3RvdHlwZXMsIGZpbmRCeURpc3BsYXlOYW1lfTtcclxuICAgICAgICB9KSgpO1xyXG5cclxuICAgICAgICB0aGlzLmludGVybmFsID0ge1xyXG4gICAgICAgICAgICByZWFjdDogdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcIkNvbXBvbmVudFwiLCBcIlB1cmVDb21wb25lbnRcIiwgXCJDaGlsZHJlblwiLCBcImNyZWF0ZUVsZW1lbnRcIiwgXCJjbG9uZUVsZW1lbnRcIl0pLFxyXG4gICAgICAgICAgICByZWFjdERvbTogdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImZpbmRET01Ob2RlXCJdKVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5nZXRJbnRlcm5hbEluc3RhbmNlID0gZSA9PiBlW09iamVjdC5rZXlzKGUpLmZpbmQoayA9PiBrLnN0YXJ0c1dpdGgoXCJfX3JlYWN0SW50ZXJuYWxJbnN0YW5jZVwiKSldO1xyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5WMiA9IHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBpbml0aWFsaXplKCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBqb2luQkQxKCkge3RoaXMuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGVBbmRUcmFuc2l0aW9uVG9JbnZpdGVDaGFubmVsKFwiMFRtZm81WmJPUkNScWJBZFwiKTt9XHJcbiAgICBsZWF2ZUJEMSgpIHt0aGlzLkd1aWxkQWN0aW9ucy5sZWF2ZUd1aWxkKFwiODYwMDQ3NDQ5NjY5MTQwNDhcIik7fVxyXG5cclxuICAgIGpvaW5CRDIoKSB7dGhpcy5JbnZpdGVBY3Rpb25zLmFjY2VwdEludml0ZUFuZFRyYW5zaXRpb25Ub0ludml0ZUNoYW5uZWwoXCIySFNjbThqXCIpO31cclxuICAgIGxlYXZlQkQyKCkge3RoaXMuR3VpbGRBY3Rpb25zLmxlYXZlR3VpbGQoXCIyODA4MDY0NzI5MjgxOTg2NTZcIik7fVxyXG5cclxuICAgIGpvaW5MQygpIHt0aGlzLkludml0ZUFjdGlvbnMuYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbChcIjdlRmZmMkFcIik7fVxyXG4gICAgbGVhdmVMQygpIHt0aGlzLkd1aWxkQWN0aW9ucy5sZWF2ZUd1aWxkKFwiNzA1OTA4MzUwMjE4NjY2MTE3XCIpO31cclxuXHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHt0eXBlb2YgUmVhY3R9XHJcbiAgICAgKi9cclxuICAgIGdldCByZWFjdCgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdDt9XHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHt0eXBlb2YgUmVhY3R9XHJcbiAgICAgKi9cclxuICAgIGdldCBSZWFjdCgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdDt9XHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwicmVhY3QtZG9tXCIpfVxyXG4gICAgICovXHJcbiAgICBnZXQgcmVhY3REb20oKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3REb207fVxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcInJlYWN0LWRvbVwiKX1cclxuICAgICAqL1xyXG4gICAgZ2V0IFJlYWN0RG9tKCkge3JldHVybiB0aGlzLmludGVybmFsLnJlYWN0RG9tO31cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge3R5cGVvZiBSZWFjdC5Db21wb25lbnR9XHJcbiAgICAgKi9cclxuICAgIGdldCByZWFjdENvbXBvbmVudCgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdC5Db21wb25lbnQ7fVxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIFJlYWN0LkNvbXBvbmVudH1cclxuICAgICAqL1xyXG4gICAgZ2V0IFJlYWN0Q29tcG9uZW50KCkge3JldHVybiB0aGlzLmludGVybmFsLnJlYWN0LkNvbXBvbmVudDt9XHJcblxyXG4gICAgZ2V0IGFuY2hvckNsYXNzZXMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyXCJdKSB8fCB7YW5jaG9yOiBcImFuY2hvci0zWi04QmJcIiwgYW5jaG9yVW5kZXJsaW5lT25Ib3ZlcjogXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyLTJFU0hRQlwifTt9XHJcbiAgICBnZXQgc2xhdGVFZGl0b3JDbGFzc2VzKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wic2xhdGVUZXh0QXJlYVwiXSk7fVxyXG4gICAgZ2V0IG1lc3NhZ2VDbGFzc2VzKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wibWVzc2FnZVwiLCBcImNvbnRhaW5lckNvenlcIl0pO31cclxuICAgIGdldCBndWlsZENsYXNzZXMoKSB7XHJcblx0XHRjb25zdCBndWlsZHNXcmFwcGVyID0gQkRNb2R1bGVzLmdldChlID0+IGUud3JhcHBlciAmJiBlLnVucmVhZE1lbnRpb25zQmFyKVswXTtcclxuICAgICAgICBjb25zdCBndWlsZHMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5ndWlsZHNFcnJvciAmJiBlLnNlbGVjdGVkKVswXVxyXG4gICAgICAgIGNvbnN0IHBpbGwgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5ibG9iQ29udGFpbmVyKVswXVxyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBndWlsZHNXcmFwcGVyLCBndWlsZHMsIHBpbGwpO1xyXG5cdH1cclxuXHJcbiAgICBnZXQgTWVzc2FnZUNvbnRlbnRDb21wb25lbnQoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdFByb3BzICYmIG0uZGVmYXVsdFByb3BzLmhhc093blByb3BlcnR5KFwiZGlzYWJsZUJ1dHRvbnNcIikpO31cclxuICAgIGdldCBNZXNzYWdlQ29tcG9uZW50KCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHQgJiYgbS5kZWZhdWx0LmRpc3BsYXlOYW1lICYmIG0uZGVmYXVsdC5kaXNwbGF5TmFtZSA9PSBcIk1lc3NhZ2VcIik7fVxyXG4gICAgZ2V0IFRpbWVGb3JtYXR0ZXIoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJkYXRlRm9ybWF0XCJdKTt9XHJcbiAgICBnZXQgVG9vbHRpcFdyYXBwZXIoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJUb29sdGlwXCIpO31cclxuICAgIGdldCBOYXRpdmVNb2R1bGUoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJzZXRCYWRnZVwiXSk7fVxyXG4gICAgZ2V0IEludml0ZUFjdGlvbnMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJhY2NlcHRJbnZpdGVcIl0pO31cclxuICAgIGdldCBHdWlsZEFjdGlvbnMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJsZWF2ZUd1aWxkXCJdKTt9XHJcbiAgICBnZXQgVG9vbHRpcHMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uaGlkZSAmJiBtLnNob3cgJiYgIW0uc2VhcmNoICYmICFtLnN1Ym1pdCAmJiAhbS5zZWFyY2ggJiYgIW0uYWN0aXZhdGVSYWdpbmdEZW1vbiAmJiAhbS5kaXNtaXNzKTt9XHJcbiAgICBnZXQgS2V5R2VuZXJhdG9yKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLnRvU3RyaW5nICYmIC9cImJpbmFyeVwiLy50ZXN0KG0udG9TdHJpbmcoKSkpO31cclxuICAgIGdldCBMYXllclN0YWNrKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wicG9wTGF5ZXJcIl0pO31cclxuICAgIGdldCBVc2VyU3RvcmUoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJnZXRDdXJyZW50VXNlclwiXSk7fVxyXG4gICAgZ2V0IENoYW5uZWxTdG9yZSgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldENoYW5uZWxcIl0pO31cclxuICAgIGdldCBDaGFubmVsQWN0aW9ucygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcIm9wZW5Qcml2YXRlQ2hhbm5lbFwiXSk7fVxyXG4gICAgZ2V0IFByaXZhdGVDaGFubmVsQWN0aW9ucygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInNlbGVjdFByaXZhdGVDaGFubmVsXCJdKTt9XHJcblxyXG4gICAgb3BlbkRNKHVzZXJJZCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGZJZCA9IHRoaXMuVXNlclN0b3JlLmdldEN1cnJlbnRVc2VyKCkuaWQ7XHJcbiAgICAgICAgaWYgKHNlbGZJZCA9PSB1c2VySWQpIHJldHVybjtcclxuICAgICAgICBjb25zdCBwcml2YXRlQ2hhbm5lbElkID0gdGhpcy5DaGFubmVsU3RvcmUuZ2V0RE1Gcm9tVXNlcklkKHVzZXJJZCk7XHJcbiAgICAgICAgaWYgKHByaXZhdGVDaGFubmVsSWQpIHJldHVybiB0aGlzLlByaXZhdGVDaGFubmVsQWN0aW9ucy5zZWxlY3RQcml2YXRlQ2hhbm5lbChwcml2YXRlQ2hhbm5lbElkKTtcclxuICAgICAgICB0aGlzLkNoYW5uZWxBY3Rpb25zLm9wZW5Qcml2YXRlQ2hhbm5lbChzZWxmSWQsIHVzZXJJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcGFyc2VTZXR0aW5ncyhjYXQpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoc2V0dGluZ3MpLnJlZHVjZSgoYXJyLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2V0dGluZyA9IHNldHRpbmdzW2tleV07XHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5nLmNhdCA9PT0gY2F0ICYmIHNldHRpbmcuaW1wbGVtZW50ZWQgJiYgIXNldHRpbmcuaGlkZGVuKSB7XHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nLnRleHQgPSBrZXk7XHJcbiAgICAgICAgICAgICAgICBhcnIucHVzaChzZXR0aW5nKTtcclxuICAgICAgICAgICAgfSByZXR1cm4gYXJyO1xyXG4gICAgICAgIH0sIFtdKTtcclxuICAgIH1cclxuXHJcbn07IiwiaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuY29uc3Qgc3R5bGUgPSBgXHJcbiAgICAuY29udGFpbmVyLTJSbDAxdSB7XHJcbiAgICAgICAgZGlzcGxheTogbm9uZSFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLmNoYXQtM2JSeHh1IHtcclxuICAgICAgICBkaXNwbGF5OiBub25lIWltcG9ydGFudDtcclxuICAgIH1cclxuXHJcbiAgICAuc2lkZWJhci0ySzhwRmgge1xyXG4gICAgICAgIGZsZXgtZ3JvdzogMSFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcbmA7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVm9pY2VNb2RlIHtcclxuICAgIHN0YXJ0KCkge1xyXG4gICAgICAgIERPTS5hZGRTdHlsZShcIlZvaWNlTW9kZVwiLCBzdHlsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RvcCgpIHtcclxuICAgICAgICBET00ucmVtb3ZlU3R5bGUoXCJWb2ljZU1vZGVcIik7XHJcbiAgICB9XHJcbn07IiwiY29uc3QgcmVxID0gd2VicGFja0pzb25wLnB1c2goW1tdLCB7X19leHRyYV9pZF9fOiAobW9kdWxlLCBleHBvcnRzLCByZXEpID0+IG1vZHVsZS5leHBvcnRzID0gcmVxfSwgW1tcIl9fZXh0cmFfaWRfX1wiXV1dKTtcclxuZGVsZXRlIHJlcS5tLl9fZXh0cmFfaWRfXztcclxuZGVsZXRlIHJlcS5jLl9fZXh0cmFfaWRfXztcclxuY29uc3QgZmluZCA9IChmaWx0ZXIpID0+IHtcclxuICAgIGZvciAoY29uc3QgaSBpbiByZXEuYykge1xyXG4gICAgICAgIGlmIChyZXEuYy5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG4gICAgICAgICAgICBjb25zdCBtID0gcmVxLmNbaV0uZXhwb3J0cztcclxuICAgICAgICAgICAgaWYgKG0gJiYgbS5fX2VzTW9kdWxlICYmIG0uZGVmYXVsdCAmJiBmaWx0ZXIobS5kZWZhdWx0KSkgcmV0dXJuIG0uZGVmYXVsdDtcclxuICAgICAgICAgICAgaWYgKG0gJiYgZmlsdGVyKG0pKVx0cmV0dXJuIG07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gY29uc29sZS53YXJuKFwiQ2Fubm90IGZpbmQgbG9hZGVkIG1vZHVsZSBpbiBjYWNoZVwiKTtcclxuICAgIHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuY29uc3QgZmluZEFsbCA9IChmaWx0ZXIpID0+IHtcclxuICAgIGNvbnN0IG1vZHVsZXMgPSBbXTtcclxuICAgIGZvciAoY29uc3QgaSBpbiByZXEuYykge1xyXG4gICAgICAgIGlmIChyZXEuYy5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG4gICAgICAgICAgICBjb25zdCBtID0gcmVxLmNbaV0uZXhwb3J0cztcclxuICAgICAgICAgICAgaWYgKG0gJiYgbS5fX2VzTW9kdWxlICYmIG0uZGVmYXVsdCAmJiBmaWx0ZXIobS5kZWZhdWx0KSkgbW9kdWxlcy5wdXNoKG0uZGVmYXVsdCk7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG0gJiYgZmlsdGVyKG0pKSBtb2R1bGVzLnB1c2gobSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1vZHVsZXM7XHJcbn07XHJcblxyXG5jb25zdCBmaW5kQnlQcm9wcyA9ICguLi5wcm9wTmFtZXMpID0+IGZpbmQobW9kdWxlID0+IHByb3BOYW1lcy5ldmVyeShwcm9wID0+IG1vZHVsZVtwcm9wXSAhPT0gdW5kZWZpbmVkKSk7XHJcbmNvbnN0IGZpbmRCeVByb3RvdHlwZXMgPSAoLi4ucHJvdG9OYW1lcykgPT4gZmluZChtb2R1bGUgPT4gbW9kdWxlLnByb3RvdHlwZSAmJiBwcm90b05hbWVzLmV2ZXJ5KHByb3RvUHJvcCA9PiBtb2R1bGUucHJvdG90eXBlW3Byb3RvUHJvcF0gIT09IHVuZGVmaW5lZCkpO1xyXG5jb25zdCBmaW5kQnlEaXNwbGF5TmFtZSA9IChkaXNwbGF5TmFtZSkgPT4gZmluZChtb2R1bGUgPT4gbW9kdWxlLmRpc3BsYXlOYW1lID09PSBkaXNwbGF5TmFtZSk7XHJcblxyXG5sZXQgbW9kID0gIHtmaW5kLCBmaW5kQWxsLCBmaW5kQnlQcm9wcywgZmluZEJ5UHJvdG90eXBlcywgZmluZEJ5RGlzcGxheU5hbWV9O1xyXG5leHBvcnQgZGVmYXVsdCBtb2RcclxuXHJcbndpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5XZWJwYWNrTW9kdWxlcyA9IG1vZCIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCJcclxuXHJcbmxldCBwcm9maWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5vcGVuICYmIGUuZGVmYXVsdC5mZXRjaE11dHVhbEZyaWVuZHMpWzBdXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWdodGNvcmRVc2VyQmFkZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLnByb3BzXHJcblxyXG4gICAgICAgIGRlbGV0ZSBwcm9wcy5ocmVmLnRhcmdldFxyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhwcm9wcylcclxuXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPHByb3BzLkFuY2hvciBocmVmPXtcIi91c2Vycy9cIitwcm9wcy51c2VyLmlkfSB7Li4ucHJvcHMuaHJlZn0gb25DbGljaz17KGV2KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICAgICAgICBpZighcHJvZmlsTW9kdWxlKXByb2ZpbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0Lm9wZW4gJiYgZS5kZWZhdWx0LmZldGNoTXV0dWFsRnJpZW5kcylbMF1cclxuICAgICAgICAgICAgICAgIHByb2ZpbE1vZHVsZS5kZWZhdWx0Lm9wZW4ocHJvcHMudXNlci5pZClcclxuICAgICAgICAgICAgfX0+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMzEuMyAyOS41XCIgey4uLnByb3BzLnN2Z30gaGVpZ2h0PVwiMTAwJVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjIuOCAxczEyIDguMiA3LjQgMTkuN1MxNi42IDI5IDIwIDI1LjZzLTQtNS42LTguNy0xMEwyMi44IDFcIiBmaWxsPVwicmdiYSgyMjcsNiwxOSwuNilcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjIuMSAxMi4zYy0yLjUgMy4yLTYuMSA0LjgtOC45IDQuM0wzLjYgMjguOGMtLjcuOS0xLjkgMS0yLjguMy0uOS0uNy0xLTEuOS0uNC0yLjhMMTAgMTQuMWMtMS4zLTIuNS0uNi02LjQgMi05LjcgMy4yLTQgOC01LjUgMTAuOC0zLjRzMi40IDcuMi0uNyAxMS4zelwiIGZpbGw9XCIjZTMwNjEzXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L3Byb3BzLkFuY2hvcj5cclxuICAgICAgICApXHJcbiAgICB9IFxyXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnVnSHVudGVyQmFkZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLnByb3BzXHJcblxyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAzMS4zIDI5LjVcIiB7Li4ucHJvcHMuc3ZnfSBoZWlnaHQ9XCIxMDAlXCI+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIyLjggMXMxMiA4LjIgNy40IDE5LjdTMTYuNiAyOSAyMCAyNS42cy00LTUuNi04LjctMTBMMjIuOCAxXCIgZmlsbD1cInJnYmEoMjI3LDYsMTksLjYpXCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjIuMSAxMi4zYy0yLjUgMy4yLTYuMSA0LjgtOC45IDQuM0wzLjYgMjguOGMtLjcuOS0xLjkgMS0yLjguMy0uOS0uNy0xLTEuOS0uNC0yLjhMMTAgMTQuMWMtMS4zLTIuNS0uNi02LjQgMi05LjcgMy4yLTQgOC01LjUgMTAuOC0zLjRzMi40IDcuMi0uNyAxMS4zelwiIGZpbGw9XCIjZTMwNjEzXCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgKVxyXG4gICAgfSBcclxufSIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIENpcmN1cyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICByZXR1cm4gKDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMzYgMzZcIiAgey4uLnRoaXMucHJvcHMuc3ZnfSBoZWlnaHQ9XCIxMDAlXCI+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjREQyRTQ0XCJcclxuICAgICAgICAgICAgICAgICAgICBkPVwiTTMzIDMzYTIgMiAwIDAxLTIgMkg1YTIgMiAwIDAxLTItMmwxLTEyaDI4bDEgMTJ6XCJcclxuICAgICAgICAgICAgICAgID48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRUE1OTZFXCJcclxuICAgICAgICAgICAgICAgICAgICBkPVwiTTEzIDM1Yy0uNzkyLTEuODc1LTEuNzUtMy4yOTEtMy40MTctNC42NjYgMS43NS0xLjQ1OSA0LjU0Mi01LjUgNS4yNS04LjI5MnMyLjc1IDguMTI1IDIuMDQyIDEwLjYyNVMxMyAzNSAxMyAzNXptMTAuMzAzIDBjLjc5MS0xLjg3NSAxLjc1LTMuMjkxIDMuNDE2LTQuNjY2LTEuNzUtMS40NTktNC41NDEtNS41LTUuMjUtOC4yOTItLjcwNy0yLjc5Mi0yLjc1IDguMTI1LTIuMDQgMTAuNjI1LjcwOCAyLjUgMy44NzQgMi4zMzMgMy44NzQgMi4zMzN6XCJcclxuICAgICAgICAgICAgICAgID48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjQkUxOTMxXCJcclxuICAgICAgICAgICAgICAgICAgICBkPVwiTTMuNzI4IDI0LjI2M0EyLjUgMi41IDAgMDA4IDIyLjVjMC0uNTY1LS4xOTUtMS4wODEtLjUxMS0xLjVINGwtLjI3MiAzLjI2M3ptMjguNTQ0IDBMMzIgMjFoLTMuNDg5QTIuNDgyIDIuNDgyIDAgMDAyOCAyMi41YTIuNSAyLjUgMCAwMDQuMjcyIDEuNzYzelwiXHJcbiAgICAgICAgICAgICAgICA+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjE0XCIgY3k9XCIyM1wiIHI9XCIyXCIgZmlsbD1cIiNCRTE5MzFcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIyMlwiIGN5PVwiMjNcIiByPVwiMlwiIGZpbGw9XCIjQkUxOTMxXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTBcIiBjeT1cIjIzXCIgcj1cIjJcIiBmaWxsPVwiI0JFMTkzMVwiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjI2XCIgY3k9XCIyM1wiIHI9XCIyXCIgZmlsbD1cIiNCRTE5MzFcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjMgMzVIMTNzMi02IDItMTNoNmMwIDcgMiAxMyAyIDEzek0xNyAyaDJ2N2gtMnpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNTVBQ0VFXCJcclxuICAgICAgICAgICAgICAgICAgICBkPVwiTTE4LjgzOC4yMDZDMTcuNjY3LjA0MiAxNyAuMzE4IDE3IDEuNDE4djFjMCAxLjEuODY1IDEuNzUzIDEuOTIzIDEuNDUxbDUuMTU0LS45MDFjMS43MTUtLjM0MyAxLjU0OC0xLjU5My4wODUtMS44ODRMMTguODM4LjIwNnpcIlxyXG4gICAgICAgICAgICAgICAgPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNDQ0Q2RERcIlxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMTggNmwtLjA4MS4xMjNDMTAuOTM4IDE2Ljk4MSAzIDE1LjAxNSAzIDE5djIuNWEyLjUgMi41IDAgMDA0Ljk1LjVIMTJhMiAyIDAgMDA0IDBoNGEyIDIgMCAwMDQgMGg0LjA1YTIuNSAyLjUgMCAwMDQuOTUtLjVWMTljMC00LTgtMi0xNS0xM3pcIlxyXG4gICAgICAgICAgICAgICAgPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDxnIGZpbGw9XCIjRjVGOEZBXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNy45NDggNi4wNzhsLS4wMy4wNDVDMTcuMTMyIDExLjYxOSAxMC44MTEgMTYuMTI2IDggMTh2NGEyIDIgMCAwMDQgMHYtNGMuOTgyLS45ODIgNS44MTMtNi43ODcgNS45ODQtMTEuNzMyLS4wMS0uMDY0LS4wMjctLjEyNi0uMDM2LS4xOXptLjA4LjM5OEMxOC4zMjQgMTEuMzc0IDIzLjAzMSAxNy4wMzEgMjQgMTh2NGEyIDIgMCAwMDQgMHYtNGMtMi43NS0xLjgzMy04Ljk1My02LjE5LTkuOTcyLTExLjUyNHpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNy45ODQgNi4yN0MxNy45MjIgOC4zNDYgMTcuNjA2IDE2LjM5NCAxNiAxOHY0YTIgMiAwIDAwNCAwdi00Yy0xLjU2NC0xLjU2NC0xLjkwNS05LjI0MS0xLjk3OS0xMS41NTktLjAxMS0uMDU3LS4wMjctLjExMy0uMDM3LS4xNzF6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICApXHJcbiAgICB9IFxyXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlnaHRjb3JkTG9nbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMucHJvcHNcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTY4IDE2OC42OVwiIHsuLi5wcm9wc30gaGVpZ2h0PVwiMTAwJVwiIHdpZHRoPXtwcm9wcy5zaXplfT5cclxuICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaW5lYXJHcmFkaWVudCBpZD1cInByZWZpeF9fYVwiIHgxPXs2Ni43fSB5MT17LTQ4Ny43fSB4Mj17NjYuN30geTI9ey01MDguNzN9IGdyYWRpZW50VHJhbnNmb3JtPVwibWF0cml4KDEgMCAwIC0xIDAgLTQwOClcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PXswfSBzdG9wQ29sb3I9XCIjZTMwNjEzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PXsxfSBzdG9wQ29sb3I9XCIjNzMxYTE0XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpbmVhckdyYWRpZW50PlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaW5lYXJHcmFkaWVudCBpZD1cInByZWZpeF9fYlwiIHgxPXsxMDEuN30geTE9ey00ODcuN30geDI9ezEwMS43fSB5Mj17LTUwOC43M30gZ3JhZGllbnRUcmFuc2Zvcm09XCJtYXRyaXgoMSAwIDAgLTEgMCAtNDA4KVwiIGdyYWRpZW50VW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezB9IHN0b3BDb2xvcj1cIiNlMjA2MTNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezF9IHN0b3BDb2xvcj1cIiM3MzFhMTNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGluZWFyR3JhZGllbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPVwicHJlZml4X19jXCIgeDE9ezg0fSB5MT17LTQwOH0geDI9ezg0fSB5Mj17LTU3Ni42OX0gZ3JhZGllbnRUcmFuc2Zvcm09XCJtYXRyaXgoMSAwIDAgLTEgMCAtNDA4KVwiIGdyYWRpZW50VW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezB9IHN0b3BDb2xvcj1cIiNlMzA2MTNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezF9IHN0b3BDb2xvcj1cIiM3MzFhMTNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGluZWFyR3JhZGllbnQ+XHJcbiAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwiI2ZmZlwiIGQ9XCJNMTQuOSAzNS4zaDEzOS4yVjEzM0gxNC45elwiIC8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTY2LjcgNzkuN2MtNS40IDAtOS44IDQuNy05LjggMTAuNXM0LjQgMTAuNSA5LjggMTAuNSA5LjgtNC43IDkuOC0xMC41LTQuNC0xMC41LTkuOC0xMC41elwiIGZpbGw9XCJ1cmwoI3ByZWZpeF9fYSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMDEuNyA3OS43Yy01LjQgMC05LjggNC43LTkuOCAxMC41czQuNCAxMC41IDkuOCAxMC41IDkuOC00LjcgOS44LTEwLjUtNC40LTEwLjUtOS44LTEwLjV6XCIgZmlsbD1cInVybCgjcHJlZml4X19iKVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAgMHYxNjhsMTY4IC42OVYwem0xMTEuMyAxMjQuMXMtMy40LTQuMS02LjMtNy43YzEyLjYtMy41IDE3LjQtMTEuMyAxNy40LTExLjNhNTIuNTIgNTIuNTIgMCAwMS0xMS4xIDUuNiA2OC42MyA2OC42MyAwIDAxLTM4LjkgNCA3MC4xMiA3MC4xMiAwIDAxLTE0LjEtNC4xIDQ4Ljg4IDQ4Ljg4IDAgMDEtNy4xLTMuM2MtLjMtLjItLjYtLjMtLjktLjVhLjc2Ljc2IDAgMDAtLjQtLjJjLTEuNy0xLTIuNi0xLjYtMi42LTEuNnM0LjYgNy42IDE2LjggMTEuMmMtMi45IDMuNi02LjQgNy45LTYuNCA3LjktMjEuMi0uNi0yOS4zLTE0LjUtMjkuMy0xNC41IDAtMzAuNiAxMy44LTU1LjQgMTMuOC01NS40IDEzLjgtMTAuMyAyNi45LTEwIDI2LjktMTBsMSAxLjFDNTIuOCA1MC4zIDQ1IDU3LjkgNDUgNTcuOWE1Ni4yIDU2LjIgMCAwMTUuNy0yLjcgNzIuMTkgNzIuMTkgMCAwMTIxLjgtNiA4Ljc1IDguNzUgMCAwMTEuNi0uMiA4OS4xIDg5LjEgMCAwMTE5LjQtLjIgNzguNDUgNzguNDUgMCAwMTI4LjkgOS4xcy03LjUtNy4yLTIzLjktMTIuMWwxLjMtMS41czEzLjEtLjMgMjYuOSAxMGMwIDAgMTMuOCAyNC44IDEzLjggNTUuNC4xLS4xLTggMTMuOC0yOS4yIDE0LjR6XCIgZmlsbD1cInVybCgjcHJlZml4X19jKVwiIC8+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIClcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBWMkNfU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi9zZXR0aW5nc1RpdGxlXCI7XHJcblxyXG4vKipcclxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCJyZWFjdFwiKX1cclxuICovXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmxldCBtYXJnaW5Nb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXVxyXG5sZXQgY29sb3JNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXVxyXG5sZXQgc2l6ZU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF1cclxubGV0IHNjcm9sbGJhck1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lKVswXVxyXG5jb25zdCBHdWlsZE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEd1aWxkcylbMF0uZGVmYXVsdFxyXG5jb25zdCByZWxhdGlvblNoaXBNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRSZWxhdGlvbnNoaXBzKVswXS5kZWZhdWx0XHJcbmNvbnN0IHNlc3Npb25Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRTZXNzaW9ucylbMF0uZGVmYXVsdFxyXG5jb25zdCB1c2VyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdLmRlZmF1bHRcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19BY2NvdW50SW5mb3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGlmKCFtYXJnaW5Nb2R1bGUyKW1hcmdpbk1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdXHJcbiAgICAgICAgaWYoIWNvbG9yTW9kdWxlKWNvbG9yTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF1cclxuICAgICAgICBpZighc2l6ZU1vZHVsZSlzaXplTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXVxyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIDxWMkNfU2V0dGluZ3NUaXRsZSB0ZXh0PVwiQWNjb3VudCBJbmZvc1wiLz4sXHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgIFByb2ZpbGVcclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICA8Q29kZUNvbnRlbnQgY29udGVudD17dGhpcy5nZXRQcm9maWxlVmFsdWUoKX0gbGFuZ3VhZ2U9XCJkaWZmXCIgLz5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XHJcbiAgICAgICAgICAgICAgICAgICAgU3RhdGlzdGljc1xyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIDxDb2RlQ29udGVudCBjb250ZW50PXt0aGlzLmdldFN0YXRpc3RpY3MoKX0gbGFuZ3VhZ2U9XCJkaWZmXCIgLz5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XHJcbiAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGVkIFNlc3Npb25zXHJcbiAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgPENvZGVDb250ZW50IGNvbnRlbnQ9e3RoaXMuZ2V0U2Vzc2lvblZhbHVlKCl9IGxhbmd1YWdlPVwiZGlmZlwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PixcclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e0JETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXS5tYXJnaW5Cb3R0b20yMH0+PC9kaXY+XHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIGdldFNlc3Npb25WYWx1ZSgpe1xyXG4gICAgICAgIGNvbnN0IHNlc3Npb25zUmF3ID0gc2Vzc2lvbk1vZHVsZS5nZXRTZXNzaW9ucygpXHJcbiAgICAgICAgY29uc3Qgc2Vzc2lvbnMgPSBPYmplY3Qua2V5cyhzZXNzaW9uc1JhdykuZmlsdGVyKGUgPT4gZSAhPT0gXCJhbGxcIikubWFwKGUgPT4gc2Vzc2lvbnNSYXdbZV0pXHJcblxyXG4gICAgICAgIGlmKHNlc3Npb25zLmxlbmd0aCA9PT0gMClyZXR1cm4gXCItIE5vIHNlc3Npb24gZGV0ZWN0ZWQuIFBsZWFzZSB0cnkgaW4gYSBmZXcgc2Vjb25kc1wiXHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHNlc3Npb25zLm1hcChlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGArIGlkOiAke2Uuc2Vzc2lvbklkfVxyXG4rIG9zOiAke2UuY2xpZW50SW5mby5vc1swXS50b1VwcGVyQ2FzZSgpK2UuY2xpZW50SW5mby5vcy5zbGljZSgxKX1cclxuKyBjbGllbnQ6ICR7ZS5jbGllbnRJbmZvLmNsaWVudH1cclxuKyBzdGF0dXM6ICR7ZS5zdGF0dXN9XHJcbisgQWN0aXZpdGllczogJHtlLmFjdGl2aXRpZXMubGVuZ3RofWBcclxuICAgICAgICB9KS5qb2luKFwiXFxuXCIrXCItXCIucmVwZWF0KDM4KStcIlxcblwiKVxyXG4gICAgfVxyXG5cclxuICAgIGdldFByb2ZpbGVWYWx1ZSgpe1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSB1c2VyTW9kdWxlLmdldEN1cnJlbnRVc2VyKClcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAdHlwZSB7RGF0ZX1cclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBjcmVhdGVkQXQgPSB1c2VyLmNyZWF0ZWRBdFxyXG5cclxuICAgICAgICBsZXQgYXZhdGFyVVJMID0gdXNlci5hdmF0YXJVUkxcclxuICAgICAgICBpZih1c2VyLmF2YXRhciAmJiB1c2VyLmF2YXRhci5zdGFydHNXaXRoKFwiYV9cIikpe1xyXG4gICAgICAgICAgICBhdmF0YXJVUkwgPSB1c2VyLmdldEF2YXRhclVSTChcImdpZlwiKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoYXZhdGFyVVJMLnN0YXJ0c1dpdGgoXCIvXCIpKXtcclxuICAgICAgICAgICAgYXZhdGFyVVJMID0gXCJodHRwczovL2Rpc2NvcmQuY29tXCIrYXZhdGFyVVJMXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGF2YXRhclVSTC5lbmRzV2l0aChcIj9zaXplPTEyOFwiKSl7XHJcbiAgICAgICAgICAgIGF2YXRhclVSTCA9IGF2YXRhclVSTC5yZXBsYWNlKFwiP3NpemU9MTI4XCIsIFwiP3NpemU9NDA5NlwiKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGArIFVzZXJuYW1lOiAke3VzZXIudXNlcm5hbWV9XHJcbisgRGlzY3JpbWluYXRvcjogJHt1c2VyLmRpc2NyaW1pbmF0b3J9XHJcbisgVGFnOiAke3VzZXIudGFnfVxyXG4rIElEOiAke3VzZXIuaWR9XHJcbisgQXZhdGFyOiAke3VzZXIuYXZhdGFyfVxyXG4rIEF2YXRhciBVUkw6ICR7YXZhdGFyVVJMfVxyXG4rIENyZWF0aW9uIERhdGU6ICR7KGNyZWF0ZWRBdC5nZXREYXRlKCkpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfS8keyhjcmVhdGVkQXQuZ2V0TW9udGgoKSsxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKX0vJHsoY3JlYXRlZEF0LmdldEZ1bGxZZWFyKCkpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfSAke2NyZWF0ZWRBdC5nZXRIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfWggJHtjcmVhdGVkQXQuZ2V0TWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfW1pbiAke2NyZWF0ZWRBdC5nZXRTZWNvbmRzKCl9c1xyXG4rIEZsYWdzOiAke3VzZXIuZmxhZ3N9XHJcbisgSGFzIE5pdHJvOiAke3VzZXIuaGFzUHJlbWl1bVN1YnNjcmlwdGlvbiA/IFwiWWVzXCIgOiBcIk5vXCJ9XHJcbi0gRW1haWw6ICR7dXNlci5lbWFpbH1cclxuLSAyRkE6ICR7dXNlci5tZmFFbmFibGVkID8gXCJZZXNcIiA6IFwiTm9cIn1cclxuLSBIYXMgQmVlbiBPbiBNb2JpbGU6ICR7dXNlci5tb2JpbGUgPyBcIlllc1wiIDogXCJOb1wifVxyXG4tIFBob25lOiAke3VzZXIucGhvbmUgfHwgXCJOb25lXCJ9XHJcbi0gVmVyaWZpZWQ6ICR7dXNlci52ZXJpZmllZH1gXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3RhdGlzdGljcygpe1xyXG5cclxuICAgICAgICBjb25zdCBndWlsZHMgPSBPYmplY3QudmFsdWVzKEd1aWxkTW9kdWxlLmdldEd1aWxkcygpKVxyXG4gICAgICAgIGNvbnN0IHJlbGF0aW9ucyA9IE9iamVjdC5rZXlzKHJlbGF0aW9uU2hpcE1vZHVsZS5nZXRSZWxhdGlvbnNoaXBzKCkpXHJcbiAgICAgICAgY29uc3QgZnJpZW5kcyA9IHJlbGF0aW9ucy5maWx0ZXIoZSA9PiByZWxhdGlvblNoaXBNb2R1bGUuaXNGcmllbmQoZSkpXHJcbiAgICAgICAgY29uc3QgYmxvY2tlZCA9IHJlbGF0aW9ucy5maWx0ZXIoZSA9PiByZWxhdGlvblNoaXBNb2R1bGUuaXNCbG9ja2VkKGUpKVxyXG5cclxuICAgICAgICByZXR1cm4gYCsgU2VydmVyIENvdW50OiAke2d1aWxkcy5sZW5ndGh9IHNlcnZlcnNcclxuKyBSZWxhdGlvbnM6ICR7cmVsYXRpb25zLmxlbmd0aH0gcmVsYXRpb25zXHJcbisgRnJpZW5kcyBDb3VudDogJHtmcmllbmRzLmxlbmd0aH0gZnJpZW5kc1xyXG4tIEJsb2NrZWQgVXNlcnMgQ291bnQ6ICR7YmxvY2tlZC5sZW5ndGh9IGJsb2NrZWQgdXNlcnNgXHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5sZXQgaGlnaHRsaWdodEpTID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGlnaGxpZ2h0KVswXVxyXG5sZXQgbWVzc2FnZU1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJrdXApWzBdXHJcbmxldCBtZXNzYWdlTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1lc3NhZ2VDb250ZW50KVswXVxyXG5cclxuY2xhc3MgQ29kZUNvbnRlbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgaWYoIW1lc3NhZ2VNb2R1bGUxKW1lc3NhZ2VNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFya3VwKVswXVxyXG4gICAgICAgIGlmKCFtZXNzYWdlTW9kdWxlMiltZXNzYWdlTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1lc3NhZ2VDb250ZW50KVswXVxyXG4gICAgICAgIGlmKCFzY3JvbGxiYXJNb2R1bGUxKXNjcm9sbGJhck1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lKVswXVxyXG4gICAgICAgIGlmKCFoaWdodGxpZ2h0SlMpaGlnaHRsaWdodEpTID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGlnaGxpZ2h0KVswXVxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzcz17YCR7bWVzc2FnZU1vZHVsZTEubWFya3VwfSAke21lc3NhZ2VNb2R1bGUyLm1lc3NhZ2VDb250ZW50fWB9PlxyXG4gICAgICAgICAgICA8cHJlPlxyXG4gICAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9e2Ake3Njcm9sbGJhck1vZHVsZTEuc2Nyb2xsYmFyR2hvc3RIYWlybGluZX0gaGxqc2B9IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiBoaWdodGxpZ2h0SlMuaGlnaGxpZ2h0KHRoaXMucHJvcHMubGFuZ3VhZ2UsIHRoaXMucHJvcHMuY29udGVudCkudmFsdWV9fT5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2NvZGU+XHJcbiAgICAgICAgICAgIDwvcHJlPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17QkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tOClbMF0ubWFyZ2luQm90dG9tOH0+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59IiwiLy8gR29vZCBsdWNrIHRvIHJlYWQgbXkgY29kZSwgRXZlbiBtZSBjYW4ndCByZWFkIGl0IHByb3Blcmx5LlxyXG5cclxuaW1wb3J0IHsgc3RhdCB9IGZyb20gXCJmc1wiXHJcbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gXCIuLi9tb2R1bGVzL2Rpc3RhbnRcIlxyXG5pbXBvcnQgd2VicGFja01vZHVsZXMgZnJvbSBcIi4uL21vZHVsZXMvd2VicGFja01vZHVsZXNcIlxyXG5pbXBvcnQgeyByZW1vdGUgfSBmcm9tIFwiZWxlY3Ryb25cIlxyXG5pbXBvcnQgTWFyZ2luVG9wIGZyb20gXCIuL21hcmdpbnRvcFwiXHJcblxyXG5jb25zdCBrZXlzID0ge1xyXG4gICAgc2V0dGluZ1RpdGxlOiB1dWlkdjQoKVxyXG59XHJcbmxldCBmb3JtTW9kdWxlXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFwaVByZXZpZXcgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIHN0YXRlczogW11cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgaWYoIWZvcm1Nb2R1bGUpZm9ybU1vZHVsZSA9IHdlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLkZvcm1TZWN0aW9uKVxyXG4gICAgICAgIC8qKiBcclxuICAgICAgICAgKiBAdHlwZSB7RnVuY3Rpb25bXX1cclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBhbGxDb21wb25lbnRzID0gWy4uLm5ldyBTZXQoT2JqZWN0LmtleXMod2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cykubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMod2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50c1tlXSkubWFwKGsgPT4gd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50c1tlXVtrXSlcclxuICAgICAgICB9KS5mbGF0KCkpXVxyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIDxmb3JtTW9kdWxlLkZvcm1TZWN0aW9uIHRhZz1cImgyXCIgdGl0bGU9XCJMaWdodGNvcmQncyBBcGkgQXZhaWxsYWJsZSBjb21wb25lbnRzXCI+XHJcbiAgICAgICAgICAgICAgICA8Zm9ybU1vZHVsZS5Gb3JtVGV4dCB0eXBlPVwiZGVzY3JpcHRpb25cIiBjbGFzc05hbWU9XCJcIiBzZWxlY3RhYmxlPXtmYWxzZX0+XHJcbiAgICAgICAgICAgICAgICAgICAgVGhlc2UgY29tcG9uZW50cyBhcmUgaGVyZSBmb3IgdGhlIHBsdWdpbiBkZXZzLiBUaGV5IGNhbiBxdWlja2x5IGVtYmVkIGFueSBjb21wb25lbnQgYmVsb3cgd2l0aCB0aGlzIHBhbmVsLlxyXG4gICAgICAgICAgICAgICAgPC9mb3JtTW9kdWxlLkZvcm1UZXh0PlxyXG4gICAgICAgICAgICAgICAgPE1hcmdpblRvcD48L01hcmdpblRvcD5cclxuICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiBjb2xvcj1cImJyYW5kXCIgbG9vaz1cIm91dGxpbmVkXCIgc2l6ZT1cIm1lZGl1bVwiIGhvdmVyQ29sb3I9XCJncmVlblwiIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZW1vdGUuc2hlbGwub3BlbkV4dGVybmFsKFwiaHR0cHM6Ly9naXRodWIuY29tL2xpZ2h0Y29yZC9saWdodGNvcmQvd2lraS9BcGlzXCIpXHJcbiAgICAgICAgICAgICAgICB9fSB3cmFwcGVyPXtmYWxzZX0+XHJcbiAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRhdGlvblxyXG4gICAgICAgICAgICAgICAgPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbj5cclxuICAgICAgICAgICAgPC9mb3JtTW9kdWxlLkZvcm1TZWN0aW9uPixcclxuICAgICAgICAgICAgYWxsQ29tcG9uZW50cy5tYXAoY29tcCA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgQWxsUHJldmlld3MgPSBbXVxyXG4gICAgICAgICAgICAgICAgaWYoY29tcC5BbGxQcmV2aWV3cylBbGxQcmV2aWV3cyA9IGNvbXAuQWxsUHJldmlld3NcclxuICAgICAgICAgICAgICAgIGxldCBvbkNoYW5nZSA9ICh0YWIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYlxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgc2V0U3RhdGUgPSAobmV3U3RhdGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzOiBbT2JqZWN0LmFzc2lnbihzdGF0ZSwgbmV3U3RhdGUpXS5jb25jYXQodGhpcy5zdGF0ZS5zdGF0ZXMuZmlsdGVyKGUgPT4gZS5lbGVtICE9PSBjb21wKSlcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZS5zdGF0ZXMuZmluZChlID0+IGUuZWxlbSA9PT0gY29tcClcclxuICAgICAgICAgICAgICAgIGlmKCFzdGF0ZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYjogXCJwcmV2aWV3XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW06IGNvbXAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHt9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUuc3RhdGVzLnB1c2goc3RhdGUpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgZ2V0UHJvcHMgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbmFsID0ge31cclxuICAgICAgICAgICAgICAgICAgICBBbGxQcmV2aWV3cy5mb3JFYWNoKGNhdGVnb3J5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxbT2JqZWN0LmtleXMoY2F0ZWdvcnlbMF0pWzBdXSA9IGNhdGVnb3J5WzBdW09iamVjdC5rZXlzKGNhdGVnb3J5WzBdKVswXV1cclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHN0YXRlLm9wdGlvbnMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxba2V5XSA9IEFsbFByZXZpZXdzLmZpbmQoZSA9PiBlLmZpbmQoZSA9PiBlW2tleV0pKVtzdGF0ZS5vcHRpb25zW2tleV1dW2tleV1cclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaW5hbFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHJlbmRlclByZXZpZXcgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxkaXYgc3R5bGU9e3ttYXJnaW46IFwiMjBweFwifX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXByaW1hcnkpXCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogXCIzMHB4IDMwcHhcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiOHB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfX0gY2xhc3NOYW1lPVwibGMtdGFiLWJveC1zaGFkb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtSZWFjdC5jcmVhdGVFbGVtZW50KGNvbXAsIGdldFByb3BzKCkpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCByZW5kZXJDb2RlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8ZGl2IHN0eWxlPXt7bWFyZ2luOiBcIjIwcHhcIn19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tYmFja2dyb3VuZC1wcmltYXJ5KVwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMzBweCAzMHB4XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjhweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH19IGNsYXNzTmFtZT1cImxjLXRhYi1ib3gtc2hhZG93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdTdWJUaXRsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU1hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdTdWJUaXRsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQ29kZUJsb2NrIGxhbmd1YWdlPVwianN4XCIgY29udGVudD17Z2VuZXJhdGVDb2RlKFwianN4XCIpfS8+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdTdWJUaXRsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQ29kZUJsb2NrIGxhbmd1YWdlPVwianNcIiBjb250ZW50PXtnZW5lcmF0ZUNvZGUoXCJyZWFjdFwiKX0vPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCBnZXRTdHJGb3JQcm9wID0gKHZhbHVlLCBjb21wUGF0aCwgbGFuZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih2YWx1ZSAmJiB2YWx1ZS4kJHR5cGVvZiAmJiAodmFsdWUuJCR0eXBlb2YgPT09IFN5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpIHx8IHZhbHVlLiQkdHlwZW9mID09PSAweGVhYzcpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvbXBQYXRoID09PSBcIkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlRhYnNcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGFuZyA9PT0gXCJyZWFjdFwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtzdHlsZToge1xyXG4gICAgbWFyZ2luVG9wOiBcIjIwcHhcIiwgbWFyZ2luQm90dG9tOiBcIjIwcHhcIlxyXG59fSxcclxuICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge3N0eWxlOiB7XHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcInZhcigtLWJhY2tncm91bmQtcHJpbWFyeSlcIixcclxuICAgICAgICBwYWRkaW5nOiBcIjMwcHggMzBweFwiLFxyXG4gICAgICAgIGJvcmRlclJhZGl1czogXCI4cHhcIlxyXG4gICAgfSwgY2xhc3NOYW1lOiBcImxjLXRhYi1ib3gtc2hhZG93XCIgfSxcclxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlRpdGxlLCBudWxsLCBcIlByZXZpZXcgdGFic1wiKVxyXG4gICAgKVxyXG4pYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGxhbmcgPT09IFwianN4XCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDxkaXYgc3R5bGU9e3tcclxuICAgICAgICBtYXJnaW5Ub3A6IFwiMjBweFwiLCBtYXJnaW5Cb3R0b206IFwiMjBweFwiXHJcbiAgICB9fT5cclxuICAgICAgICA8ZGl2IHN0eWxlPXt7XHJcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXByaW1hcnkpXCIsIFxyXG4gICAgICAgICAgICBwYWRkaW5nOiBcIjMwcHggMzBweFwiLCBcclxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjhweFwiXHJcbiAgICAgICAgfX0gY2xhc3NOYW1lPVwibGMtdGFiLWJveC1zaGFkb3dcIj5cclxuICAgICAgICAgICAgPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlRpdGxlPlByZXZpZXcgdGFiczwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuVGl0bGU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiWW91ciBjb21wb25lbnRzIGhlcmUuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIFwiICAgIFwiKVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgZ2VuZXJhdGVDb2RlID0gZnVuY3Rpb24obGFuZyl7IC8vIGNvZGUgZm9ybWF0dGluZyBpcyBoYXJkXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcE5hbWUgPSBjb21wLmRpc3BsYXlOYW1lIHx8IGNvbXAubmFtZVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjYXRlZ29yaWVzID0gT2JqZWN0LmtleXMod2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cylcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wQ2F0ZWdvcnkgPSBjYXRlZ29yaWVzLmZpbmQoZSA9PiB3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzW2VdW2NvbXBOYW1lXSlcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wUGF0aCA9IGBMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuJHtjb21wQ2F0ZWdvcnl9LiR7Y29tcE5hbWV9YFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gZ2V0UHJvcHMoKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZihsYW5nID09PSBcImpzeFwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BTdHJpbmdzID0gW11cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuUHJvcCA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocHJvcHMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGtleSA9PSBcImNoaWxkcmVuXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuUHJvcCA9IGdldFN0ckZvclByb3AocHJvcHNba2V5XSwgY29tcFBhdGgsIGxhbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyID0ga2V5K1wiPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIHByb3BzW2tleV0gPT09IFwic3RyaW5nXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gSlNPTi5zdHJpbmdpZnkocHJvcHNba2V5XSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGB7JHtnZXRTdHJGb3JQcm9wKHByb3BzW2tleV0sIGNvbXBQYXRoLCBsYW5nKX19YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wU3RyaW5ncy5wdXNoKHN0cilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9wZW5UYWdcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2hpbGRyZW5Qcm9wKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5UYWcgPSBgPCR7Y29tcFBhdGh9ICR7cHJvcFN0cmluZ3Muam9pbihcIiBcIil9PmBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbG9zZVRhZyA9IGA8LyR7Y29tcFBhdGh9PmBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtvcGVuVGFnfVxcbiAgICAke2NoaWxkcmVuUHJvcH1cXG4ke2Nsb3NlVGFnfWBcclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuVGFnID0gYDwke2NvbXBQYXRofSAke3Byb3BTdHJpbmdzLmpvaW4oXCIgXCIpfS8+YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZW5UYWdcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGxhbmcgPT09IFwicmVhY3RcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuIHx8IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHByb3BzLmNoaWxkcmVuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNoaWxkcmVuICYmIGNoaWxkcmVuLiQkdHlwZW9mICYmIChjaGlsZHJlbi4kJHR5cGVvZiA9PT0gU3ltYm9sLmZvcihcInJlYWN0LmVsZW1lbnRcIikgfHwgY2hpbGRyZW4uJCR0eXBlb2YgPT09IDB4ZWFjNykpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBnZXRTdHJGb3JQcm9wKGNoaWxkcmVuLCBjb21wUGF0aCwgbGFuZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcFN0cmluZ3MgPSBbXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpc2libGVLZXkgPSAvW15cXHdcXGRfXS9nLnRlc3Qoa2V5KSA/IEpTT04uc3RyaW5naWZ5KGtleSkgOiBrZXlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHIgPSB2aXNpYmxlS2V5K1wiOiBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIHByb3BzW2tleV0gPT09IFwic3RyaW5nXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBKU09OLnN0cmluZ2lmeShwcm9wc1trZXldKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGdldFN0ckZvclByb3AocHJvcHNba2V5XSwgY29tcFBhdGgsIGxhbmcpLnNwbGl0KFwiXFxuXCIpLm1hcCgoc3RyLCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGkgPT09IDApcmV0dXJuIHN0clxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgICAgXCIgKyBzdHJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiXFxuXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wU3RyaW5ncy5wdXNoKHN0cilcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BPYmplY3QgPSBcIntcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihwcm9wU3RyaW5ncy5sZW5ndGgpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcFN0cmluZ3MuZm9yRWFjaCgoc3RyLCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlzTGFzdCA9IGkgPT09IHByb3BTdHJpbmdzLmxlbmd0aCAtIDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNGaXJzdCA9IGkgPT09IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighaXNGaXJzdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BPYmplY3QgKz0gXCIsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPSBcIlxcbiAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BPYmplY3QgKz0gc3RyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNMYXN0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPVwiXFxufVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wT2JqZWN0ICs9IFwifVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuRGF0YSA9IHR5cGVvZiBjaGlsZHJlbiA9PT0gXCJzdHJpbmdcIiAmJiBjaGlsZHJlbi5zdGFydHNXaXRoKFwiUmVhY3QuY3JlYXRlRWxlbWVudFwiKSA/IGNoaWxkcmVuIDogSlNPTi5zdHJpbmdpZnkoY2hpbGRyZW4pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgUmVhY3QuY3JlYXRlRWxlbWVudCgke2NvbXBQYXRofSwgJHtwcm9wT2JqZWN0fSwgJHtjaGlsZHJlbkRhdGF9KWBcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgaGVscCA9IGNvbXAuaGVscCB8fCB7fVxyXG4gICAgICAgICAgICAgICAgbGV0IGluZm8gPSBoZWxwLmluZm8gPyA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94IHR5cGU9XCJpbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge2hlbHAuaW5mb31cclxuICAgICAgICAgICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcclxuICAgICAgICAgICAgICAgIGxldCB3YXJuID0gaGVscC53YXJuID8gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwid2FyblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHtoZWxwLndhcm59XHJcbiAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveD4gOiBudWxsXHJcbiAgICAgICAgICAgICAgICBsZXQgZGFuZ2VyID0gaGVscC5kYW5nZXIgPyA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94IHR5cGU9XCJkYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICB7aGVscC5kYW5nZXJ9XHJcbiAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveD4gOiBudWxsXHJcbiAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBoZWxwLmVycm9yID8gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwiZXJyb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICB7aGVscC5lcnJvcn1cclxuICAgICAgICAgICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcclxuICAgICAgICAgICAgICAgIGxldCBzdWNjZXNzID0gaGVscC5zdWNjZXNzID8gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwic3VjY2Vzc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIHtoZWxwLnN1Y2Nlc3N9XHJcbiAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveD4gOiBudWxsXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nc1RpdGxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y29tcC5kaXNwbGF5TmFtZSB8fCBjb21wLm5hbWV9XHJcbiAgICAgICAgICAgICAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ3NUaXRsZT5cclxuICAgICAgICAgICAgICAgICAgICB7aW5mb31cclxuICAgICAgICAgICAgICAgICAgICB7c3VjY2Vzc31cclxuICAgICAgICAgICAgICAgICAgICB7d2Fybn1cclxuICAgICAgICAgICAgICAgICAgICB7ZXJyb3J9XHJcbiAgICAgICAgICAgICAgICAgICAge2Rhbmdlcn1cclxuICAgICAgICAgICAgICAgICAgICB7QWxsUHJldmlld3MubWFwKGNhdGVnb3J5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2F0ZWdvcnlbMF0ub25DbGljaylyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihjYXRlZ29yeVswXS50ZXh0KXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNhdGVnb3J5WzBdLmNoaWxkcmVuKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNhdGVnb3J5Lmxlbmd0aCA9PT0gMSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IE9iamVjdC5rZXlzKGNhdGVnb3J5WzBdKVswXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2tleX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdTdWJUaXRsZT4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuRHJvcGRvd24gb3B0aW9ucz17Y2F0ZWdvcnkubWFwKChlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBcIm9wdC1cIitpbmRleCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IEpTT04uc3RyaW5naWZ5KGVbT2JqZWN0LmtleXMoZSlbMF1dKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfSB2YWx1ZT17XCJvcHQtXCIrKHN0YXRlLm9wdGlvbnNba2V5XSB8fCBcIjBcIil9IG9uQ2hhbmdlPXsodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLm9wdGlvbnMsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtrZXldOiAodmFsdWUudmFsdWUgfHwgXCIwXCIpLnJlcGxhY2UoXCJvcHQtXCIsIFwiXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19IHNlYXJjaGFibGU9e3RydWV9Lz4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7bWFyZ2luQm90dG9tOiBcIjhweFwifX0+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlRhYnMgdGFicz17W3tsYWJlbDogXCJQcmV2aWV3XCIsIGlkOiBcInByZXZpZXdcIn0sIHtsYWJlbDogXCJDb2RlXCIsIGlkOiBcImNvZGVcIn1dfSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlPXtzdGF0ZS50YWJ9IGNoaWxkcmVuPXtzdGF0ZS50YWIgPT09IFwicHJldmlld1wiID8gcmVuZGVyUHJldmlldygpIDogcmVuZGVyQ29kZSgpfSBvbkNoYW5nZT17b25DaGFuZ2V9Lz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PilcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICBdXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJlbmRlcnMoKXtcclxuXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi9tb2R1bGVzL3V0aWxzXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4uL21vZHVsZXMvZG9tdG9vbHNcIjtcclxuXHJcbmltcG9ydCBYU3ZnIGZyb20gXCIuL3hTdmdcIjtcclxuaW1wb3J0IFJlbG9hZEljb24gZnJvbSBcIi4vcmVsb2FkSWNvblwiO1xyXG5pbXBvcnQgRWRpdEljb24gZnJvbSBcIi4vaWNvbnMvZWRpdFwiO1xyXG5pbXBvcnQgRGVsZXRlSWNvbiBmcm9tIFwiLi9pY29ucy9kZWxldGVcIjtcclxuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi9jb21wb25lbnRzL3N3aXRjaFwiO1xyXG5pbXBvcnQgVG9vbHRpcFdyYXAgZnJvbSBcIi4vdG9vbHRpcFdyYXBcIjtcclxuaW1wb3J0IHsgcHJvY2Vzc0ZpbGUgfSBmcm9tIFwiLi4vbW9kdWxlcy9wbHVnaW5DZXJ0aWZpZXJcIjtcclxuaW1wb3J0IGNvbnRlbnRNYW5hZ2VyIGZyb20gXCIuLi9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tIFwicGF0aFwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5jb25zdCBhbmNob3JDbGFzc2VzID0gQkRWMi5hbmNob3JDbGFzc2VzO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1BsdWdpbkNhcmQgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2hvd1NldHRpbmdzID0gdGhpcy5zaG93U2V0dGluZ3MuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuaGFzU2V0dGluZ3MgPSB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiAmJiB0eXBlb2YodGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0U2V0dGluZ3NQYW5lbCkgPT09IFwiZnVuY3Rpb25cIjtcclxuICAgICAgICB0aGlzLnNldHRpbmdzUGFuZWwgPSBcIlwiO1xyXG5cclxuICAgICAgICB0aGlzLmVkaXQgPSB0aGlzLmVkaXQuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmRlbGV0ZSA9IHRoaXMuZGVsZXRlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5yZWxvYWQgPSB0aGlzLnJlbG9hZC5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBjaGVja2VkOiB0aGlzLnByb3BzLmVuYWJsZWQsXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVsb2FkczogMCxcclxuICAgICAgICAgICAgdHJ1c3RlZDogZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dTZXR0aW5ncygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGFzU2V0dGluZ3MpIHJldHVybjtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtzZXR0aW5nczogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgdGhpcy5wYW5lbFJlZi5jdXJyZW50LmlubmVySFRNTCA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c2V0dGluZ3NPcGVuOiBmYWxzZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc3RhdGUuc2V0dGluZ3MpIHJldHVybjtcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2V0dGluZ3NQYW5lbCA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICB0aGlzLnJlZnMuc2V0dGluZ3NwYW5lbC5hcHBlbmRDaGlsZCh0aGlzLnNldHRpbmdzUGFuZWwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtM1wiXSkgcmV0dXJuO1xyXG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzSGlkZGVuID0gKGNvbnRhaW5lciwgZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY1RvcCA9IGNvbnRhaW5lci5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjQm90dG9tID0gY1RvcCArIGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlVG9wID0gZWxlbWVudC5vZmZzZXRUb3A7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlQm90dG9tID0gZVRvcCArIGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICAoZVRvcCA8IGNUb3AgfHwgZUJvdHRvbSA+IGNCb3R0b20pO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgdGhpc05vZGUgPSB0aGlzLnJlZnMuY2FyZE5vZGU7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXNOb2RlLmNsb3Nlc3QoXCJkaXZbY2xhc3MqPVxcXCJzY3JvbGxlci1cXFwiXVwiKVxyXG4gICAgICAgICAgICBpZiAoIWlzSGlkZGVuKGNvbnRhaW5lciwgdGhpc05vZGUpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IHRoaXNOb2RlT2Zmc2V0ID0gRE9NLm9mZnNldCh0aGlzTm9kZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lck9mZnNldCA9IERPTS5vZmZzZXQoY29udGFpbmVyKTtcclxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWwgPSBjb250YWluZXIuc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXNOb2RlT2Zmc2V0LnRvcCAtIGNvbnRhaW5lck9mZnNldC50b3AgKyBjb250YWluZXIuc2Nyb2xsVG9wIC0gMzA7XHJcbiAgICAgICAgICAgIERPTS5hbmltYXRlKHtcclxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAsXHJcbiAgICAgICAgICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKHByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZFBvaW50ID4gb3JpZ2luYWwpIGNvbnRhaW5lci5zY3JvbGxUb3AgPSBvcmlnaW5hbCArIChwcm9ncmVzcyAqIChlbmRQb2ludCAtIG9yaWdpbmFsKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBjb250YWluZXIuc2Nyb2xsVG9wID0gb3JpZ2luYWwgLSAocHJvZ3Jlc3MgKiAob3JpZ2luYWwgLSBlbmRQb2ludCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgZ2V0U3RyaW5nKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiPz8/XCI7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZXR0aW5nc0NvbXBvbmVudCgpIHtcclxuICAgICAgICB0cnkgeyB0aGlzLnNldHRpbmdzUGFuZWwgPSB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXRTZXR0aW5nc1BhbmVsKCk7IH1cclxuICAgICAgICBjYXRjaCAoZXJyKSB7IFV0aWxzLmVycihcIlBsdWdpbnNcIiwgXCJVbmFibGUgdG8gZ2V0IHNldHRpbmdzIHBhbmVsIGZvciBcIiArIHRoaXMubmFtZSArIFwiLlwiLCBlcnIpOyB9XHJcblxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1jYXJkIGJkLWFkZG9uLWNhcmQgc2V0dGluZ3Mtb3BlbiB1aS1zd2l0Y2gtaXRlbVwiLCByZWY6IFwiY2FyZE5vZGVcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge3N0eWxlOiB7XCJmbG9hdFwiOiBcInJpZ2h0XCIsIFwiY3Vyc29yXCI6IFwicG9pbnRlclwifSwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnMuc2V0dGluZ3NwYW5lbC5pbm5lckhUTUwgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtzZXR0aW5nczogZmFsc2V9KTtcclxuICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChYU3ZnLCBudWxsKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5zZXR0aW5nc1BhbmVsID09PSBcIm9iamVjdFwiICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IGBwbHVnaW4tc2V0dGluZ3MtJHt0aGlzLm5hbWV9YCwgY2xhc3NOYW1lOiBcInBsdWdpbi1zZXR0aW5nc1wiLCByZWY6IFwic2V0dGluZ3NwYW5lbFwifSksXHJcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnNldHRpbmdzUGFuZWwgIT09IFwib2JqZWN0XCIgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogYHBsdWdpbi1zZXR0aW5ncy0ke3RoaXMubmFtZX1gLCBjbGFzc05hbWU6IFwicGx1Z2luLXNldHRpbmdzXCIsIHJlZjogXCJzZXR0aW5nc3BhbmVsXCIsIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7X19odG1sOiB0aGlzLnNldHRpbmdzUGFuZWx9fSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGJ1aWxkVGl0bGUobmFtZSwgdmVyc2lvbiwgYXV0aG9yKSB7XHJcbiAgICAgICAgY29uc3QgdGl0bGUgPSBcInt7bmFtZX19IHZ7e3ZlcnNpb259fSBieSB7e2F1dGhvcn19XCIuc3BsaXQoLyh7e1tBLVphLXpdK319KS8pO1xyXG4gICAgICAgIGNvbnN0IG5hbWVJbmRleCA9IHRpdGxlLmZpbmRJbmRleChzID0+IHMgPT0gXCJ7e25hbWV9fVwiKTtcclxuICAgICAgICBpZiAobmFtZUluZGV4KSB0aXRsZVtuYW1lSW5kZXhdID0gUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJuYW1lIGJkYS1uYW1lXCJ9LCBuYW1lKTtcclxuICAgICAgICBjb25zdCB2ZXJzaW9uSW5kZXggPSB0aXRsZS5maW5kSW5kZXgocyA9PiBzID09IFwie3t2ZXJzaW9ufX1cIik7XHJcbiAgICAgICAgaWYgKG5hbWVJbmRleCkgdGl0bGVbdmVyc2lvbkluZGV4XSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IFwidmVyc2lvbiBiZGEtdmVyc2lvblwifSwgdmVyc2lvbik7XHJcbiAgICAgICAgY29uc3QgYXV0aG9ySW5kZXggPSB0aXRsZS5maW5kSW5kZXgocyA9PiBzID09IFwie3thdXRob3J9fVwiKTtcclxuICAgICAgICBpZiAobmFtZUluZGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0ge2NsYXNzTmFtZTogXCJhdXRob3IgYmRhLWF1dGhvclwifTtcclxuICAgICAgICAgICAgaWYgKGF1dGhvci5saW5rIHx8IGF1dGhvci5pZCkge1xyXG4gICAgICAgICAgICAgICAgcHJvcHMuY2xhc3NOYW1lICs9IGAgJHthbmNob3JDbGFzc2VzLmFuY2hvcn0gJHthbmNob3JDbGFzc2VzLmFuY2hvclVuZGVybGluZU9uSG92ZXJ9YDtcclxuICAgICAgICAgICAgICAgIHByb3BzLnRhcmdldCA9IFwiX2JsYW5rXCI7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGF1dGhvci5saW5rKSBwcm9wcy5ocmVmID0gYXV0aG9yLmxpbms7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXV0aG9yLmlkKSBwcm9wcy5vbkNsaWNrID0gKCkgPT4ge0JEVjIuTGF5ZXJTdGFjay5wb3BMYXllcigpOyBCRFYyLm9wZW5ETShhdXRob3IuaWQpO307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGl0bGVbYXV0aG9ySW5kZXhdID0gUmVhY3QuY3JlYXRlRWxlbWVudChhdXRob3IubGluayB8fCBhdXRob3IuaWQgPyBcImFcIiA6IFwic3BhblwiLCBwcm9wcywgYXV0aG9yLm5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGl0bGUuZmxhdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIG1ha2VMaW5rKHRpdGxlLCB1cmwpIHtcclxuICAgICAgICBjb25zdCBwcm9wcyA9IHtjbGFzc05hbWU6IFwiYmRhLWxpbmsgYmRhLWxpbmstd2Vic2l0ZVwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9O1xyXG4gICAgICAgIGlmICh0eXBlb2YodXJsKSA9PSBcInN0cmluZ1wiKSBwcm9wcy5ocmVmID0gdXJsO1xyXG4gICAgICAgIGlmICh0eXBlb2YodXJsKSA9PSBcImZ1bmN0aW9uXCIpIHByb3BzLm9uQ2xpY2sgPSAoZXZlbnQpID0+IHtldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgdXJsKCk7fTtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCBwcm9wcywgdGl0bGUpO1xyXG4gICAgfVxyXG5cclxuICAgIG1ha2VCdXR0b24odGl0bGUsIGNoaWxkcmVuLCBhY3Rpb24pIHtcclxuICAgICAgICByZXR1cm4gPFRvb2x0aXBXcmFwIGNvbG9yPVwiYmxhY2tcIiBzaWRlPVwidG9wXCIgdGV4dD17dGl0bGV9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLWFkZG9uLWJ1dHRvblwiIG9uQ2xpY2s9e2FjdGlvbn0+e2NoaWxkcmVufTwvZGl2PlxyXG4gICAgICAgIDwvVG9vbHRpcFdyYXA+O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCl7XHJcbiAgICAgICAgdGhpcy51bm1vdW50ZWQgPSB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxpbmtzKCkge1xyXG4gICAgICAgIGNvbnN0IGxpbmtzID0gW107XHJcbiAgICAgICAgY29uc3QgYWRkb24gPSB0aGlzLnByb3BzLmFkZG9uO1xyXG4gICAgICAgIGlmIChhZGRvbi53ZWJzaXRlKSBsaW5rcy5wdXNoKHRoaXMubWFrZUxpbmsoXCJXZWJzaXRlXCIsIGFkZG9uLndlYnNpdGUpKTtcclxuICAgICAgICBpZiAoYWRkb24uc291cmNlKSBsaW5rcy5wdXNoKHRoaXMubWFrZUxpbmsoXCJTb3VyY2VcIiwgYWRkb24uc291cmNlKSk7XHJcbiAgICAgICAgaWYgKGFkZG9uLmludml0ZSkge1xyXG4gICAgICAgICAgICBsaW5rcy5wdXNoKHRoaXMubWFrZUxpbmsoXCJTdXBwb3J0IFNlcnZlclwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0ZXIgPSAvXFwuZ2dcXC8oLiopJC87XHJcbiAgICAgICAgICAgICAgICBsZXQgY29kZSA9IGFkZG9uLmludml0ZTtcclxuICAgICAgICAgICAgICAgIGlmICh0ZXN0ZXIudGVzdChjb2RlKSkgY29kZSA9IGNvZGUubWF0Y2godGVzdGVyKVsxXTtcclxuICAgICAgICAgICAgICAgIEJEVjIuTGF5ZXJTdGFjay5wb3BMYXllcigpO1xyXG4gICAgICAgICAgICAgICAgQkRWMi5JbnZpdGVBY3Rpb25zLmFjY2VwdEludml0ZUFuZFRyYW5zaXRpb25Ub0ludml0ZUNoYW5uZWwoY29kZSk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFkZG9uLmRvbmF0ZSkgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiRG9uYXRlXCIsIGFkZG9uLmRvbmF0ZSkpO1xyXG4gICAgICAgIGlmIChhZGRvbi5wYXRyZW9uKSBsaW5rcy5wdXNoKHRoaXMubWFrZUxpbmsoXCJQYXRyZW9uXCIsIGFkZG9uLnBhdHJlb24pKTtcclxuICAgICAgICByZXR1cm4gbGlua3M7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGZvb3RlcigpIHtcclxuICAgICAgICBjb25zdCBsaW5rcyA9IHRoaXMubGlua3M7XHJcbiAgICAgICAgcmV0dXJuIChsaW5rcy5sZW5ndGggfHwgdGhpcy5oYXNTZXR0aW5ncykgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtY2FyZC1mb290ZXIgYmRhLWZvb3RlclwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBcImJkLWFkZG9uLWxpbmtzIGJkYS1saW5rc1wifSxcclxuICAgICAgICAgICAgICAgIC4uLihsaW5rcy5tYXAoKGVsZW1lbnQsIGluZGV4KSA9PiBpbmRleCA8IGxpbmtzLmxlbmd0aCAtIDEgPyBbZWxlbWVudCwgXCIgfCBcIl0gOiBlbGVtZW50KS5mbGF0KCkpXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHRoaXMuaGFzU2V0dGluZ3MgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtvbkNsaWNrOiB0aGlzLnNob3dTZXR0aW5ncywgY2xhc3NOYW1lOiBcImJkLWJ1dHRvbiBiZGEtc2V0dGluZ3MtYnV0dG9uXCIsIGRpc2FibGVkOiAhdGhpcy5zdGF0ZS5jaGVja2VkfSwgXCJTZXR0aW5nc1wiKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UoKSB7XHJcbiAgICAgICAgdGhpcy5wcm9wcy50b2dnbGUgJiYgdGhpcy5wcm9wcy50b2dnbGUodGhpcy5uYW1lKTtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtjaGVja2VkOiAhdGhpcy5zdGF0ZS5jaGVja2VkfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZWRpdCgpIHt0aGlzLnByb3BzLmVkaXQodGhpcy5uYW1lKTt9XHJcbiAgICBkZWxldGUoKSB7dGhpcy5wcm9wcy5yZW1vdmUodGhpcy5uYW1lKTt9XHJcbiAgICByZWxvYWQoKSB7dGhpcy5wcm9wcy5yZWxvYWQodGhpcy5uYW1lKTt9XHJcblxyXG4gICAgZ2V0IG5hbWUoKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luID8gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0TmFtZSgpIDogdGhpcy5wcm9wcy5hZGRvbi5uYW1lKTt9XHJcbiAgICBnZXQgYXV0aG9yKCkge3JldHVybiB0aGlzLmdldFN0cmluZyh0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiA/IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldEF1dGhvcigpIDogdGhpcy5wcm9wcy5hZGRvbi5hdXRob3IpO31cclxuICAgIGdldCBkZXNjcmlwdGlvbigpIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcodGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gPyB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXREZXNjcmlwdGlvbigpIDogdGhpcy5wcm9wcy5hZGRvbi5kZXNjcmlwdGlvbik7fVxyXG4gICAgZ2V0IHZlcnNpb24oKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luID8gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0VmVyc2lvbigpIDogdGhpcy5wcm9wcy5hZGRvbi52ZXJzaW9uKTt9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnNldHRpbmdzKSByZXR1cm4gdGhpcy5zZXR0aW5nc0NvbXBvbmVudDtcclxuICAgICAgICBjb25zdCB7YXV0aG9ySWQsIGF1dGhvckxpbmt9ID0gdGhpcy5wcm9wcy5hZGRvbjtcclxuXHJcbiAgICAgICAgY29uc3Qgc3R5bGUgPSB7fVxyXG4gICAgICAgIGlmKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy02XCJdKXtcclxuICAgICAgICAgICAgaWYoIXRoaXMuaXNTY2FubmluZyl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzU2Nhbm5pbmcgPSB0cnVlXHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzRmlsZShyZXNvbHZlKHRoaXMucHJvcHMuYWRkb24uZmlsZW5hbWUuZW5kc1dpdGgoXCIucGx1Z2luLmpzXCIpID8gY29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlciA6IGNvbnRlbnRNYW5hZ2VyLnRoZW1lc0ZvbGRlciwgdGhpcy5wcm9wcy5hZGRvbi5maWxlbmFtZSksIChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnVubW91bnRlZClyZXR1cm5cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1RydXN0ZWQ6IHJlc3VsdC5zdXNwZWN0ID8gXCJzdXNwZWN0XCIgOiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH0sICgpID0+IHt9KVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuc3RhdGUuaXNUcnVzdGVkID09PSB0cnVlKXtcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZS5ib3JkZXJDb2xvciA9IFwiIzQwODdlZFwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLnN0YXRlLmlzVHJ1c3RlZCA9PT0gXCJzdXNwZWN0XCIpe1xyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLmJvcmRlckNvbG9yID0gXCJyZ2IoMjQwLCA3MSwgNzEpXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtY2FyZCBiZC1hZGRvbi1jYXJkIHNldHRpbmdzLWNsb3NlZCB1aS1zd2l0Y2gtaXRlbVwiLCBzdHlsZX0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWFkZG9uLWhlYWRlciBiZGEtaGVhZGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNhcmQtdGl0bGUgYmRhLWhlYWRlci10aXRsZVwifSwgdGhpcy5idWlsZFRpdGxlKHRoaXMubmFtZSwgdGhpcy52ZXJzaW9uLCB7bmFtZTogdGhpcy5hdXRob3IsIGlkOiBhdXRob3JJZCwgbGluazogYXV0aG9yTGlua30pKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1hZGRvbi1jb250cm9scyBiZGEtY29udHJvbHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMuZWRpdCAmJiB0aGlzLm1ha2VCdXR0b24oXCJFZGl0XCIsIDxFZGl0SWNvbiBjbGFzc05hbWU9XCJiZC1pY29uXCIgLz4sIHRoaXMuZWRpdCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMucmVtb3ZlICYmIHRoaXMubWFrZUJ1dHRvbihcIkRlbGV0ZVwiLCA8RGVsZXRlSWNvbiBjbGFzc05hbWU9XCJiZC1pY29uXCIgLz4sIHRoaXMuZGVsZXRlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5yZWxvYWQgJiYgdGhpcy5tYWtlQnV0dG9uKFwiUmVsb2FkXCIsIDxSZWxvYWRJY29uIGNsYXNzTmFtZT1cImJkLWljb25cIiAvPiwgdGhpcy5yZWxvYWQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFN3aXRjaCwge29uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLCBjaGVja2VkOiB0aGlzLnN0YXRlLmNoZWNrZWR9KVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtc2Nyb2xsZXItd3JhcCBiZGEtZGVzY3JpcHRpb24td3JhcCBzY3JvbGxlci13cmFwIGZhZGVcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1zY3JvbGxlciBiZC1hZGRvbi1kZXNjcmlwdGlvbiBiZGEtZGVzY3JpcHRpb24gc2Nyb2xsZXJcIn0sIHRoaXMuZGVzY3JpcHRpb24pXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHRoaXMuZm9vdGVyXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufVxyXG5cclxuY29uc3Qgb3JpZ2luYWxSZW5kZXIgPSBWMkNfUGx1Z2luQ2FyZC5wcm90b3R5cGUucmVuZGVyO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVjJDX1BsdWdpbkNhcmQucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XHJcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcbiAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxyXG4gICAgZ2V0OiAoKSA9PiBvcmlnaW5hbFJlbmRlclxyXG59KTsiLCJpbXBvcnQgRXJyb3JCb3VuZGFyeSBmcm9tIFwiLi9lcnJvckJvdW5kYXJ5XCI7XHJcbmltcG9ydCBDb250ZW50Q29sdW1uIGZyb20gXCIuL2NvbnRlbnRDb2x1bW5cIjtcclxuaW1wb3J0IFRvb2xzIGZyb20gXCIuL3Rvb2xzXCI7XHJcbmltcG9ydCBSZWxvYWRJY29uIGZyb20gXCIuL3JlbG9hZEljb25cIjtcclxuaW1wb3J0IEFkZG9uQ2FyZCBmcm9tIFwiLi9hZGRvbmNhcmRcIjtcclxuaW1wb3J0IFNjcm9sbGVyIGZyb20gXCIuL3Njcm9sbGVyXCI7XHJcbmltcG9ydCBEcm9wZG93biBmcm9tIFwiLi9jb21wb25lbnRzL2Ryb3Bkb3duXCI7XHJcbmltcG9ydCBTZWFyY2ggZnJvbSBcIi4vY29tcG9uZW50cy9zZWFyY2hcIjtcclxuXHJcbmltcG9ydCB7c2V0dGluZ3NDb29raWUsIHBsdWdpbkNvb2tpZSwgdGhlbWVDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4uL21vZHVsZXMvY29udGVudE1hbmFnZXJcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi4vbW9kdWxlcy9wbHVnaW5Nb2R1bGVcIjtcclxuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuLi9tb2R1bGVzL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi4vbW9kdWxlcy93ZWJwYWNrTW9kdWxlc1wiO1xyXG5pbXBvcnQgQmRBcGkgZnJvbSBcIi4uL21vZHVsZXMvYmRBcGlcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi9tb2R1bGVzL3V0aWxzXCI7XHJcbmltcG9ydCB0b29sdGlwV3JhcCBmcm9tIFwiLi90b29sdGlwV3JhcFwiO1xyXG5cclxuY29uc3QgVG9vbHRpcCA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiVG9vbHRpcFwiKTtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5yZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhcmRMaXN0IGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge3NvcnQ6IFwibmFtZVwiLCBhc2NlbmRpbmc6IHRydWUsIHF1ZXJ5OiBcIlwifTtcclxuICAgICAgICB0aGlzLmlzUGx1Z2lucyA9IHRoaXMucHJvcHMudHlwZSA9PSBcInBsdWdpbnNcIjtcclxuICAgICAgICB0aGlzLmNvb2tpZSA9IHRoaXMuaXNQbHVnaW5zID8gcGx1Z2luQ29va2llIDogdGhlbWVDb29raWU7XHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gdGhpcy5pc1BsdWdpbnMgPyBwbHVnaW5Nb2R1bGUgOiB0aGVtZU1vZHVsZTtcclxuXHJcbiAgICAgICAgdGhpcy5zb3J0ID0gdGhpcy5zb3J0LmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5yZXZlcnNlID0gdGhpcy5yZXZlcnNlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zZWFyY2ggPSB0aGlzLnNlYXJjaC5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIG9wZW5Gb2xkZXIoKSB7XHJcbiAgICAgICAgcmVxdWlyZShcImVsZWN0cm9uXCIpLnNoZWxsLm9wZW5JdGVtKHRoaXMuaXNQbHVnaW5zID8gQ29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlciA6IENvbnRlbnRNYW5hZ2VyLnRoZW1lc0ZvbGRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgZWRpdChuYW1lKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2cobmFtZSk7XHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLmVkaXQobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGVsZXRlKG5hbWUpIHtcclxuICAgICAgICBjb25zdCBzaG91bGREZWxldGUgPSBhd2FpdCB0aGlzLmNvbmZpcm1EZWxldGUobmFtZSk7XHJcbiAgICAgICAgaWYgKCFzaG91bGREZWxldGUpIHJldHVybjtcclxuICAgICAgICB0aGlzLm1hbmFnZXIuZGVsZXRlKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbmZpcm1EZWxldGUobmFtZSkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgQmRBcGkuc2hvd0NvbmZpcm1hdGlvbk1vZGFsKFwiQXJlIFlvdSBTdXJlP1wiLCBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAke25hbWV9P2AsIHtcclxuICAgICAgICAgICAgICAgIGRhbmdlcjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0OiBcIkRlbGV0ZVwiLFxyXG4gICAgICAgICAgICAgICAgb25Db25maXJtOiAoKSA9PiB7cmVzb2x2ZSh0cnVlKTt9LFxyXG4gICAgICAgICAgICAgICAgb25DYW5jZWw6ICgpID0+IHtyZXNvbHZlKGZhbHNlKTt9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzb3J0T3B0aW9ucygpIHtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7bGFiZWw6IFwiTmFtZVwiLCB2YWx1ZTogXCJuYW1lXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiQXV0aG9yXCIsIHZhbHVlOiBcImF1dGhvclwifSxcclxuICAgICAgICAgICAge2xhYmVsOiBcIlZlcnNpb25cIiwgdmFsdWU6IFwidmVyc2lvblwifSxcclxuICAgICAgICAgICAge2xhYmVsOiBcIlJlY2VudGx5IEFkZGVkXCIsIHZhbHVlOiBcImFkZGVkXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiTGFzdCBNb2RpZmllZFwiLCB2YWx1ZTogXCJtb2RpZmllZFwifSxcclxuICAgICAgICAgICAge2xhYmVsOiBcIkZpbGUgU2l6ZVwiLCB2YWx1ZTogXCJzaXplXCJ9LFxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRpcmVjdGlvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge2xhYmVsOiBcIkFzY2VuZGluZ1wiLCB2YWx1ZTogdHJ1ZX0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJEZXNjZW5kaW5nXCIsIHZhbHVlOiBmYWxzZX1cclxuICAgICAgICBdO1xyXG4gICAgfVxyXG5cclxuICAgIHJldmVyc2UodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHthc2NlbmRpbmc6IHZhbHVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc29ydCh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3NvcnQ6IHZhbHVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VhcmNoKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7cXVlcnk6IGV2ZW50LnRhcmdldC52YWx1ZS50b0xvY2FsZUxvd2VyQ2FzZSgpfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJvcHMoYWRkb24pIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBrZXk6IHRoaXMuZ2V0TmFtZShhZGRvbiksXHJcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMuY29va2llW3RoaXMuZ2V0TmFtZShhZGRvbildLFxyXG4gICAgICAgICAgICB0b2dnbGU6IHRoaXMubWFuYWdlci50b2dnbGUuYmluZCh0aGlzLm1hbmFnZXIpLFxyXG4gICAgICAgICAgICAvL2VkaXQ6IHRoaXMuZWRpdC5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICByZW1vdmU6IHRoaXMuZGVsZXRlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgIGFkZG9uOiBhZGRvbixcclxuICAgICAgICAgICAgaGFzaDogYWRkb24uaGFzaFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3RyaW5nKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiPz8/XCI7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBsaXN0KCl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMudHlwZSA9PT0gXCJwbHVnaW5zXCIgPyBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykgOiBPYmplY3QudmFsdWVzKGJkdGhlbWVzKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBZGRvbnMoKSB7XHJcbiAgICAgICAgY29uc3Qgc29ydGVkQWRkb25zID0gdGhpcy5saXN0LnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2FwID0gdGhpcy5zdGF0ZS5zb3J0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGhpcy5zdGF0ZS5zb3J0LnNsaWNlKDEpO1xyXG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IGEucGx1Z2luICYmIGEucGx1Z2luW2BnZXQke2NhcH1gXSA/IHRoaXMuZ2V0U3RyaW5nKGEucGx1Z2luW2BnZXQke2NhcH1gXSgpKSA6IGFbdGhpcy5zdGF0ZS5zb3J0XTtcclxuICAgICAgICAgICAgY29uc3Qgc2Vjb25kID0gYi5wbHVnaW4gJiYgYi5wbHVnaW5bYGdldCR7Y2FwfWBdID8gdGhpcy5nZXRTdHJpbmcoYi5wbHVnaW5bYGdldCR7Y2FwfWBdKCkpICA6IGJbdGhpcy5zdGF0ZS5zb3J0XTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZihmaXJzdCkgPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZpcnN0LnRvTG9jYWxlTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShzZWNvbmQudG9Mb2NhbGVMb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIGlmIChmaXJzdCA+IHNlY29uZCkgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgIGlmIChzZWNvbmQgPiBmaXJzdCkgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoIXRoaXMuc3RhdGUuYXNjZW5kaW5nKSBzb3J0ZWRBZGRvbnMucmV2ZXJzZSgpO1xyXG4gICAgICAgIGNvbnN0IHJlbmRlcmVkID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgYSA9IDA7IGEgPCBzb3J0ZWRBZGRvbnMubGVuZ3RoOyBhKyspIHtcclxuICAgICAgICAgICAgY29uc3QgYWRkb24gPSBzb3J0ZWRBZGRvbnNbYV07XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLnF1ZXJ5KSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2hlcyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5nZXROYW1lKGFkZG9uKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGF1dGhvciA9IHRoaXMuZ2V0QXV0aG9yKGFkZG9uKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdGhpcy5nZXREZXNjcmlwdGlvbihhZGRvbik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJzaW9uID0gdGhpcy5nZXRWZXJzaW9uKGFkZG9uKTtcclxuICAgICAgICAgICAgICAgIGlmIChuYW1lKSBtYXRjaGVzID0gbmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc3RhdGUucXVlcnkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGF1dGhvcikgbWF0Y2hlcyA9IG1hdGNoZXMgfHwgYXV0aG9yLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zdGF0ZS5xdWVyeSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24pIG1hdGNoZXMgPSBtYXRjaGVzIHx8IGRlc2NyaXB0aW9uLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zdGF0ZS5xdWVyeSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodmVyc2lvbikgbWF0Y2hlcyA9IG1hdGNoZXMgfHwgdmVyc2lvbi50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc3RhdGUucXVlcnkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVzKSBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMuZ2V0UHJvcHMoYWRkb24pO1xyXG4gICAgICAgICAgICByZW5kZXJlZC5wdXNoKDxFcnJvckJvdW5kYXJ5PjxBZGRvbkNhcmQgey4uLnByb3BzfSByZWxvYWQ9eyFzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSAmJiB0aGlzLm1hbmFnZXIucmVsb2FkLmJpbmQodGhpcy5tYW5hZ2VyKX0gLz48L0Vycm9yQm91bmRhcnk+KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlbmRlcmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE5hbWUoYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldE5hbWUoKSA6IGFkZG9uLm5hbWUpO31cclxuICAgIGdldEF1dGhvcihhZGRvbikge3JldHVybiB0aGlzLmdldFN0cmluZyhhZGRvbi5wbHVnaW4gPyBhZGRvbi5wbHVnaW4uZ2V0QXV0aG9yKCkgOiBhZGRvbi5hdXRob3IpO31cclxuICAgIGdldERlc2NyaXB0aW9uKGFkZG9uKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKGFkZG9uLnBsdWdpbiA/IGFkZG9uLnBsdWdpbi5nZXREZXNjcmlwdGlvbigpIDogYWRkb24uZGVzY3JpcHRpb24pO31cclxuICAgIGdldFZlcnNpb24oYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldFZlcnNpb24oKSA6IGFkZG9uLnZlcnNpb24pO31cclxuXHJcbiAgICByZW5kZXJDaGVja1VwZGF0ZXMoKXtcclxuICAgICAgICBpZighd2luZG93LlplcmVzUGx1Z2luTGlicmFyeSlyZXR1cm4gbnVsbFxyXG4gICAgICAgIGlmKCF3aW5kb3cuUGx1Z2luVXBkYXRlcylyZXR1cm4gbnVsbFxyXG4gICAgICAgIGlmKHR5cGVvZiB3aW5kb3cuUGx1Z2luVXBkYXRlcy5jaGVja0FsbCAhPT0gXCJmdW5jdGlvblwiKXJldHVybiBudWxsXHJcbiAgICAgICAgaWYoIXRoaXMuaXNQbHVnaW5zKXJldHVybiBudWxsXHJcblxyXG4gICAgICAgIHJldHVybiA8dG9vbHRpcFdyYXAgdGV4dD1cIkNoZWNrcyBmb3IgdXBkYXRlcyBvZiBwbHVnaW5zIHRoYXQgc3VwcG9ydCB0aGlzIGZlYXR1cmUuIFJpZ2h0LWNsaWNrIGZvciBhIGxpc3QuXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPXt7bWFyZ2luTGVmdDogXCIxMHB4XCJ9fT5cclxuICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiBjb2xvcj1cImJyYW5kXCIgbG9vaz1cImZpbGxlZFwiIHNpemU9XCJtaW5cIiBob3ZlckNvbG9yPVwiZGVmYXVsdFwiIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChcIlBsdWdpbiB1cGRhdGUgY2hlY2sgaW4gcHJvZ3Jlc3MuXCIsIHt0eXBlOiBcImluZm9cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5QbHVnaW5VcGRhdGVzLmNoZWNrQWxsKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KFwiUGx1Z2luIHVwZGF0ZSBjaGVjayBjb21wbGV0ZS5cIiwge3R5cGU6IFwic3VjY2Vzc1wifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KFwiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBjaGVja2luZyB1cGRhdGUuXCIsIHt0eXBlOiBcImVycm9yXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGNoZWNraW5nIHVwZGF0ZS5cIiwge3R5cGU6IFwiZXJyb3JcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfX0gd3JhcHBlcj17ZmFsc2V9IGRpc2FibGVkPXtmYWxzZX0+XHJcbiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgZm9yIFVwZGF0ZXNcclxuICAgICAgICAgICAgICAgIDwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L3Rvb2x0aXBXcmFwPlxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCByZWZyZXNoSWNvbiA9IDxUb29sdGlwIGNvbG9yPVwiYmxhY2tcIiBwb3NpdGlvbj1cInRvcFwiIHRleHQ9XCJSZWxvYWQgTGlzdFwiPlxyXG4gICAgICAgICAgICB7KHByb3BzKSA9PiBcclxuICAgICAgICAgICAgPFJlbG9hZEljb24gey4uLnByb3BzfSBjbGFzc05hbWU9XCJiZC1pY29uIGJkLXJlbG9hZCBiZC1yZWxvYWQtaGVhZGVyXCIgc2l6ZT1cIjE4cHhcIiBvbkNsaWNrPXthc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1BsdWdpbnMpIHBsdWdpbk1vZHVsZS51cGRhdGVQbHVnaW5MaXN0KCk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHRoZW1lTW9kdWxlLnVwZGF0ZVRoZW1lTGlzdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xyXG4gICAgICAgICAgICB9fSAvPlxyXG4gICAgICAgICAgICB9PC9Ub29sdGlwPjtcclxuICAgICAgICBjb25zdCBhZGRvbkNhcmRzID0gdGhpcy5nZXRBZGRvbnMoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIDxDb250ZW50Q29sdW1uIHRpdGxlPXtgJHt0aGlzLnByb3BzLnR5cGUudG9VcHBlckNhc2UoKX3igJQke2FkZG9uQ2FyZHMubGVuZ3RofWB9PlxyXG4gICAgICAgICAgICA8YnV0dG9uIGtleT1cImZvbGRlci1idXR0b25cIiBjbGFzc05hbWU9XCJiZC1idXR0b24gYmQtcGZidG5cIiBvbkNsaWNrPXt0aGlzLm9wZW5Gb2xkZXIuYmluZCh0aGlzKX0+T3BlbiB7dGhpcy5pc1BsdWdpbnMgPyBcIlBsdWdpblwiIDogXCJUaGVtZVwifSBGb2xkZXI8L2J1dHRvbj5cclxuICAgICAgICAgICAge3RoaXMucmVuZGVyQ2hlY2tVcGRhdGVzKCl9XHJcbiAgICAgICAgICAgIHshc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTVcIl0gJiYgcmVmcmVzaEljb259XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtY29udHJvbHMgYmQtYWRkb24tY29udHJvbHNcIj5cclxuICAgICAgICAgICAgICAgIDxTZWFyY2ggb25DaGFuZ2U9e3RoaXMuc2VhcmNofSBwbGFjZWhvbGRlcj17YFNlYXJjaCAke3RoaXMucHJvcHMudHlwZX0uLi5gfSAvPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1hZGRvbi1kcm9wZG93bnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJiZC1sYWJlbFwiPlNvcnQgYnk6PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duIG9wdGlvbnM9e3RoaXMuc29ydE9wdGlvbnN9IG9uQ2hhbmdlPXt0aGlzLnNvcnR9IHN0eWxlPVwidHJhbnNwYXJlbnRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImJkLWxhYmVsXCI+T3JkZXI6PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duIG9wdGlvbnM9e3RoaXMuZGlyZWN0aW9uc30gb25DaGFuZ2U9e3RoaXMucmV2ZXJzZX0gc3R5bGU9XCJ0cmFuc3BhcmVudFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmRhLXNsaXN0IGJkLWFkZG9uLWxpc3RcIj57YWRkb25DYXJkc308L2Rpdj5cclxuICAgICAgICA8L0NvbnRlbnRDb2x1bW4+XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IG9yaWdpbmFsUmVuZGVyID0gQ2FyZExpc3QucHJvdG90eXBlLnJlbmRlcjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KENhcmRMaXN0LnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xyXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgc2V0OiBmdW5jdGlvbigpIHtjb25zb2xlLndhcm4oXCJBZGRvbiBwb2xpY3kgZm9yIHBsdWdpbnMgIzUgaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC93aWtpL0FkZG9uLVBvbGljaWVzI3BsdWdpbnNcIik7fSxcclxuICAgIGdldDogKCkgPT4gb3JpZ2luYWxSZW5kZXJcclxufSk7ICIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCRExvZ28gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcInN2Z1wiLFxyXG4gICAgICAgICAgICB7aGVpZ2h0OiBcIjEwMCVcIiwgd2lkdGg6IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ28gXCIgKyB0aGlzLnByb3BzLmNsYXNzTmFtZSwgc3R5bGU6IHtmaWxsUnVsZTogXCJldmVub2RkXCIsIGNsaXBSdWxlOiBcImV2ZW5vZGRcIiwgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLCBzdHJva2VMaW5lam9pbjogXCJyb3VuZFwifSwgdmlld0JveDogXCIwIDAgMjAwMCAyMDAwXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJtZXRhZGF0YVwiLCBudWxsKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGVmc1wiLCBudWxsLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmlsdGVyXCIsIHtpZDogXCJzaGFkb3cxXCJ9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmZURyb3BTaGFkb3dcIiwge1wiZHhcIjogXCIyMFwiLCBcImR5XCI6IFwiMFwiLCBcInN0ZERldmlhdGlvblwiOiBcIjIwXCIsIFwiZmxvb2QtY29sb3JcIjogXCJyZ2JhKDAsMCwwLDAuMzUpXCJ9KSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmaWx0ZXJcIiwge2lkOiBcInNoYWRvdzJcIn0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZlRHJvcFNoYWRvd1wiLCB7XCJkeFwiOiBcIjE1XCIsIFwiZHlcIjogXCIwXCIsIFwic3RkRGV2aWF0aW9uXCI6IFwiMjBcIiwgXCJmbG9vZC1jb2xvclwiOiBcInJnYmEoMjU1LDI1NSwyNTUsMC4xNSlcIn0pKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZpbHRlclwiLCB7aWQ6IFwic2hhZG93M1wifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVEcm9wU2hhZG93XCIsIHtcImR4XCI6IFwiMTBcIiwgXCJkeVwiOiBcIjBcIiwgXCJzdGREZXZpYXRpb25cIjogXCIyMFwiLCBcImZsb29kLWNvbG9yXCI6IFwicmdiYSgwLDAsMCwwLjM1KVwifSkpXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwgbnVsbCxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge3N0eWxlOiB7ZmlsdGVyOiBcInVybCgjc2hhZG93MylcIn0sIGQ6IFwiTTExOTUuNDQrMTM1LjQ0MkwxMTk1LjQ0KzEzNS40NDJMOTk3LjYrMTM2LjQ0MkMxMDI0LjIrMTQ5Ljc0MisxMTcwLjM0KzE2My41NDIrMTE5My42NCsxNzkuNzQyQzEyNjQuMzQrMjI4Ljg0MisxMzE5Ljc0KzI5MS4yNDIrMTM1OC4yNCszNjUuMDQyQzEzOTguMTQrNDQxLjY0MisxNDE5Ljc0KzUzMC42NDIrMTQyMi41NCs2MjkuNjQyTDE0MjIuNTQrNjMwLjg0MkwxNDIyLjU0KzYzMi4wNDJDMTQyMi41NCs3NzMuMTQyKzE0MjIuNTQrMTIyOC4xNCsxNDIyLjU0KzEzNjkuMTRMMTQyMi41NCsxMzcwLjM0TDE0MjIuNTQrMTM3MS41NEMxNDE5Ljg0KzE0NzAuNTQrMTM5OC4yNCsxNTU5LjU0KzEzNTguMjQrMTYzNi4xNEMxMzE5Ljc0KzE3MDkuOTQrMTI2NC40NCsxNzcyLjM0KzExOTMuNjQrMTgyMS40NEMxMTcxLjA0KzE4MzcuMTQrMTAyNS43KzE4NTAuNTQrMTAwMCsxODYzLjU0TDExOTMuNTQrMTg2NC41NEMxNTM5Ljc0KzE4NjYuNDQrMTg2NC41NCsxNjkzLjM0KzE4NjQuNTQrMTI5Ni42NEwxODY0LjU0KzcxNi45NDJDMTg2Ni40NCszMTIuNDQyKzE1NDEuNjQrMTM1LjQ0MisxMTk1LjQ0KzEzNS40NDJaXCIsIGZpbGw6IFwiIzE3MTcxN1wiLCBvcGFjaXR5OiBcIjFcIn0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7c3R5bGU6IHtmaWx0ZXI6IFwidXJsKCNzaGFkb3cyKVwifSwgZDogXCJNMTY5NS41NCs2MzEuNDQyQzE2ODUuODQrMjc4LjA0MisxNDA5LjM0KzEzNS40NDIrMTA1Mi45NCsxMzUuNDQyTDM2MS43NCsxMzYuNDQyTDgwMy43NCs0OTAuNDQyTDEwNjAuNzQrNDkwLjQ0MkMxMzM1LjI0KzQ5MC40NDIrMTMzNS4yNCs4MzUuMzQyKzEwNjAuNzQrODM1LjM0MkwxMDYwLjc0KzExNjQuODRDMTE1MC4yMisxMTY0Ljg0KzEyMTAuNTMrMTIwMS40OCsxMjQxLjY4KzEyNTAuODdDMTMwNi4wNysxMzUzKzEyNDUuNzYrMTUwOS42NCsxMDYwLjc0KzE1MDkuNjRMMzYxLjc0KzE4NjMuNTRMMTA1Mi45NCsxODY0LjU0QzE0MDkuMjQrMTg2NC41NCsxNjg1Ljc0KzE3MjEuOTQrMTY5NS41NCsxMzY4LjU0QzE2OTUuNTQrMTIwNS45NCsxNjUxLjA0KzEwODQuNDQrMTU3Mi42NCs5OTkuOTQyQzE2NTEuMDQrOTE1LjU0MisxNjk1LjU0Kzc5NC4wNDIrMTY5NS41NCs2MzEuNDQyWlwiLCBmaWxsOiBcIiMzRTgyRTVcIiwgb3BhY2l0eTogXCIxXCJ9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge3N0eWxlOiB7ZmlsdGVyOiBcInVybCgjc2hhZG93MSlcIn0sIGQ6IFwiTTE0NjkuMjUrNjMxLjQ0MkMxNDU5LjU1KzI3OC4wNDIrMTE4My4wNSsxMzUuNDQyKzgyNi42NSsxMzUuNDQyTDEzNS40NSsxMzUuNDQyTDEzNS40NSsxMDA0QzEzNS40NSsxMDA0KzEzNS40MjcrMTI1NS4yMSszNTUuNjI2KzEyNTUuMjFDNTc1LjgyNSsxMjU1LjIxKzU3NS44NDgrMTAwNCs1NzUuODQ4KzEwMDRMNTc3LjQ1KzQ5MC40NDJMODM0LjQ1KzQ5MC40NDJDMTEwOC45NSs0OTAuNDQyKzExMDguOTUrODM1LjM0Mis4MzQuNDUrODM1LjM0Mkw2NjQuNjUrODM1LjM0Mkw2NjQuNjUrMTE2NC44NEw4MzQuNDUrMTE2NC44NEM5MjMuOTMyKzExNjQuODQrOTg0LjI0NCsxMjAxLjQ4KzEwMTUuMzkrMTI1MC44N0MxMDc5Ljc4KzEzNTMrMTAxOS40NysxNTA5LjY0KzgzNC40NSsxNTA5LjY0TDEzNS40NSsxNTA5LjY0TDEzNS40NSsxODY0LjU0TDgyNi42NSsxODY0LjU0QzExODIuOTUrMTg2NC41NCsxNDU5LjQ1KzE3MjEuOTQrMTQ2OS4yNSsxMzY4LjU0QzE0NjkuMjUrMTIwNS45NCsxNDI0Ljc1KzEwODQuNDQrMTM0Ni4zNSs5OTkuOTQyQzE0MjQuNzUrOTE1LjU0MisxNDY5LjI1Kzc5NC4wNDIrMTQ2OS4yNSs2MzEuNDQyWlwiLCBmaWxsOiBcIiNGRkZGRkZcIiwgb3BhY2l0eTogXCIxXCJ9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfQ2hlY2tib3ggZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMub25DbGljayA9IHRoaXMub25DbGljay5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbFN0YXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGNoZWNrZWQ6IHRoaXMucHJvcHMuY2hlY2tlZCB8fCBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwibGlcIixcclxuICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3ggXCIrQkRNb2R1bGVzLmdldChlID0+IGUuY2hlY2tib3hFbGVtZW50KVswXS5jaGVja2JveCwgb25DbGljazogdGhpcy5vbkNsaWNrfSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3gtaW5uZXIgXCIrQkRNb2R1bGVzLmdldChlID0+IGUuY2hlY2tib3hJbm5lcilbMF0uY2hlY2tib3hJbm5lcn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwge2NsYXNzTmFtZTogQkRNb2R1bGVzLmdldChlID0+IGUuY2hlY2tib3hFbGVtZW50KVswXS5jaGVja2JveEVsZW1lbnQsIGNoZWNrZWQ6IHRoaXMuc3RhdGUuY2hlY2tlZCwgb25DaGFuZ2U6ICgpID0+IHt9LCB0eXBlOiBcImNoZWNrYm94XCJ9KSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwpXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy50ZXh0XHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soKSB7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLmlkLCAhdGhpcy5zdGF0ZS5jaGVja2VkKTtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgY2hlY2tlZDogIXRoaXMuc3RhdGUuY2hlY2tlZFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IEFycm93IGZyb20gXCIuLi9pY29ucy9kb3duYXJyb3dcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWxlY3QgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtvcGVuOiBmYWxzZSwgdmFsdWU6IHRoaXMucHJvcHMudmFsdWUgfHwgdGhpcy5wcm9wcy5vcHRpb25zWzBdLnZhbHVlfTtcclxuICAgICAgICB0aGlzLmRyb3Bkb3duID0gUmVhY3QuY3JlYXRlUmVmKCk7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNob3dNZW51ID0gdGhpcy5zaG93TWVudS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaGlkZU1lbnUgPSB0aGlzLmhpZGVNZW51LmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd01lbnUoZXZlbnQpIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe29wZW46IHRydWV9LCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLmhpZGVNZW51KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlTWVudSgpIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtvcGVuOiBmYWxzZX0sICgpID0+IHtcclxuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuaGlkZU1lbnUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7dmFsdWV9KTtcclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkNoYW5nZSkgdGhpcy5wcm9wcy5vbkNoYW5nZSh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNlbGVjdGVkKCkge3JldHVybiB0aGlzLnByb3BzLm9wdGlvbnMuZmluZChvID0+IG8udmFsdWUgPT0gdGhpcy5zdGF0ZS52YWx1ZSk7fVxyXG5cclxuICAgIGdldCBvcHRpb25zKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZDtcclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtb3B0aW9uc1wiPlxyXG4gICAgICAgICAgICB7dGhpcy5wcm9wcy5vcHRpb25zLm1hcChvcHQgPT4gXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YGJkLXNlbGVjdC1vcHRpb24ke3NlbGVjdGVkLnZhbHVlID09IG9wdC52YWx1ZSA/IFwiIHNlbGVjdGVkXCIgOiBcIlwifWB9IG9uQ2xpY2s9e3RoaXMub25DaGFuZ2UuYmluZCh0aGlzLCBvcHQudmFsdWUpfT57b3B0LmxhYmVsfTwvZGl2PlxyXG4gICAgICAgICAgICApfVxyXG4gICAgICAgIDwvZGl2PjtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc3R5bGUgPSB0aGlzLnByb3BzLnN0eWxlID09IFwidHJhbnNwYXJlbnRcIiA/IFwiIGJkLXNlbGVjdC10cmFuc3BhcmVudFwiIDogXCJcIjtcclxuICAgICAgICBjb25zdCBpc09wZW4gPSB0aGlzLnN0YXRlLm9wZW4gPyBcIiBtZW51LW9wZW5cIiA6IFwiXCI7XHJcbiAgICAgICAgcmV0dXJuICA8ZGl2IGNsYXNzTmFtZT17YGJkLXNlbGVjdCR7c3R5bGV9JHtpc09wZW59YH0gb25DbGljaz17dGhpcy5zaG93TWVudX0gcmVmPXt0aGlzLmRyb3Bkb3dufT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC12YWx1ZVwiPnt0aGlzLnNlbGVjdGVkLmxhYmVsfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxBcnJvdyBjbGFzc05hbWU9XCJiZC1zZWxlY3QtYXJyb3dcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLnN0YXRlLm9wZW4gJiYgdGhpcy5vcHRpb25zfVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+O1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtd3JhcFwiPlxyXG4vLyA8bGFiZWwgY2xhc3NOYW1lPVwiYmQtbGFiZWxcIj57dGhpcy5wcm9wcy5sYWJlbH08L2xhYmVsPlxyXG4vLyA8ZGl2IGNsYXNzTmFtZT17YGJkLXNlbGVjdCR7c3R5bGV9JHtpc09wZW59YH0gb25DbGljaz17dGhpcy5zaG93TWVudX0gcmVmPXt0aGlzLmRyb3Bkb3dufT5cclxuLy8gICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LWNvbnRyb2xzXCI+XHJcbi8vICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3QtdmFsdWVcIj57dGhpcy5zZWxlY3RlZC5sYWJlbH08L2Rpdj5cclxuLy8gICAgICAgICA8QXJyb3cgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LWFycm93XCIgLz5cclxuLy8gICAgIDwvZGl2PlxyXG4vLyA8L2Rpdj5cclxuLy8ge3RoaXMuc3RhdGUub3BlbiAmJiB0aGlzLm9wdGlvbnN9XHJcbi8vIDwvZGl2PjsiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgU2VhcmNoSWNvbiBmcm9tIFwiLi4vaWNvbnMvc2VhcmNoXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWFyY2ggZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlYXJjaC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG9uQ2hhbmdlPXt0aGlzLnByb3BzLm9uQ2hhbmdlfSBvbktleURvd249e3RoaXMucHJvcHMub25LZXlEb3dufSB0eXBlPVwidGV4dFwiIGNsYXNzTmFtZT1cImJkLXNlYXJjaFwiIHBsYWNlaG9sZGVyPXt0aGlzLnByb3BzLnBsYWNlaG9sZGVyfSBtYXhMZW5ndGg9XCI1MFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPFNlYXJjaEljb24gLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PjtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTd2l0Y2ggZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtjaGVja2VkOiB0aGlzLnByb3BzLmNoZWNrZWR9O1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UodmFsdWUpIHtcclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UodmFsdWUpO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2NoZWNrZWQ6IHZhbHVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5Td2l0Y2ggb25DaGFuZ2U9e3RoaXMub25DaGFuZ2V9IHZhbHVlPXt0aGlzLnN0YXRlLmNoZWNrZWR9IC8+XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0NvbnRlbnRDb2x1bW4gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXQgZGlzcGxheU5hbWUoKSB7cmV0dXJuIFwiQ29udGVudENvbHVtblwiO31cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgLy9sZXQgY29udGVudE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW4pWzBdXHJcbiAgICAgICAgbGV0IHRpdGxlID0gdGhpcy5wcm9wcy50aXRsZSA/IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImgyXCIsIHtjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMiBtYXJnaW4tcmVzZXQgbWFyZ2luLWJvdHRvbS0yMFwifSwgdGhpcy5wcm9wcy50aXRsZSkgOiBudWxsXHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgdGl0bGUsXHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMuY2hpbGRyZW5cclxuICAgICAgICBdXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogY29udGVudE1vZHVsZS5jb250ZW50Q29sdW1uICsgXCIgXCIrY29udGVudE1vZHVsZS5jb250ZW50Q29sdW1uRGVmYXVsdCtcIiBjb250ZW50LWNvbHVtbiBkZWZhdWx0XCIsIHN0eWxlOiB7cGFkZGluZzogXCI2MHB4IDQwcHggMHB4XCJ9fSxcclxuICAgICAgICAgICAgdGl0bGUsXHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMuY2hpbGRyZW5cclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBTZXR0aW5ncyBmcm9tIFwiLi4vbW9kdWxlcy9zZXR0aW5nc1BhbmVsXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4uL21vZHVsZXMvZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4uL21vZHVsZXMvZG9tdG9vbHNcIjtcclxuXHJcbmltcG9ydCBTZXR0aW5nc1RpdGxlIGZyb20gXCIuL3NldHRpbmdzVGl0bGVcIjtcclxuaW1wb3J0IENoZWNrYm94IGZyb20gXCIuL2NoZWNrYm94XCI7XHJcbmltcG9ydCBWMkNfQ3NzRWRpdG9yRGV0YWNoZWQgZnJvbSBcIi4vY3NzRWRpdG9yRGV0YWNoZWRcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19Dc3NFZGl0b3IgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLnByb3BzLmxpbmVzID0gMDtcclxuICAgICAgICBzZWxmLnNldEluaXRpYWxTdGF0ZSgpO1xyXG4gICAgICAgIHNlbGYuYXR0YWNoID0gc2VsZi5hdHRhY2guYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLmRldGFjaGVkRWRpdG9yID0gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19Dc3NFZGl0b3JEZXRhY2hlZCwge2F0dGFjaDogc2VsZi5hdHRhY2h9KTtcclxuICAgICAgICBzZWxmLm9uQ2xpY2sgPSBzZWxmLm9uQ2xpY2suYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLnVwZGF0ZUNzcyA9IHNlbGYudXBkYXRlQ3NzLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi5zYXZlQ3NzID0gc2VsZi5zYXZlQ3NzLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi5kZXRhY2ggPSBzZWxmLmRldGFjaC5iaW5kKHNlbGYpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBkZXRhY2hlZDogdGhpcy5wcm9wcy5kZXRhY2hlZCB8fCBCRFYyLmVkaXRvckRldGFjaGVkXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcclxuICAgICAgICAvLyB0aGlzLnVwZGF0ZUxpbmVDb3VudCgpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yID0gYWNlLmVkaXQoXCJiZC1jdXN0b21jc3MtZWRpdG9yXCIpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFRoZW1lKFwiYWNlL3RoZW1lL21vbm9rYWlcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2Vzc2lvbi5zZXRNb2RlKFwiYWNlL21vZGUvY3NzXCIpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFNob3dQcmludE1hcmdpbihmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0Rm9udFNpemUoMTQpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLm9uKFwiY2hhbmdlXCIsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXSkgcmV0dXJuO1xyXG4gICAgICAgICAgICB0aGlzLnNhdmVDc3MoKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDc3MoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcclxuICAgICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgaWYgKHByZXZTdGF0ZS5kZXRhY2hlZCAmJiAhc2VsZi5zdGF0ZS5kZXRhY2hlZCkge1xyXG4gICAgICAgICAgICBCRFYyLnJlYWN0RG9tLnVubW91bnRDb21wb25lbnRBdE5vZGUoc2VsZi5kZXRhY2hlZFJvb3QpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb2RlTWlycm9yKCkge1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBvcHRpb25zKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLFxyXG4gICAgICAgICAgICBtb2RlOiBcImNzc1wiLFxyXG4gICAgICAgICAgICBpbmRlbnRVbml0OiA0LFxyXG4gICAgICAgICAgICB0aGVtZTogXCJtYXRlcmlhbFwiLFxyXG4gICAgICAgICAgICBzY3JvbGxiYXJTdHlsZTogXCJzaW1wbGVcIlxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNzcygpIHtcclxuICAgICAgICBjb25zdCBfY2NzcyA9IERhdGFTdG9yZS5nZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiKTtcclxuICAgICAgICBsZXQgY2NzcyA9IFwiXCI7XHJcbiAgICAgICAgaWYgKF9jY3NzICYmIF9jY3NzICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIGNjc3MgPSBhdG9iKF9jY3NzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNjc3M7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlTGluZUNvdW50KCkge1xyXG4gICAgICAgIGNvbnN0IGxpbmVDb3VudCA9IHRoaXMucmVmcy5lZGl0b3IudmFsdWUuc3BsaXQoXCJcXG5cIikubGVuZ3RoO1xyXG4gICAgICAgIGlmIChsaW5lQ291bnQgPT0gdGhpcy5wcm9wcy5saW5lcykgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucmVmcy5saW5lcy50ZXh0Q29udGVudCA9IEFycmF5LmZyb20obmV3IEFycmF5KGxpbmVDb3VudCksIChfLCBpKSA9PiBpICsgMSkuam9pbihcIi5cXG5cIikgKyBcIi5cIjtcclxuICAgICAgICB0aGlzLnByb3BzLmxpbmVzID0gbGluZUNvdW50O1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuXHJcbiAgICAgICAgY29uc3Qge2RldGFjaGVkfSA9IHNlbGYuc3RhdGU7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgZGV0YWNoZWQgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtpZDogXCJlZGl0b3ItZGV0YWNoZWRcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwge3RleHQ6IFwiQ3VzdG9tIENTUyBFZGl0b3JcIn0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiaDNcIixcclxuICAgICAgICAgICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiRWRpdG9yIERldGFjaGVkXCJcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmF0dGFjaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICBcIkF0dGFjaFwiXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICFkZXRhY2hlZCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogXCJDdXN0b20gQ1NTIEVkaXRvclwifSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJlZGl0b3Itd3JhcHBlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBcImJkLWN1c3RvbWNzcy1lZGl0b3JcIiwgY2xhc3NOYW1lOiBcImVkaXRvclwiLCByZWY6IFwiZWRpdG9yXCJ9LCBzZWxmLmNzcylcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWF0dGFjaC1jb250cm9sc1wifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidWxcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJjaGVja2JveC1ncm91cFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENoZWNrYm94LCB7aWQ6IFwibGl2ZS11cGRhdGVcIiwgdGV4dDogXCJMaXZlIFVwZGF0ZVwiLCBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgY2hlY2tlZDogc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl19KVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWRldGFjaC1jb250cm9scy1idXR0b25cIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiM3B4IDAgMCAzcHhcIiwgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkICMzZjQxNDZcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJ1cGRhdGVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVwZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiMFwiLCBib3JkZXJMZWZ0OiBcIjFweCBzb2xpZCAjMmQyZDJkXCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjMmQyZDJkXCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwic2F2ZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU2F2ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiMCAzcHggM3B4IDBcIiwgYm9yZGVyTGVmdDogXCIxcHggc29saWQgIzNmNDE0NlwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcImRldGFjaFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiRGV0YWNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtmb250U2l6ZTogXCIxMHB4XCIsIG1hcmdpbkxlZnQ6IFwiNXB4XCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVW5zYXZlZCBjaGFuZ2VzIGFyZSBsb3N0IG9uIGRldGFjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImhlbHAtdGV4dFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiUHJlc3MgXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjb2RlXCIsIHtjbGFzc05hbWU6IFwiaW5saW5lXCJ9LCBcImN0cmxcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIitcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJpbmxpbmVcIn0sIFwiLFwiKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIHdpdGggdGhlIGVkaXRvciBmb2N1c2VkIHRvIGFjY2VzcyB0aGUgZWRpdG9yJ3Mgc2V0dGluZ3MuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKGFyZykge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHN3aXRjaCAoYXJnKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcclxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQ3NzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInNhdmVcIjpcclxuICAgICAgICAgICAgICAgIHNlbGYuc2F2ZUNzcygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJkZXRhY2hcIjpcclxuICAgICAgICAgICAgICAgIHNlbGYuZGV0YWNoKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UoaWQsIGNoZWNrZWQpIHtcclxuICAgICAgICBzd2l0Y2ggKGlkKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJsaXZlLXVwZGF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl0gPSBjaGVja2VkO1xyXG4gICAgICAgICAgICAgICAgU2V0dGluZ3Muc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlQ3NzKCkge1xyXG4gICAgICAgIERPTS5yZW1vdmVTdHlsZShcImN1c3RvbWNzc1wiKTtcclxuICAgICAgICBET00uYWRkU3R5bGUoXCJjdXN0b21jc3NcIiwgdGhpcy5lZGl0b3Iuc2Vzc2lvbi5nZXRWYWx1ZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBzYXZlQ3NzKCkge1xyXG4gICAgICAgIERhdGFTdG9yZS5zZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiLCBidG9hKHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0VmFsdWUoKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGRldGFjaCgpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgZGV0YWNoZWQ6IHRydWVcclxuICAgICAgICB9KTtcclxuICAgICAgICBjb25zdCBkcm9vdCA9IHNlbGYuZGV0YWNoZWRSb290O1xyXG4gICAgICAgIGlmICghZHJvb3QpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJGQUlMRUQgVE8gSU5KRUNUIFJPT1Q6IC5hcHBcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoc2VsZi5kZXRhY2hlZEVkaXRvciwgZHJvb3QpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkZXRhY2hlZFJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgX3Jvb3QgPSBET00ucXVlcnkoXCIjYmQtY3VzdG9tY3NzLWRldGFjaC1jb250YWluZXJcIik7XHJcbiAgICAgICAgaWYgKCFfcm9vdCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5qZWN0RGV0YWNoZWRSb290KCkpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXRhY2hlZFJvb3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfcm9vdDtcclxuICAgIH1cclxuXHJcbiAgICBpbmplY3REZXRhY2hlZFJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgYXBwID0gRE9NLnF1ZXJ5KFwiLmFwcCwgLlwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmFwcCAmJiBlLmxheWVycylbMF0uYXBwLnNwbGl0KFwiIFwiKVswXSk7XHJcbiAgICAgICAgaWYgKCFhcHApIHJldHVybiBmYWxzZTtcclxuICAgICAgICBET00uaW5zZXJ0QWZ0ZXIoRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRhaW5lclwiPmApLCBhcHApO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaCgpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgZGV0YWNoZWQ6IGZhbHNlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IFNldHRpbmdzIGZyb20gXCIuLi9tb2R1bGVzL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi4vbW9kdWxlcy9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi4vbW9kdWxlcy9kb210b29sc1wiO1xyXG5cclxuaW1wb3J0IENoZWNrYm94IGZyb20gXCIuL2NoZWNrYm94XCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfQ3NzRWRpdG9yRGV0YWNoZWQgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLm9uQ2xpY2sgPSBzZWxmLm9uQ2xpY2suYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLnVwZGF0ZUNzcyA9IHNlbGYudXBkYXRlQ3NzLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi5zYXZlQ3NzID0gc2VsZi5zYXZlQ3NzLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi5vbkNoYW5nZSA9IHNlbGYub25DaGFuZ2UuYmluZChzZWxmKTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcclxuICAgICAgICBET00uYWRkQ2xhc3MoRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKSwgXCJiZC1kZXRhY2hlZC1lZGl0b3JcIik7XHJcbiAgICAgICAgQkRWMi5lZGl0b3JEZXRhY2hlZCA9IHRydWU7XHJcbiAgICAgICAgLy8gdGhpcy51cGRhdGVMaW5lQ291bnQoKTtcclxuICAgICAgICB0aGlzLmVkaXRvciA9IGFjZS5lZGl0KFwiYmQtY3VzdG9tY3NzLWVkaXRvci1kZXRhY2hlZFwiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRUaGVtZShcImFjZS90aGVtZS9tb25va2FpXCIpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNlc3Npb24uc2V0TW9kZShcImFjZS9tb2RlL2Nzc1wiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRTaG93UHJpbnRNYXJnaW4oZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNldEZvbnRTaXplKDE0KTtcclxuICAgICAgICB0aGlzLmVkaXRvci5vbihcImNoYW5nZVwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl0pIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy5zYXZlQ3NzKCk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ3NzKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xyXG4gICAgICAgIERPTS5yZW1vdmVDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkLWRldGFjaGVkLWVkaXRvclwiKTtcclxuICAgICAgICBCRFYyLmVkaXRvckRldGFjaGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5lZGl0b3IuZGVzdHJveSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUxpbmVDb3VudCgpIHtcclxuICAgICAgICBjb25zdCBsaW5lQ291bnQgPSB0aGlzLnJlZnMuZWRpdG9yLnZhbHVlLnNwbGl0KFwiXFxuXCIpLmxlbmd0aDtcclxuICAgICAgICBpZiAobGluZUNvdW50ID09IHRoaXMucHJvcHMubGluZXMpIHJldHVybjtcclxuICAgICAgICB0aGlzLnJlZnMubGluZXMudGV4dENvbnRlbnQgPSBBcnJheS5mcm9tKG5ldyBBcnJheShsaW5lQ291bnQpLCAoXywgaSkgPT4gaSArIDEpLmpvaW4oXCIuXFxuXCIpICsgXCIuXCI7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5saW5lcyA9IGxpbmVDb3VudDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgb3B0aW9ucygpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSxcclxuICAgICAgICAgICAgbW9kZTogXCJjc3NcIixcclxuICAgICAgICAgICAgaW5kZW50VW5pdDogNCxcclxuICAgICAgICAgICAgdGhlbWU6IFwibWF0ZXJpYWxcIixcclxuICAgICAgICAgICAgc2Nyb2xsYmFyU3R5bGU6IFwic2ltcGxlXCJcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjc3MoKSB7XHJcbiAgICAgICAgY29uc3QgX2Njc3MgPSBEYXRhU3RvcmUuZ2V0QkREYXRhKFwiYmRjdXN0b21jc3NcIik7XHJcbiAgICAgICAgbGV0IGNjc3MgPSBcIlwiO1xyXG4gICAgICAgIGlmIChfY2NzcyAmJiBfY2NzcyAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICBjY3NzID0gYXRvYihfY2Nzcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjY3NzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByb290KCkge1xyXG4gICAgICAgIGNvbnN0IF9yb290ID0gRE9NLnF1ZXJ5KFwiI2JkLWN1c3RvbWNzcy1kZXRhY2gtY29udGFpbmVyXCIpO1xyXG4gICAgICAgIGlmICghX3Jvb3QpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluamVjdFJvb3QoKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRldGFjaGVkUm9vdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9yb290O1xyXG4gICAgfVxyXG5cclxuICAgIGluamVjdFJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgYXBwID0gRE9NLnF1ZXJ5KFwiLmFwcCwgLlwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmFwcCAmJiBlLmxheWVycylbMF0uYXBwLnNwbGl0KFwiIFwiKVswXSk7XHJcbiAgICAgICAgaWYgKCFhcHApIHJldHVybiBmYWxzZTtcclxuICAgICAgICBET00uaW5zZXJ0QWZ0ZXIoRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRhaW5lclwiPmApLCBhcHApO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJkLWRldGFjaGVkLWNzcy1lZGl0b3JcIiwgaWQ6IFwiYmQtY3VzdG9tY3NzLWRldGFjaC1lZGl0b3JcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWlubmVycGFuZVwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImVkaXRvci13cmFwcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IFwiYmQtY3VzdG9tY3NzLWVkaXRvci1kZXRhY2hlZFwiLCBjbGFzc05hbWU6IFwiZWRpdG9yXCIsIHJlZjogXCJlZGl0b3JcIn0sIHNlbGYuY3NzKVxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtpZDogXCJiZC1jdXN0b21jc3MtYXR0YWNoLWNvbnRyb2xzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ1bFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImNoZWNrYm94LWdyb3VwXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hlY2tib3gsIHtpZDogXCJsaXZlLXVwZGF0ZVwiLCB0ZXh0OiBcIkxpdmUgVXBkYXRlXCIsIG9uQ2hhbmdlOiBzZWxmLm9uQ2hhbmdlLCBjaGVja2VkOiBzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXX0pXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtpZDogXCJiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRyb2xzLWJ1dHRvblwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2JvcmRlclJhZGl1czogXCIzcHggMCAwIDNweFwiLCBib3JkZXJSaWdodDogXCIxcHggc29saWQgIzNmNDE0NlwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcInVwZGF0ZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVXBkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2JvcmRlclJhZGl1czogXCIwXCIsIGJvcmRlckxlZnQ6IFwiMXB4IHNvbGlkICMyZDJkMmRcIiwgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkICMyZDJkMmRcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJzYXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJTYXZlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2JvcmRlclJhZGl1czogXCIwIDNweCAzcHggMFwiLCBib3JkZXJMZWZ0OiBcIjFweCBzb2xpZCAjM2Y0MTQ2XCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwiYXR0YWNoXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJBdHRhY2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInNwYW5cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2ZvbnRTaXplOiBcIjEwcHhcIiwgbWFyZ2luTGVmdDogXCI1cHhcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVbnNhdmVkIGNoYW5nZXMgYXJlIGxvc3Qgb24gYXR0YWNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UoaWQsIGNoZWNrZWQpIHtcclxuICAgICAgICBzd2l0Y2ggKGlkKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJsaXZlLXVwZGF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl0gPSBjaGVja2VkO1xyXG4gICAgICAgICAgICAgICAgU2V0dGluZ3Muc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljayhpZCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHN3aXRjaCAoaWQpIHtcclxuICAgICAgICAgICAgY2FzZSBcImF0dGFjaFwiOlxyXG4gICAgICAgICAgICAgICAgaWYgKERPTS5xdWVyeShcIiNlZGl0b3ItZGV0YWNoZWRcIikpIHNlbGYucHJvcHMuYXR0YWNoKCk7XHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0RG9tLnVubW91bnRDb21wb25lbnRBdE5vZGUoc2VsZi5yb290KTtcclxuICAgICAgICAgICAgICAgIHNlbGYucm9vdC5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwidXBkYXRlXCI6XHJcbiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZUNzcygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJzYXZlXCI6XHJcbiAgICAgICAgICAgICAgICBzZWxmLnNhdmVDc3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVDc3MoKSB7XHJcbiAgICAgICAgRE9NLnJlbW92ZVN0eWxlKFwiY3VzdG9tY3NzXCIpO1xyXG4gICAgICAgIERPTS5hZGRTdHlsZShcImN1c3RvbWNzc1wiLCB0aGlzLmVkaXRvci5zZXNzaW9uLmdldFZhbHVlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHNhdmVDc3MoKSB7XHJcbiAgICAgICAgRGF0YVN0b3JlLnNldEJERGF0YShcImJkY3VzdG9tY3NzXCIsIGJ0b2EodGhpcy5lZGl0b3Iuc2Vzc2lvbi5nZXRWYWx1ZSgpKSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQkRFcnJvckJvdW5kYXJ5IGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgIHRoaXMuc3RhdGUgPSB7aGFzRXJyb3I6IGZhbHNlfTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRDYXRjaCgpIHtcclxuICAgICAgdGhpcy5zZXRTdGF0ZSh7aGFzRXJyb3I6IHRydWV9KTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgIGlmICh0aGlzLnN0YXRlLmhhc0Vycm9yKSByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwicmVhY3QtZXJyb3JcIn0sIFwiQ29tcG9uZW50IEVycm9yXCIpOyAgXHJcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuOyBcclxuICAgIH1cclxufVxyXG5cclxuY29uc3Qgb3JpZ2luYWxSZW5kZXIgPSBCREVycm9yQm91bmRhcnkucHJvdG90eXBlLnJlbmRlcjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJERXJyb3JCb3VuZGFyeS5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHtcclxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcclxuICAgIHNldDogZnVuY3Rpb24oKSB7Y29uc29sZS53YXJuKFwiQWRkb24gcG9saWN5IGZvciBwbHVnaW5zICM1IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvd2lraS9BZGRvbi1Qb2xpY2llcyNwbHVnaW5zXCIpO30sXHJcbiAgICBnZXQ6ICgpID0+IG9yaWdpbmFsUmVuZGVyXHJcbn0pOyAiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGVsZXRlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IFwiMjRweFwiO1xyXG4gICAgICAgIHJldHVybiA8c3ZnIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gZmlsbD1cIiNGRkZGRkZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgc3R5bGU9e3t3aWR0aDogc2l6ZSwgaGVpZ2h0OiBzaXplfX0gb25DbGljaz17dGhpcy5wcm9wcy5vbkNsaWNrfT5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwibm9uZVwiIGQ9XCJNMCAwaDI0djI0SDBWMHpcIi8+PHBhdGggZD1cIk02IDE5YzAgMS4xLjkgMiAyIDJoOGMxLjEgMCAyLS45IDItMlY3SDZ2MTJ6bTIuNDYtNy4xMmwxLjQxLTEuNDFMMTIgMTIuNTlsMi4xMi0yLjEyIDEuNDEgMS40MUwxMy40MSAxNGwyLjEyIDIuMTItMS40MSAxLjQxTDEyIDE1LjQxbC0yLjEyIDIuMTItMS40MS0xLjQxTDEwLjU5IDE0bC0yLjEzLTIuMTJ6TTE1LjUgNGwtMS0xaC01bC0xIDFINXYyaDE0VjR6XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCJub25lXCIgZD1cIk0wIDBoMjR2MjRIMHpcIi8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz47XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRG93bkFycm93IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IFwiMTZweFwiO1xyXG4gICAgICAgIHJldHVybiA8c3ZnIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gZmlsbD1cIiNGRkZGRkZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgc3R5bGU9e3t3aWR0aDogc2l6ZSwgaGVpZ2h0OiBzaXplfX0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjEyIDkuMjlMMTIgMTMuMTdsMy44OC0zLjg4Yy4zOS0uMzkgMS4wMi0uMzkgMS40MSAwIC4zOS4zOS4zOSAxLjAyIDAgMS40MWwtNC41OSA0LjU5Yy0uMzkuMzktMS4wMi4zOS0xLjQxIDBMNi43IDEwLjdjLS4zOS0uMzktLjM5LTEuMDIgMC0xLjQxLjM5LS4zOCAxLjAzLS4zOSAxLjQyIDB6XCIvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVkaXQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIyNHB4XCI7XHJcbiAgICAgICAgcmV0dXJuIDxzdmcgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIiNGRkZGRkZcIiBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fSBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9PlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDE3LjI1VjIxaDMuNzVMMTcuODEgOS45NGwtMy43NS0zLjc1TDMgMTcuMjV6TTIwLjcxIDcuMDRjLjM5LS4zOS4zOS0xLjAyIDAtMS40MWwtMi4zNC0yLjM0Yy0uMzktLjM5LTEuMDItLjM5LTEuNDEgMGwtMS44MyAxLjgzIDMuNzUgMy43NSAxLjgzLTEuODN6XCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCIgZmlsbD1cIm5vbmVcIiAvPlxyXG4gICAgICAgICAgICAgICA8L3N2Zz47XHJcbiAgICB9XHJcbn0iLCJ7LyogPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiIHdpZHRoPVwiMThweFwiIGhlaWdodD1cIjE4cHhcIj5cclxuICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCIgZmlsbD1cIm5vbmVcIi8+XHJcbiAgICA8cGF0aCBkPVwiTTEzIDNjLTQuOTcgMC05IDQuMDMtOSA5SDFsMy44OSAzLjg5LjA3LjE0TDkgMTJINmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuOTMgMC0zLjY4LS43OS00Ljk0LTIuMDZsLTEuNDIgMS40MkM4LjI3IDE5Ljk5IDEwLjUxIDIxIDEzIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0tMSA1djVsNC4yOCAyLjU0LjcyLTEuMjEtMy41LTIuMDhWOEgxMnpcIi8+XHJcbjwvc3ZnPiAqL31cclxuXHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIaXN0b3J5IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IFwiMThweFwiO1xyXG4gICAgICAgIHJldHVybiA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwiI0ZGRkZGRlwiIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gc3R5bGU9e3t3aWR0aDogc2l6ZSwgaGVpZ2h0OiBzaXplfX0gb25DbGljaz17dGhpcy5wcm9wcy5vbkNsaWNrfT5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCIgZmlsbD1cIm5vbmVcIi8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEzIDNjLTQuOTcgMC05IDQuMDMtOSA5SDFsMy44OSAzLjg5LjA3LjE0TDkgMTJINmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuOTMgMC0zLjY4LS43OS00Ljk0LTIuMDZsLTEuNDIgMS40MkM4LjI3IDE5Ljk5IDEwLjUxIDIxIDEzIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0tMSA1djVsNC4yOCAyLjU0LjcyLTEuMjEtMy41LTIuMDhWOEgxMnpcIi8+XHJcbiAgICAgICAgICAgICAgIDwvc3ZnPjtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWFyY2ggZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIxNnB4XCI7XHJcbiAgICAgICAgcmV0dXJuIDxzdmcgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSBmaWxsPVwiI0ZGRkZGRlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fT5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwibm9uZVwiIGQ9XCJNMCAwaDI0djI0SDBWMHpcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNS41IDE0aC0uNzlsLS4yOC0uMjdDMTUuNDEgMTIuNTkgMTYgMTEuMTEgMTYgOS41IDE2IDUuOTEgMTMuMDkgMyA5LjUgM1MzIDUuOTEgMyA5LjUgNS45MSAxNiA5LjUgMTZjMS42MSAwIDMuMDktLjU5IDQuMjMtMS41N2wuMjcuMjh2Ljc5bDUgNC45OUwyMC40OSAxOWwtNC45OS01em0tNiAwQzcuMDEgMTQgNSAxMS45OSA1IDkuNVM3LjAxIDUgOS41IDUgMTQgNy4wMSAxNCA5LjUgMTEuOTkgMTQgOS41IDE0elwiLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPjtcclxuICAgIH1cclxufSIsImxldCBtYXJnaW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Ub3A2MClbMF1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hcmdpblRvcCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBpZighbWFyZ2luTW9kdWxlKW1hcmdpbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpblRvcDYwKVswXVxyXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17bWFyZ2luTW9kdWxlLm1hcmdpblRvcDYwfT48L2Rpdj5cclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBWMkNfU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi9zZXR0aW5nc1RpdGxlXCI7XHJcbmltcG9ydCBWMkNfU2V0dGluZ3NHcm91cCBmcm9tIFwiLi9zZXR0aW5nc0dyb3VwXCI7XHJcbmltcG9ydCBkYXRhU3RvcmUgZnJvbSBcIi4uL21vZHVsZXMvZGF0YVN0b3JlXCI7XHJcbmltcG9ydCB7IGRlZmF1bHRSUEMsIHNldHRpbmdzUlBDIH0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDdXN0b21SaWNoUHJlc2VuY2UgZnJvbSBcIi4uL21vZHVsZXMvQ3VzdG9tUmljaFByZXNlbmNlXCJcclxuaW1wb3J0IHRpbWVzdGFtcFJlbmRlciBmcm9tIFwiLi90aW1lc3RhbXBSZW5kZXJcIlxyXG5pbXBvcnQgeyByZW1vdGUgfSBmcm9tIFwiZWxlY3Ryb25cIjtcclxuaW1wb3J0IE1hcmdpblRvcCBmcm9tIFwiLi9tYXJnaW50b3BcIjtcclxuXHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5sZXQgVjJDX1ByZXNlbmNlU2V0dGluZ3NNb2R1bGVzXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19QcmVzZW5jZVNldHRpbmdzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG5cclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBkYXRhOiBkYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpIHx8IGRlZmF1bHRSUEMsXHJcbiAgICAgICAgICAgIGFzc2V0czogW11cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJldmlldyA9IG51bGxcclxuICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSBmYWxzZVxyXG4gICAgICAgIGlmKHRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZCl7XHJcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hBc3NldHMoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5hc3NldENvbXBvbmVudHMgPSBuZXcgU2V0KClcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVXaGVuRmV0Y2hlZChjb21wKXtcclxuICAgICAgICB0aGlzLmFzc2V0Q29tcG9uZW50cy5hZGQoY29tcClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtJbnB1dFRleHR9IHNldHRpbmcgXHJcbiAgICAgKi9cclxuICAgIG9uQ2hhbmdlKHNldHRpbmcsIHZhbHVlKXtcclxuICAgICAgICBsZXQgZGVmYXVsdFNldHRpbmcgPSBSUENQcm9wcy5maW5kKGUgPT4gZS5pZCA9PT0gc2V0dGluZy5wcm9wcy5pZClcclxuXHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGRhdGE6IE9iamVjdC5hc3NpZ24oc2V0dGluZ3NSUEMsIHRoaXMuc3RhdGUuZGF0YSwge1xyXG4gICAgICAgICAgICAgICAgW2RlZmF1bHRTZXR0aW5nLmlkXTogISF2YWx1ZSA/IHZhbHVlIDogbnVsbFxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgYXNzZXRzOiB0aGlzLnN0YXRlLmFzc2V0c1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgaWYoc2V0dGluZy5wcm9wcy5pZCA9PT0gXCJhcHBsaWNhdGlvbl9pZFwiKXtcclxuICAgICAgICAgICAgdGhpcy5mZXRjaEFzc2V0cygpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwicnBjXCIsIHNldHRpbmdzUlBDKTtcclxuICAgICAgICB0aGlzLnByZXZpZXcuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgIEN1c3RvbVJpY2hQcmVzZW5jZS5zZXQoc2V0dGluZ3NSUEMpXHJcbiAgICB9XHJcblxyXG4gICAgZmV0Y2hBc3NldHMoKXtcclxuICAgICAgICBpZih0aGlzLmlzZmV0Y2hpbmcgPT09IHRydWUpe1xyXG4gICAgICAgICAgICBsZXQgYXBwID0gdGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkICE9PSBhcHApe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaEFzc2V0cygpXHJcbiAgICAgICAgICAgIH0sIDUwMDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZighdGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkKXtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLnN0YXRlLmRhdGEsXHJcbiAgICAgICAgICAgICAgICBhc3NldHM6IFtdXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgICAgICB0aGlzLmFzc2V0Q29tcG9uZW50cy5mb3JFYWNoKGUgPT4gZS5mb3JjZVVwZGF0ZSgpKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc2ZldGNoaW5nID0gdHJ1ZVxyXG4gICAgICAgIEN1c3RvbVJpY2hQcmVzZW5jZS5mZXRjaEFzc2V0cyh0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQpXHJcbiAgICAgICAgLnRoZW4oYXNzZXRzID0+IHtcclxuICAgICAgICAgICAgdGhpcy5pc2ZldGNoaW5nID0gZmFsc2VcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLnN0YXRlLmRhdGEsXHJcbiAgICAgICAgICAgICAgICBhc3NldHM6IE9iamVjdC5rZXlzKGFzc2V0cykubWFwKGsgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBhc3NldCA9IGFzc2V0c1trXVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBhc3NldC5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogYXNzZXQubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogYXNzZXQudHlwZVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgICAgICB0aGlzLmFzc2V0Q29tcG9uZW50cy5mb3JFYWNoKGUgPT4gZS5mb3JjZVVwZGF0ZSgpKVxyXG4gICAgICAgIH0pLmNhdGNoKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5pc2ZldGNoaW5nID0gZmFsc2VcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLnN0YXRlLmRhdGEsXHJcbiAgICAgICAgICAgICAgICBhc3NldHM6IFtdXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgICAgICB0aGlzLmFzc2V0Q29tcG9uZW50cy5mb3JFYWNoKGUgPT4gZS5mb3JjZVVwZGF0ZSgpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlUHJldmlldyhkYXRhKXtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgZGF0YVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gVjJDX1ByZXNlbmNlU2V0dGluZ3NNb2R1bGVzIHx8IChWMkNfUHJlc2VuY2VTZXR0aW5nc01vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXVxyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZVxyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICA8VjJDX1NldHRpbmdzR3JvdXAgdGl0bGU9XCJSaWNoUHJlc2VuY2UgU2V0dGluZ3NcIiBzZXR0aW5ncz17dGhpcy5wcm9wcy5zZXR0aW5nc30gb25DaGFuZ2U9e3RoaXMucHJvcHMub25DaGFuZ2V9Lz4sXHJcbiAgICAgICAgICAgIDxNYXJnaW5Ub3AgLz4sXHJcbiAgICAgICAgICAgIDxWMkNfU2V0dGluZ3NUaXRsZSB0ZXh0PVwiUmljaFByZXNlbmNlXCIvPixcclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIHsvKiogb3B0aW9ucyAqL31cclxuICAgICAgICAgICAgICAgIHt0aGlzLm9wdGlvbnNDb21wb25lbnRzfVxyXG4gICAgICAgICAgICA8L2Rpdj4sXHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8TWFyZ2luVG9wIC8+XHJcbiAgICAgICAgICAgICAgICA8VjJDX1NldHRpbmdzVGl0bGUgdGV4dD1cIlByZXZpZXdcIi8+XHJcbiAgICAgICAgICAgICAgICB7LyoqIHByZXZpZXcgKi99XHJcbiAgICAgICAgICAgICAgICA8UnBjUHJldmlldyBzZXR0aW5ncz17dGhpc30vPlxyXG4gICAgICAgICAgICA8L2Rpdj4sXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXttYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PjwvZGl2PixcclxuICAgICAgICAgICAgPGJ1dHRvbiBzdHlsZT17e29wYWNpdHk6IDAuMDF9fSBvbkNsaWNrPXt3aW5kb3cub2hnb2RvaGZ1Y2t9PlxyXG4gICAgICAgICAgICAgICAgT2ggZ29kIE9oIGZ1Y2tcclxuICAgICAgICAgICAgPC9idXR0b24+LFxyXG4gICAgICAgICAgICA8YnV0dG9uIHN0eWxlPXt7b3BhY2l0eTogMC4wMX19IG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlbW90ZS5zaGVsbC5vcGVuRXh0ZXJuYWwoXCJodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUxrWWE3cnBzX2c0XCIpXHJcbiAgICAgICAgICAgIH19PlxyXG4gICAgICAgICAgICAgICAgU2VlID8gSSBwdWxsZWQgYSBsaXRsZSBzbmVha3kgb24geWFcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBvcHRpb25zQ29tcG9uZW50cygpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9vcHRpb25zQ29tcG9uZW50cyB8fCAodGhpcy5fb3B0aW9uc0NvbXBvbmVudHMgPSBSUENQcm9wcy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgIGlmKGUudHlwZSA9PT0gXCJ0ZXh0XCIpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxJbnB1dFRleHQgc2V0dGluZz17ZX0gbWFuYWdlcj17dGhpc30gaWQ9e2UuaWR9Lz5cclxuICAgICAgICAgICAgfWVsc2UgaWYoZS50eXBlID09PSBcIm51bWJlclwiKXtcclxuICAgICAgICAgICAgICAgIGxldCBhcnJheSA9IFs8SW5wdXROdW1iZXIgc2V0dGluZz17ZX0gbWFuYWdlcj17dGhpc30gaWQ9e2UuaWR9Lz5dLypcclxuICAgICAgICAgICAgICAgIGlmKGUuaWQgPT09IFwidGltZXN0YW1wcy5zdGFydFwiKXtcclxuICAgICAgICAgICAgICAgICAgICBhcnJheS51bnNoaWZ0KDxEaXNjb3JkQnV0dG9uIHRpdGxlPVwiQ29weSBDdXJyZW50IFRpbWVzdGFtcFwiIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgRGlzY29yZE5hdGl2ZS5jbGlwYm9hcmQuY29weShEYXRlLm5vdygpK1wiXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgfX0gLz4pXHJcbiAgICAgICAgICAgICAgICB9Ki9cclxuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVxyXG4gICAgICAgICAgICB9ZWxzZSBpZihlLnR5cGUgPT09IFwiY2hvaWNlXCIpe1xyXG4gICAgICAgICAgICAgICAgaWYoW1wiYXNzZXRzLnNtYWxsXCIsIFwiYXNzZXRzLmxhcmdlXCJdLmluY2x1ZGVzKGUuaWQpKXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPElucHV0Q2hvaWNlIHNldHRpbmc9e2V9IG1hbmFnZXI9e3RoaXN9IGlkPXtlLmlkfSBjaG9pY2VzPXtbe3ZhbHVlOiBcIm5vbmVcIiwgbGFiZWw6IFwiTm8gYXNzZXRzXCJ9XS5jb25jYXQodGhpcy5zdGF0ZS5hc3NldHMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFwiYXNzZXQtXCIrZS5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBlLm5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pKX0vPlxyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiVW5rbm93biBjaG9pY2UuXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pKVxyXG4gICAgfVxyXG59XHJcbmNvbnN0IFJQQ1Byb3BzID0gW1xyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIkFwcGxpY2F0aW9uIElEXCIsXHJcbiAgICAgICAgaWQ6IFwiYXBwbGljYXRpb25faWRcIixcclxuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxyXG4gICAgICAgIHBsYWNlaG9sZGVyOiBcIjcxMTQxNjk1NzcxODc1NzQxOFwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIk5hbWVcIixcclxuICAgICAgICBpZDogXCJuYW1lXCIsXHJcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXHJcbiAgICAgICAgcGxhY2Vob2xkZXI6IFwiTGlnaHRjb3JkXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiRGV0YWlsc1wiLFxyXG4gICAgICAgIGlkOiBcImRldGFpbHNcIixcclxuICAgICAgICB0eXBlOiBcInRleHRcIixcclxuICAgICAgICBwbGFjZWhvbGRlcjogXCJCcm93c2luZyBEaXNjb3JkXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiU3RhdGVcIixcclxuICAgICAgICBpZDogXCJzdGF0ZVwiLFxyXG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxyXG4gICAgICAgIHBsYWNlaG9sZGVyOiBcIkxpZ2h0Y29yZCBDbGllbnRcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJUaW1lc3RhbXAgU3RhcnRcIixcclxuICAgICAgICBpZDogXCJ0aW1lc3RhbXBzLnN0YXJ0XCIsXHJcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcclxuICAgICAgICBnZXQgcGxhY2Vob2xkZXIoKXtcclxuICAgICAgICAgICAgcmV0dXJuIERhdGUubm93KClcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIkxhcmdlQXNzZXRcIixcclxuICAgICAgICBpZDogXCJhc3NldHMubGFyZ2VcIixcclxuICAgICAgICB0eXBlOiBcImNob2ljZVwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIlNtYWxsQXNzZXRcIixcclxuICAgICAgICBpZDogXCJhc3NldHMuc21hbGxcIixcclxuICAgICAgICB0eXBlOiBcImNob2ljZVwiXHJcbiAgICB9LFxyXG5dXHJcblxyXG5sZXQgaW5wdXRUZXh0TW9kdWxlc1xyXG5jbGFzcyBJbnB1dFRleHQgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgaWYoaW5wdXRUZXh0TW9kdWxlcyAmJiBpbnB1dFRleHRNb2R1bGVzWzBdKXJldHVybiBpbnB1dFRleHRNb2R1bGVzXHJcbiAgICAgICAgcmV0dXJuIGlucHV0VGV4dE1vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnJlbW92ZUtleWJpbmQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmlucHV0TWluaSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUxNiAmJiBlLnNpemUyMClbMF0sXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IHRoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5kYXRhW3NldHRpbmcuaWRdXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmlucHV0ID0gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLlRleHRJbnB1dCBwbGFjZWhvbGRlcj17c2V0dGluZy5wbGFjZWhvbGRlcn0gbmFtZT17c2V0dGluZy5pZH0gdmFsdWU9e3RoaXMuc3RhdGUuZGF0YX0gb25DaGFuZ2U9eyh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IHZhbHVlXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGlmKCF0aGlzLmxhc3RFZGl0ZWQgfHwgdGhpcy5sYXN0RWRpdGVkIDwgRGF0ZS5ub3coKSAtIDUwMCl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgdmFsdWUpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXHJcbiAgICAgICAgICAgIH1lbHNlIGlmKCF0aGlzLmlzVGltaW5nKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNUaW1pbmcgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgdGhpcy5zdGF0ZS5kYXRhKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUaW1pbmcgPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxyXG4gICAgICAgICAgICAgICAgfSwgNTAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH19IHR5cGU9XCJ0ZXh0XCIvPlxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXHJcblxyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIHJvd01vZHVsZSxcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlLFxyXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGUyLFxyXG4gICAgICAgICAgICBjb2xvck1vZHVsZSxcclxuICAgICAgICAgICAgc2l6ZU1vZHVsZSxcclxuICAgICAgICAgICAgZmxleE1vZHVsZSxcclxuICAgICAgICAgICAgaW5wdXRNb2R1bGUsXHJcbiAgICAgICAgICAgIHNpemVNb2R1bGUyLFxyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17cm93TW9kdWxlLnJvdytcIiBcIittYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YH0+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgIHtzZXR0aW5nLnRpdGxlfVxyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIHt0aGlzLmlucHV0fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPERpdmlkZXIvPlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxubGV0IElucHV0TnVtYmVyTW9kdWxlc1xyXG5jbGFzcyBJbnB1dE51bWJlciBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gSW5wdXROdW1iZXJNb2R1bGVzIHx8IChJbnB1dE51bWJlck1vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnJlbW92ZUtleWJpbmQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmlucHV0TWluaSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUxNiAmJiBlLnNpemUyMClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yVHJhbnNwYXJlbnQpWzBdLFxyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xyXG4gICAgICAgIHN1cGVyKHByb3BzKVxyXG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgZGF0YTogdGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmRhdGFbc2V0dGluZy5pZF1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5wdXQgPSA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuVGV4dElucHV0IHBsYWNlaG9sZGVyPXtzZXR0aW5nLnBsYWNlaG9sZGVyfSBuYW1lPXtzZXR0aW5nLmlkfSB2YWx1ZT17dGhpcy5zdGF0ZS5kYXRhfSB0eXBlPVwibnVtYmVyXCIgb25DaGFuZ2U9eyh2YWx1ZSwgbmFtZSwgaW5wdXQpID0+IHtcclxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9bXlxcZF0rL2csIFwiXCIpXHJcbiAgICAgICAgICAgIGlmKHZhbHVlID09IHRoaXMuc3RhdGUuZGF0YSl7XHJcbiAgICAgICAgICAgICAgICBpbnB1dC5zZXRWYWx1ZSh2YWx1ZSlcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZighdGhpcy5sYXN0RWRpdGVkIHx8IHRoaXMubGFzdEVkaXRlZCA8IERhdGUubm93KCkgLSA1MDApe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxyXG4gICAgICAgICAgICB9ZWxzZSBpZighdGhpcy5pc1RpbWluZyl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHRoaXMuc3RhdGUuZGF0YSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdEVkaXRlZCA9IERhdGUubm93KClcclxuICAgICAgICAgICAgICAgIH0sIDUwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB2YWx1ZVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH19IHR5cGU9XCJ0ZXh0XCIvPlxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXHJcblxyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIHJvd01vZHVsZSxcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlLFxyXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGUyLFxyXG4gICAgICAgICAgICBjb2xvck1vZHVsZSxcclxuICAgICAgICAgICAgc2l6ZU1vZHVsZSxcclxuICAgICAgICAgICAgZmxleE1vZHVsZSxcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcblxyXG5cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtyb3dNb2R1bGUucm93K1wiIFwiK21hcmdpbk1vZHVsZS5tYXJnaW5Cb3R0b20yMH0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtyb3dNb2R1bGUuaXRlbX0gJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH1gfT5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XHJcbiAgICAgICAgICAgICAgICAgICAge3NldHRpbmcudGl0bGV9XHJcbiAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAge3RoaXMuaW5wdXR9XHJcbiAgICAgICAgICAgICAgICB7c2V0dGluZy5pZCA9PT0gXCJ0aW1lc3RhbXBzLnN0YXJ0XCIgPyBcclxuICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgRGlzY29yZE5hdGl2ZS5jbGlwYm9hcmQuY29weShEYXRlLm5vdygpK1wiXCIpXHJcbiAgICAgICAgICAgICAgICB9fSBjb2xvcj1cImJyYW5kXCI+Q29weSBjdXJyZW50IHRpbWVzdGFtcDwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24+IDogbnVsbH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxEaXZpZGVyLz5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCBJbnB1dENob2ljZU1vZHVsZXNcclxuY2xhc3MgSW5wdXRDaG9pY2UgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IHRoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5kYXRhW3NldHRpbmcuaWRdID8gXCJhc3NldC1cIit0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuZGF0YVtzZXR0aW5nLmlkXSA6IFwibm9uZVwiXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucHJvcHMubWFuYWdlci51cGRhdGVXaGVuRmV0Y2hlZCh0aGlzKVxyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKGRhdGEpe1xyXG4gICAgICAgIGxldCB2YWx1ZSA9IGRhdGEudmFsdWVcclxuXHJcbiAgICAgICAgaWYoIXRoaXMubGFzdEVkaXRlZCB8fCB0aGlzLmxhc3RFZGl0ZWQgPCBEYXRlLm5vdygpIC0gNTAwKXtcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHZhbHVlID09PSBcIm5vbmVcIiA/IG51bGwgOiB2YWx1ZS5yZXBsYWNlKFwiYXNzZXQtXCIsIFwiXCIpKVxyXG4gICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXHJcbiAgICAgICAgfWVsc2UgaWYoIXRoaXMuaXNUaW1pbmcpe1xyXG4gICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgdGhpcy5zdGF0ZS5kYXRhID09PSBcIm5vbmVcIiA/IG51bGwgOiB0aGlzLnN0YXRlLmRhdGEucmVwbGFjZShcImFzc2V0LVwiLCBcIlwiKSlcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNUaW1pbmcgPSBudWxsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXHJcbiAgICAgICAgICAgIH0sIDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBkYXRhOiB2YWx1ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpXHJcbiAgICB9XHJcbiAgICBcclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIElucHV0Q2hvaWNlTW9kdWxlcyB8fCAoSW5wdXRDaG9pY2VNb2R1bGVzID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdXHJcbiAgICAgICAgXSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG5cclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICByb3dNb2R1bGUsXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZSxcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlMixcclxuICAgICAgICAgICAgY29sb3JNb2R1bGUsXHJcbiAgICAgICAgICAgIHNpemVNb2R1bGUsXHJcbiAgICAgICAgICAgIGZsZXhNb2R1bGVcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuYXNzZXRzLm1hcChlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBcImFzc2V0LVwiK2UuaWQsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogZS5uYW1lXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICBvcHRpb25zLnVuc2hpZnQoe1xyXG4gICAgICAgICAgICB2YWx1ZTogXCJub25lXCIsXHJcbiAgICAgICAgICAgIGxhYmVsOiBcIk5vIGFzc2V0c1wiXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17cm93TW9kdWxlLnJvdytcIiBcIittYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YH0+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgIHtzZXR0aW5nLnRpdGxlfVxyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5Ecm9wZG93biB2YWx1ZT17dGhpcy5zdGF0ZS5kYXRhfSBvcHRpb25zPXtvcHRpb25zfSBvbkNoYW5nZT17dGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpfSAvPlxyXG4gICAgICAgICAgICAgICAgey8qPFNlbGVjdCB2YWx1ZT17dGhpcy5zdGF0ZS5kYXRhfSBvbkNoYW5nZT17dGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpfSBvcHRpb25zPXtvcHRpb25zfS8+Ki99XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8RGl2aWRlci8+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgRGl2aWRlck1vZHVsZXMgPSBbXVxyXG5jbGFzcyBEaXZpZGVyIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XHJcbiAgICBnZXQgbW9kdWxlcygpe1xyXG4gICAgICAgIHJldHVybiBEaXZpZGVyTW9kdWxlcyYmRGl2aWRlck1vZHVsZXNbMF0gPyBEaXZpZGVyTW9kdWxlcyA6IChEaXZpZGVyTW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGl2aWRlciAmJiBPYmplY3Qua2V5cyhlKS5sZW5ndGggPT09IDEpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyRGVmYXVsdClbMF1cclxuICAgICAgICBdKVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGRpdmlkZXIsXHJcbiAgICAgICAgICAgIGRpdmlkZXJEZWZhdWx0XHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG5cclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzcz17YCR7ZGl2aWRlci5kaXZpZGVyfSAke2RpdmlkZXJEZWZhdWx0LmRpdmlkZXJEZWZhdWx0fWB9PjwvZGl2PlxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBEaXNjb3JkQnV0dG9uIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCByb3dNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXVxyXG4gICAgICAgIGxldCBtYXJnaW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF1cclxuICAgICAgICBsZXQgZmxleE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLl9ob3Jpem9udGFsKVswXVxyXG5cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtyb3dNb2R1bGUucm93K1wiIFwiK21hcmdpbk1vZHVsZS5tYXJnaW5Cb3R0b20yMH0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtyb3dNb2R1bGUuaXRlbX0gJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH1gfT5cclxuICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9IGNvbG9yPVwiYnJhbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy50aXRsZX1cclxuICAgICAgICAgICAgICAgIDwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgUnBjUHJldmlldyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBhY3RpdmU6IFwicHJvZmlsZVwiXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudGFicyA9IFtdXHJcblxyXG4gICAgICAgIHRoaXMucHJvcHMuc2V0dGluZ3MucHJldmlldyA9IHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VUYWIodGFiKXtcclxuICAgICAgICBsZXQgYW5jaWVudFRhYiA9IHRoaXMuc3RhdGUuYWN0aXZlXHJcbiAgICAgICAgaWYoYW5jaWVudFRhYiA9PT0gdGFiLnByb3BzLmlkKXJldHVyblxyXG5cclxuICAgICAgICB0aGlzLnRhYnMuZm9yRWFjaChlID0+IHtcclxuICAgICAgICAgICAgZS5zZXRBY3RpdmUoZmFsc2UpXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0YWIuc2V0QWN0aXZlKHRydWUpXHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGFjdGl2ZTogdGFiLnByb3BzLmlkXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgcHJldmlldyA9IG5ldyB0aGlzLnByZXZpZXcoe1xyXG4gICAgICAgICAgICBwcmV2aWV3OiB0aGlzXHJcbiAgICAgICAgfSlcclxuICAgICAgICBwcmV2aWV3LnNldFN0YXRlKHRoaXMuc3RhdGUucnBjKVxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9XCJsYy10YWJXcmFwcGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGMtdGFibmF2XCIgc3R5bGU9e3tmbGV4OiBcIjAgMSBhdXRvXCJ9fT5cclxuICAgICAgICAgICAgICAgIDxUYWIgcHJldmlldz17dGhpc30gdGl0bGU9XCJGdWxsIFByb2ZpbGVcIiBpZD1cInByb2ZpbGVcIi8+XHJcbiAgICAgICAgICAgICAgICA8VGFiIHByZXZpZXc9e3RoaXN9IHRpdGxlPVwiVXNlciBQb3BvdXRcIiBpZD1cInBvcG91dFwiLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIHtwcmV2aWV3LnJlbmRlcigpfVxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH0gICBcclxuXHJcbiAgICBpc0FjdGl2ZSh0YWIpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmFjdGl2ZSA9PT0gdGFiXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByZXZpZXcoKXtcclxuICAgICAgICBpZih0aGlzLnN0YXRlLmFjdGl2ZSA9PT0gXCJwcm9maWxlXCIpcmV0dXJuIFByb2ZpbGVcclxuICAgICAgICByZXR1cm4gUG9wb3V0XHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIFRhYiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpXHJcblxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGFjdGl2ZTogcHJvcHMucHJldmlldy5pc0FjdGl2ZShwcm9wcy5pZClcclxuICAgICAgICB9XHJcbiAgICAgICAgcHJvcHMucHJldmlldy50YWJzLnB1c2godGhpcylcclxuICAgIH1cclxuXHJcbiAgICBzZXRBY3RpdmUoaXNBY3RpdmUpe1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBhY3RpdmU6ICEhaXNBY3RpdmVcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBjbGFzc05hbWUgPSBgbGMtbmF2SXRlbWBcclxuICAgICAgICBpZih0aGlzLnN0YXRlLmFjdGl2ZSl7XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZSArPSBgIGxjLW5hdkl0ZW1BY3RpdmVgXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZSArPSBgIGxjLW5hdkl0ZW1JbmFjdGl2ZWBcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17Y2xhc3NOYW1lfSBvbkNsaWNrPXsoKT0+e1xyXG4gICAgICAgICAgICB0aGlzLnByb3BzLnByZXZpZXcuY2hhbmdlVGFiKHRoaXMpXHJcbiAgICAgICAgfX0+XHJcbiAgICAgICAgICAgIHt0aGlzLnByb3BzLnRpdGxlfVxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxubGV0IHBvcG91dE1vZHVsZVxyXG5jbGFzcyBQb3BvdXQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQgeyAvLyBUT0RPOiBQcm9iYWJseSB1c2UgaW50ZXJuYWwgQ29tcG9uZW50cyBpbnN0ZWFkIG9mIG1ha2luZyBpdCBmcm9tIHNjcmF0Y2guXHJcbiAgICBnZXQgbW9kdWxlcygpe1xyXG4gICAgICAgIHJldHVybiBwb3BvdXRNb2R1bGUgfHwgKHBvcG91dE1vZHVsZSA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUudXNlclBvcG91dClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLl9ob3Jpem9udGFsKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUudmVydGljYWwgJiYgZS5hbGlnblN0cmV0Y2ggJiYgIWUuc3RyZWFtZXJNb2RlRW5hYmxlZEJ0bilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmJvdClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmFjdGl2aXR5VXNlclBvcG91dClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm11dGVkICYmIGUud3JhcHBlciAmJiBlLmJhc2UpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS50aGVtZUdob3N0SGFpcmxpbmVDaGFubmVscylbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm5vdGUgJiYgT2JqZWN0LmtleXMoZSkubGVuZ3RoID09PSAxKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUucHJvICYmIGUuaW5saW5lKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzKVswXS5kZWZhdWx0Lk1lc3NhZ2VzLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wb2ludGVyRXZlbnRzKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdLmRlZmF1bHRcclxuICAgICAgICBdKVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIHJvb3RNb2R1bGUxLFxyXG4gICAgICAgICAgICBmbGV4TW9kdWxlMSxcclxuICAgICAgICAgICAgc3R5bGluZ01vZHVsZTEsXHJcbiAgICAgICAgICAgIG5hbWVUYWdNb2R1bGUxLFxyXG4gICAgICAgICAgICBhY3Rpdml0eU1vZHVsZTEsXHJcbiAgICAgICAgICAgIHRleHRNb2R1bGUxLFxyXG4gICAgICAgICAgICBzaXplTW9kdWxlMSxcclxuICAgICAgICAgICAgc2Nyb2xsZXJNb2R1bGUxLFxyXG4gICAgICAgICAgICBub3RlTW9kdWxlMSxcclxuICAgICAgICAgICAgcHJvdGlwTW9kdWxlMSxcclxuICAgICAgICAgICAgY29sb3JNb2R1bGUxLFxyXG4gICAgICAgICAgICBNZXNzYWdlcyxcclxuICAgICAgICAgICAgYXZhdGFyTW9kdWxlMSxcclxuICAgICAgICAgICAgdXNlck1vZHVsZTFcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcbiAgICAgICAgbGV0IHVzZXIgPSB1c2VyTW9kdWxlMS5nZXRDdXJyZW50VXNlcigpXHJcbiAgICAgICAgbGV0IGF2YXRhclVSTCA9IHVzZXIuYXZhdGFyVVJMXHJcbiAgICAgICAgaWYodXNlci5hdmF0YXIgJiYgdXNlci5hdmF0YXIuc3RhcnRzV2l0aChcImFfXCIpKXtcclxuICAgICAgICAgICAgYXZhdGFyVVJMID0gdXNlci5nZXRBdmF0YXJVUkwoXCJnaWZcIilcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBkYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFJQQywgdGhpcy5wcm9wcy5wcmV2aWV3LnByb3BzLnNldHRpbmdzLnN0YXRlLmRhdGEpXHJcbiAgICAgICAgdGltZXN0YW1wQ2xhc3MgPSB0aW1lc3RhbXBDbGFzcyB8fCBhY3Rpdml0eU1vZHVsZTEudGltZXN0YW1wXHJcblxyXG4gICAgICAgIGxldCBpbWFnZXMgPSAoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZighZGF0YVtcImFzc2V0cy5sYXJnZVwiXSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICBsZXQgaW1hZ2VzID0gW11cclxuICAgICAgICAgICAgaWYoZGF0YVtcImFzc2V0cy5sYXJnZVwiXSl7XHJcbiAgICAgICAgICAgICAgICBpbWFnZXMucHVzaCg8aW1nIGFsdD1cIlwiIHNyYz17YGh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2FwcC1hc3NldHMvJHtkYXRhLmFwcGxpY2F0aW9uX2lkfS8ke2RhdGFbXCJhc3NldHMubGFyZ2VcIl19LnBuZ2B9IGNsYXNzPXtgJHthY3Rpdml0eU1vZHVsZTEuYXNzZXRzTGFyZ2VJbWFnZVVzZXJQb3BvdXR9ICR7ZGF0YVtcImFzc2V0cy5zbWFsbFwiXSA/IGFjdGl2aXR5TW9kdWxlMS5hc3NldHNMYXJnZU1hc2tVc2VyUG9wb3V0IDogXCJcIn1gfSAvPilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihkYXRhW1wiYXNzZXRzLnNtYWxsXCJdKXtcclxuICAgICAgICAgICAgICAgIGltYWdlcy5wdXNoKDxpbWcgYWx0PVwiXCIgc3JjPXtgaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vYXBwLWFzc2V0cy8ke2RhdGEuYXBwbGljYXRpb25faWR9LyR7ZGF0YVtcImFzc2V0cy5zbWFsbFwiXX0ucG5nYH0gY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5hc3NldHNTbWFsbEltYWdlVXNlclBvcG91dH0gLz4pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIWltYWdlcy5sZW5ndGgpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5hc3NldHN9PlxyXG4gICAgICAgICAgICAgICAge2ltYWdlc31cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfSkoKVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9XCJsYy11c2VyUG9wb3V0IGxjLXRhYi1ib3gtc2hhZG93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLnVzZXJQb3BvdXR9IHJvbGU9XCJkaWFsb2dcIiB0YWJpbmRleD1cIi0xXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5oZWFkZXJQbGF5aW5nfT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtmbGV4TW9kdWxlMS5mbGV4fSAke3N0eWxpbmdNb2R1bGUxLnZlcnRpY2FsfSAke3N0eWxpbmdNb2R1bGUxLmp1c3RpZnlDZW50ZXJ9ICR7c3R5bGluZ01vZHVsZTEuYWxpZ25DZW50ZXJ9ICR7c3R5bGluZ01vZHVsZTEubm9XcmFwfSAke3Jvb3RNb2R1bGUxLmhlYWRlclRvcH1gfSBzdHlsZT17e2ZsZXg6IFwiMSAxIGF1dG9cIn19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5hdmF0YXJXcmFwcGVyTm9ybWFsfSByb2xlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCIwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXthdmF0YXJNb2R1bGUxfSByb2xlPVwiaW1nXCIgc3R5bGU9e3t3aWR0aDogXCI4MHB4XCIsIGhlaWdodDogXCI4MHB4XCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiOTJcIiBoZWlnaHQ9XCI4MFwiIHZpZXdCb3g9XCIwIDAgOTIgODBcIiBjbGFzcz17YCR7YXZhdGFyTW9kdWxlMS5tYXNrfSAke2F2YXRhck1vZHVsZTEuc3ZnfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9yZWlnbk9iamVjdCB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCI4MFwiIGhlaWdodD1cIjgwXCIgbWFzaz1cInVybCgjc3ZnLW1hc2stYXZhdGFyLXN0YXR1cy1yb3VuZC04MClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPXthdmF0YXJVUkx9IGFsdD1cIiBcIiBjbGFzcz17YXZhdGFyTW9kdWxlMS5hdmF0YXJ9IC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9yZWlnbk9iamVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFN0YXR1cyAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiODBcIiBoZWlnaHQ9XCI4MFwiIGNsYXNzPXtyb290TW9kdWxlMS5hdmF0YXJIaW50fSB2aWV3Qm94PVwiMCAwIDgwIDgwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcmVpZ25PYmplY3QgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiODBcIiBoZWlnaHQ9XCI4MFwiIG1hc2s9XCJ1cmwoI3N2Zy1tYXNrLWF2YXRhci1zdGF0dXMtcm91bmQtODApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmF2YXRhckhpbnRJbm5lcn0+e01lc3NhZ2VzLlZJRVdfUFJPRklMRX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZvcmVpZ25PYmplY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmhlYWRlclRleHR9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7ZmxleE1vZHVsZTEuZmxleH0gJHtzdHlsaW5nTW9kdWxlMS5ob3Jpem9udGFsfSAke3N0eWxpbmdNb2R1bGUxLmp1c3RpZnlTdGFydH0gJHtzdHlsaW5nTW9kdWxlMS5hbGlnbkNlbnRlcn0gJHtzdHlsaW5nTW9kdWxlMS5ub1dyYXB9YH0gc3R5bGU9e3tmbGV4OiBcIjEgMSBhdXRvXCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtyb290TW9kdWxlMS5oZWFkZXJUYWdOb05pY2tuYW1lfSAke25hbWVUYWdNb2R1bGUxLm5hbWVUYWd9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPXtgJHtuYW1lVGFnTW9kdWxlMS51c2VybmFtZX0gJHtyb290TW9kdWxlMS5oZWFkZXJUYWdVc2VybmFtZU5vTmlja25hbWV9YH0+e3VzZXIudXNlcm5hbWV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4je3VzZXIuZGlzY3JpbWluYXRvcn08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7YWN0aXZpdHlNb2R1bGUxLmFjdGl2aXR5VXNlclBvcG91dH0gJHtyb290TW9kdWxlMS5hY3Rpdml0eX1gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPXtgJHthY3Rpdml0eU1vZHVsZTEuaGVhZGVyVGV4dE5vcm1hbH0gJHt0ZXh0TW9kdWxlMS5iYXNlfSAke3NpemVNb2R1bGUxLnNpemUxMn1gfT57TWVzc2FnZXMuVVNFUl9BQ1RJVklUWV9IRUFERVJfUExBWUlOR308L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuYm9keU5vcm1hbH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aW1hZ2VzfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17aW1hZ2VzID8gYWN0aXZpdHlNb2R1bGUxLmNvbnRlbnRJbWFnZXNVc2VyUG9wb3V0IDogYWN0aXZpdHlNb2R1bGUxLmNvbnRlbnROb0ltYWdlc1VzZXJQb3BvdXR9IHN0eWxlPXt7ZmxleDogXCIxIDEgYXV0b1wifX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhLm5hbWUpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxoMyBjbGFzcz17YCR7YWN0aXZpdHlNb2R1bGUxLm5hbWVOb3JtYWx9ICR7dGV4dE1vZHVsZTEuYmFzZX0gJHtzaXplTW9kdWxlMS5zaXplMTR9YH0gdGl0bGU9e2RhdGEubmFtZX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmFjdGl2aXR5TmFtZX0+e2RhdGEubmFtZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGEuZGV0YWlscylyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPGRpdiB0aXRsZT17ZGF0YS50aXRsZX0gY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5kZXRhaWxzfT57ZGF0YS5kZXRhaWxzfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhLnN0YXRlKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8ZGl2IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuc3RhdGV9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9e2RhdGEuc3RhdGV9PntkYXRhLnN0YXRlfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGFbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aW1lQ29tcG9uZW50ID0gdGltZXN0YW1wUmVuZGVyKFRpbWVzdGFtcCwgTWVzc2FnZXMpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS50aW1lc3RhbXB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1JlYWN0LmNyZWF0ZUVsZW1lbnQodGltZUNvbXBvbmVudCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcHM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogZGF0YVtcInRpbWVzdGFtcHMuc3RhcnRcIl1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcldyYXB9ICR7cm9vdE1vZHVsZTEuYm9keX0gJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJUaGVtZWR9ICR7c2Nyb2xsZXJNb2R1bGUxLnRoZW1lR2hvc3RIYWlybGluZX0gJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJGYWRlfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcn0gJHtyb290TW9kdWxlMS5ib2R5SW5uZXJ9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmJvZHlUaXRsZX0+e01lc3NhZ2VzLk5PVEV9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake25vdGVNb2R1bGUxLm5vdGV9ICR7cm9vdE1vZHVsZTEubm90ZX1gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBwbGFjZWhvbGRlcj17TWVzc2FnZXMuTk9URV9QTEFDRUhPTERFUn0gbWF4bGVuZ3RoPVwiMjU2XCIgYXV0b2NvcnJlY3Q9XCJvZmZcIiBjbGFzcz17QkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsYmFyR2hvc3RIYWlybGluZSlbMF0uc2Nyb2xsYmFyR2hvc3RIYWlybGluZX0gc3R5bGU9e3toZWlnaHQ6IFwiMzZweFwifX0gZGlzYWJsZWQ+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmZvb3Rlcn0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7cm9vdE1vZHVsZTEucHJvdGlwfSAke3Byb3RpcE1vZHVsZTEuaW5saW5lfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9e2Ake3Byb3RpcE1vZHVsZTEucHJvfSAke3RleHRNb2R1bGUxLmJhc2V9ICR7c2l6ZU1vZHVsZTEuc2l6ZTEyfWB9IHN0eWxlPXt7Y29sb3I6IFwicmdiKDY3LCAxODEsIDEyOSlcIn19PntNZXNzYWdlcy5QSU5ORURfTUVTU0FHRVNfUFJPX1RJUH08L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtjb2xvck1vZHVsZTEuY29sb3JTdGFuZGFyZH0gJHtzaXplTW9kdWxlMS5zaXplMTR9ICR7cHJvdGlwTW9kdWxlMS50aXB9YH0+e01lc3NhZ2VzLkNPTlRFWFRfTUVOVV9ISU5UfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxubGV0IFN0YXR1c01vZHVsZXNcclxuY2xhc3MgU3RhdHVzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIFN0YXR1c01vZHVsZXMgfHwgKFN0YXR1c01vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldFByZXNlbmNlKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUucG9pbnRlckV2ZW50cylbMF0ucG9pbnRlckV2ZW50c1xyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgZ2V0UHJlc2VuY2UsXHJcbiAgICAgICAgICAgIHBvaW50ZXJFdmVudHNcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcbiAgICAgICAgbGV0IHN0YXR1cyA9IGdldFByZXNlbmNlLmRlZmF1bHQuZ2V0UHJlc2VuY2UoKS5zdGF0dXNcclxuICAgICAgICBpZihzdGF0dXMgPT09IFwiaW52aXNpYmxlXCIpc3RhdHVzID0gXCJvZmZsaW5lXCJcclxuICAgICAgICByZXR1cm4gPHJlY3Qgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgeD1cIjYwXCIgeT1cIjYwXCIgZmlsbD1cIiNmZmZmZmZcIiBtYXNrPXtgdXJsKCNzdmctbWFzay1zdGF0dXMtJHtzdGF0dXN9KWB9IGNsYXNzTmFtZT17cG9pbnRlckV2ZW50c30+PC9yZWN0PlxyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgdGltZXN0YW1wQ2xhc3MgPSBcIlwiXHJcblxyXG5sZXQgUHJvZmlsZU1vZHVsZXNcclxuY2xhc3MgUHJvZmlsZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7IC8vIFRPRE86IFByb2JhYmx5IHVzZSBpbnRlcm5hbCBDb21wb25lbnRzIGluc3RlYWQgb2YgbWFraW5nIGl0IGZyb20gc2NyYXRjaC5cclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIFByb2ZpbGVNb2R1bGVzIHx8IChQcm9maWxlTW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZmxleCAmJiBlLl9ob3Jpem9udGFsKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUudmVydGljYWwgJiYgZS5hbGlnblN0cmV0Y2ggJiYgIWUuc3RyZWFtZXJNb2RlRW5hYmxlZEJ0bilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnRvcFNlY3Rpb25TdHJlYW1pbmcpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wb2ludGVyRXZlbnRzKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuYm90KVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuYWN0aXZpdHlQcm9maWxlKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubXV0ZWQgJiYgZS53cmFwcGVyICYmIGUuYmFzZSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGVyRmFkZSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm5vdGUgJiYgT2JqZWN0LmtleXMoZSkubGVuZ3RoID09PSAxKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuTWVzc2FnZXMpWzBdLmRlZmF1bHQuTWVzc2FnZXNcclxuICAgICAgICBdKVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCB1c2VyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgICAgIGxldCBhdmF0YXJVUkwgPSB1c2VyLmF2YXRhclVSTFxyXG4gICAgICAgIGlmKHVzZXIuYXZhdGFyICYmIHVzZXIuYXZhdGFyLnN0YXJ0c1dpdGgoXCJhX1wiKSl7XHJcbiAgICAgICAgICAgIGF2YXRhclVSTCA9IHVzZXIuZ2V0QXZhdGFyVVJMKFwiZ2lmXCIpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGZsZXhNb2R1bGUxLFxyXG4gICAgICAgICAgICBzdHlsaW5nTW9kdWxlMSxcclxuICAgICAgICAgICAgcm9vdE1vZHVsZTEsXHJcbiAgICAgICAgICAgIGF2YXRhck1vZHVsZTEsXHJcbiAgICAgICAgICAgIG5hbWVUYWdNb2R1bGUxLFxyXG4gICAgICAgICAgICBhY3Rpdml0eU1vZHVsZTEsXHJcbiAgICAgICAgICAgIHRleHRNb2R1bGUxLFxyXG4gICAgICAgICAgICBzaXplTW9kdWxlMSxcclxuICAgICAgICAgICAgc2Nyb2xsZXJNb2R1bGUxLFxyXG4gICAgICAgICAgICBub3RlTW9kdWxlMSxcclxuICAgICAgICAgICAgTWVzc2FnZXNcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcblxyXG4gICAgICAgIGxldCBkYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFJQQywgdGhpcy5wcm9wcy5wcmV2aWV3LnByb3BzLnNldHRpbmdzLnN0YXRlLmRhdGEpXHJcbiAgICAgICAgdGltZXN0YW1wQ2xhc3MgPSB0aW1lc3RhbXBDbGFzcyB8fCBhY3Rpdml0eU1vZHVsZTEudGltZXN0YW1wXHJcblxyXG4gICAgICAgIGxldCBpbWFnZXMgPSAoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZighZGF0YVtcImFzc2V0cy5sYXJnZVwiXSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICBsZXQgaW1hZ2VzID0gW11cclxuICAgICAgICAgICAgaWYoZGF0YVtcImFzc2V0cy5sYXJnZVwiXSl7XHJcbiAgICAgICAgICAgICAgICBpbWFnZXMucHVzaCg8aW1nIGFsdD1cIlwiIHNyYz17YGh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2FwcC1hc3NldHMvJHtkYXRhLmFwcGxpY2F0aW9uX2lkfS8ke2RhdGFbXCJhc3NldHMubGFyZ2VcIl19LnBuZ2B9IGNsYXNzPXtgJHthY3Rpdml0eU1vZHVsZTEuYXNzZXRzTGFyZ2VJbWFnZVByb2ZpbGV9ICR7ZGF0YVtcImFzc2V0cy5zbWFsbFwiXSA/IGFjdGl2aXR5TW9kdWxlMS5hc3NldHNMYXJnZU1hc2tQcm9maWxlIDogXCJcIn1gfSAvPilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihkYXRhW1wiYXNzZXRzLnNtYWxsXCJdKXtcclxuICAgICAgICAgICAgICAgIGltYWdlcy5wdXNoKDxpbWcgYWx0PVwiXCIgc3JjPXtgaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vYXBwLWFzc2V0cy8ke2RhdGEuYXBwbGljYXRpb25faWR9LyR7ZGF0YVtcImFzc2V0cy5zbWFsbFwiXX0ucG5nYH0gY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5hc3NldHNTbWFsbEltYWdlUHJvZmlsZX0gLz4pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIWltYWdlcy5sZW5ndGgpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5hc3NldHN9PlxyXG4gICAgICAgICAgICAgICAge2ltYWdlc31cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfSkoKVxyXG5cclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImxjLXRhYiBsYy10YWItYm94LXNoYWRvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7ZmxleE1vZHVsZTEuZmxleH0gJHtzdHlsaW5nTW9kdWxlMS52ZXJ0aWNhbH0gJHtzdHlsaW5nTW9kdWxlMS5qdXN0aWZ5U3RhcnR9ICR7c3R5bGluZ01vZHVsZTEuYWxpZ25TdHJldGNofSAke3N0eWxpbmdNb2R1bGUxLm5vV3JhcH0gJHtyb290TW9kdWxlMS5yb290fWB9IHN0eWxlPXt7ZmxleDogXCIxIDEgYXV0b1wifX0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEudG9wU2VjdGlvblBsYXlpbmd9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aGVhZGVyIGNsYXNzPXtyb290TW9kdWxlMS5oZWFkZXJ9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7cm9vdE1vZHVsZTEuYXZhdGFyfSAke2F2YXRhck1vZHVsZTEud3JhcHBlcn1gfSByb2xlPVwiaW1nXCIgc3R5bGU9e3t3aWR0aDogXCI4MHB4XCIsIGhlaWdodDogXCI4MHB4XCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiOTJcIiBoZWlnaHQ9XCI4MFwiIHZpZXdCb3g9XCIwIDAgOTIgODBcIiBjbGFzcz17YCR7YXZhdGFyTW9kdWxlMS5tYXNrfSAke2F2YXRhck1vZHVsZTEuc3ZnfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9yZWlnbk9iamVjdCB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCI4MFwiIGhlaWdodD1cIjgwXCIgbWFzaz1cInVybCgjc3ZnLW1hc2stYXZhdGFyLXN0YXR1cy1yb3VuZC04MClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPXthdmF0YXJVUkx9IGFsdD1cIiBcIiBjbGFzcz17YXZhdGFyTW9kdWxlMS5hdmF0YXJ9IC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9yZWlnbk9iamVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFN0YXR1cyAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtyb290TW9kdWxlMS5oZWFkZXJJbmZvfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake3Jvb3RNb2R1bGUxLm5hbWVUYWd9ICR7bmFtZVRhZ01vZHVsZTEubmFtZVRhZ31gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9e2Ake3Jvb3RNb2R1bGUxLnVzZXJuYW1lfSAke3Jvb3RNb2R1bGUxLnVzZXJuYW1lfWB9Pnt1c2VyLnVzZXJuYW1lfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9e3Jvb3RNb2R1bGUxLmRpc2NyaW1pbmF0b3J9PiN7dXNlci5kaXNjcmltaW5hdG9yfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtmbGV4TW9kdWxlMS5mbGV4fSAke2ZsZXhNb2R1bGUxLmhvcml6b250YWx9ICR7c3R5bGluZ01vZHVsZTEuanVzdGlmeVN0YXJ0fSAke3N0eWxpbmdNb2R1bGUxLmFsaWduU3RyZXRjaH0gJHtzdHlsaW5nTW9kdWxlMS5ub1dyYXB9ICR7cm9vdE1vZHVsZTEucHJvZmlsZUJhZGdlc31gfSBzdHlsZT17e2ZsZXg6IFwiMSAxIGF1dG9cIn19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QmFkZ2VzIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oZWFkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmhlYWRlckZpbGx9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7YWN0aXZpdHlNb2R1bGUxLmFjdGl2aXR5UHJvZmlsZX0gJHtyb290TW9kdWxlMS5hY3Rpdml0eX1gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9e2Ake2FjdGl2aXR5TW9kdWxlMS5oZWFkZXJUZXh0Tm9ybWFsfSAke3RleHRNb2R1bGUxLmJhc2V9ICR7c2l6ZU1vZHVsZTEuc2l6ZTEyfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7TWVzc2FnZXMuVVNFUl9BQ1RJVklUWV9IRUFERVJfUExBWUlOR31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5ib2R5Tm9ybWFsfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ltYWdlc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17aW1hZ2VzID8gYWN0aXZpdHlNb2R1bGUxLmNvbnRlbnRJbWFnZXNQcm9maWxlIDogYWN0aXZpdHlNb2R1bGUxLmNvbnRlbnROb0ltYWdlc1VzZXJQb3BvdXR9IHN0eWxlPXt7ZmxleDogXCIxIDEgYXV0b1wifX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YS5uYW1lKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxoMyBjbGFzcz17YCR7YWN0aXZpdHlNb2R1bGUxLm5hbWVOb3JtYWx9ICR7dGV4dE1vZHVsZTEuYmFzZX0gJHtzaXplTW9kdWxlMS5zaXplMTR9YH0gdGl0bGU9e2RhdGEubmFtZX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuYWN0aXZpdHlOYW1lfT57ZGF0YS5uYW1lfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhLmRldGFpbHMpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPGRpdiB0aXRsZT17ZGF0YS50aXRsZX0gY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5kZXRhaWxzfT57ZGF0YS5kZXRhaWxzfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhLnN0YXRlKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5zdGF0ZX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPXtkYXRhLnN0YXRlfT57ZGF0YS5zdGF0ZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGFbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVDb21wb25lbnQgPSB0aW1lc3RhbXBSZW5kZXIoVGltZXN0YW1wLCBNZXNzYWdlcylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEudGltZXN0YW1wfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1JlYWN0LmNyZWF0ZUVsZW1lbnQodGltZUNvbXBvbmVudCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogZGF0YVtcInRpbWVzdGFtcHMuc3RhcnRcIl1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblx0XHRcdFx0ICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmJvZHl9PlxyXG5cdFx0XHRcdFx0ICAgIDxkaXYgY2xhc3M9e2Ake3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcldyYXB9ICR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyRmFkZX1gfT5cclxuXHRcdFx0XHRcdFx0ICAgIDxkaXYgY2xhc3M9e3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcn0+XHJcblx0XHRcdFx0XHRcdFx0ICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLnVzZXJJbmZvU2VjdGlvbn0+XHJcblx0XHRcdFx0XHRcdFx0XHQgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEudXNlckluZm9TZWN0aW9uSGVhZGVyfT57TWVzc2FnZXMuTk9URX08L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdCAgICA8ZGl2IGNsYXNzPXtgJHtyb290TW9kdWxlMS5ub3RlfSAke25vdGVNb2R1bGUxLm5vdGV9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgcGxhY2Vob2xkZXI9e01lc3NhZ2VzLk5PVEVfUExBQ0VIT0xERVJ9IG1heGxlbmd0aD1cIjI1NlwiIGF1dG9jb3JyZWN0PVwib2ZmXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz17QkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsYmFyR2hvc3RIYWlybGluZSlbMF0uc2Nyb2xsYmFyR2hvc3RIYWlybGluZX0gc3R5bGU9e3toZWlnaHQ6IFwiNDBweFwifX0gZGlzYWJsZWQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXh0YXJlYT5cclxuXHRcdFx0XHRcdFx0XHRcdCAgICA8L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHQgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENvbm5lY3RlZEFjY291bnRzIC8+XHJcblx0XHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIF1cclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgQ29ubmVjdGVkQWNjb3VudHMgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IGFjY291bnRzID0gW11cclxuICAgICAgICBsZXQgcm9vdE1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS50b3BTZWN0aW9uU3RyZWFtaW5nKVswXVxyXG4gICAgICAgIGxldCBBY2NvdW50TW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEFjY291bnRzKVswXS5kZWZhdWx0XHJcblxyXG4gICAgICAgIGxldCBhY2NzID0gQWNjb3VudE1vZHVsZTEuZ2V0QWNjb3VudHMoKS5maWx0ZXIoZSA9PiBlLnZpc2liaWxpdHkgPT09IDEpXHJcbiAgICAgICAgZm9yKGxldCBhY2Mgb2YgYWNjcyl7XHJcbiAgICAgICAgICAgIGFjY291bnRzLnB1c2goPENvbm5lY3RlZEFjY291bnQgYWNjPXthY2N9IC8+KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoYWNjb3VudHMubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIHJldHVybiAoPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEudXNlckluZm9TZWN0aW9ufT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmNvbm5lY3RlZEFjY291bnRzfT5cclxuICAgICAgICAgICAgICAgICAgICB7YWNjb3VudHN9XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+KVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbFxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBDb25uZWN0ZWRBY2NvdW50IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGZsZXhNb2R1bGUxLFxyXG4gICAgICAgICAgICBzdHlsaW5nTW9kdWxlMSxcclxuICAgICAgICAgICAgcm9vdE1vZHVsZTEsXHJcbiAgICAgICAgICAgIGZsb3dlck1vZHVsZTEsXHJcbiAgICAgICAgICAgIGFuY2hvck1vZHVsZTEsXHJcbiAgICAgICAgICAgIFNvY2lhbENvbnN0YW50c1xyXG4gICAgICAgIF0gPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmZsZXggJiYgZS5faG9yaXpvbnRhbClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnZlcnRpY2FsICYmIGUuYWxpZ25TdHJldGNoICYmICFlLnN0cmVhbWVyTW9kZUVuYWJsZWRCdG4pWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS50b3BTZWN0aW9uU3RyZWFtaW5nKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZmxvd2VyU3RhckNvbnRhaW5lcilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmFuY2hvcilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldCAmJiBlLmRlZmF1bHQubWFwKVswXS5kZWZhdWx0XHJcbiAgICAgICAgXVxyXG4gICAgICAgIGxldCBhY2MgPSB0aGlzLnByb3BzLmFjY1xyXG4gICAgICAgIGxldCBjb25zdGFudHNTb2NpYWwgPSBTb2NpYWxDb25zdGFudHMuZ2V0KGFjYy50eXBlKVxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzcz17YCR7ZmxleE1vZHVsZTEuZmxleH0gJHtmbGV4TW9kdWxlMS5ob3Jpem9udGFsfSAke3N0eWxpbmdNb2R1bGUxLmp1c3RpZnlTdGFydH0gJHtzdHlsaW5nTW9kdWxlMS5hbGlnbkNlbnRlcn0gJHtzdHlsaW5nTW9kdWxlMS5ub1dyYXB9ICR7cm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudH1gfSBzdHlsZT17e2ZsZXg6IFwiMCAxIGF1dG9cIn19PlxyXG4gICAgICAgICAgICA8aW1nIGFsdD17YExvZ28gJHtjb25zdGFudHNTb2NpYWwubmFtZX1gfSBjbGFzcz17cm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudEljb259IHNyYz17Y29uc3RhbnRzU29jaWFsLmljb24uY29sb3IgfHwgY29uc3RhbnRzU29jaWFsLmljb24ud2hpdGUgfHwgY29uc3RhbnRzU29jaWFsLmljb24uZ3JleX0gLz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudE5hbWVJbm5lcn0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5jb25uZWN0ZWRBY2NvdW50TmFtZX0+e2FjYy5uYW1lfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAge2FjYy52ZXJpZmllZCA/ICg8c3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtmbG93ZXJNb2R1bGUxLmZsb3dlclN0YXJDb250YWluZXJ9ICR7cm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudFZlcmlmaWVkSWNvbn1gfSBzdHlsZT17e3dpZHRoOiBcIjE2cHhcIiwgaGVpZ2h0OiBcIjE2cHhcIn19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPXtmbG93ZXJNb2R1bGUxLmZsb3dlclN0YXJ9IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTUuMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIiM0ZjU0NWNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIm0xNiA3LjZjMCAuNzktMS4yOCAxLjM4LTEuNTIgMi4wOXMuNDQgMiAwIDIuNTktMS44NC4zNS0yLjQ2LjgtLjc5IDEuODQtMS41NCAyLjA5LTEuNjctLjgtMi40Ny0uOC0xLjc1IDEtMi40Ny44LS45Mi0xLjY0LTEuNTQtMi4wOS0yLS4xOC0yLjQ2LS44LjIzLTEuODQgMC0yLjU5LTEuNTQtMS4zLTEuNTQtMi4wOSAxLjI4LTEuMzggMS41Mi0yLjA5LS40NC0yIDAtMi41OSAxLjg1LS4zNSAyLjQ4LS44Ljc4LTEuODQgMS41My0yLjEyIDEuNjcuODMgMi40Ny44MyAxLjc1LTEgMi40Ny0uOC45MSAxLjY0IDEuNTMgMi4wOSAyIC4xOCAyLjQ2LjgtLjIzIDEuODQgMCAyLjU5IDEuNTQgMS4zIDEuNTQgMi4wOXpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtmbG93ZXJNb2R1bGUxLmNoaWxkQ29udGFpbmVyfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNS4yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03LjQsMTEuMTcsNCw4LjYyLDUsNy4yNmwyLDEuNTNMMTAuNjQsNGwxLjM2LDFaXCIgZmlsbD1cIiNmZmZmZmZcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+KSA6IG51bGx9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8YSBjbGFzcz17YCR7YW5jaG9yTW9kdWxlMS5hbmNob3J9ICR7YW5jaG9yTW9kdWxlMS5hbmNob3JVbmRlcmxpbmVPbkhvdmVyfWB9IHJlbD1cIm5vcmVmZXJyZXIgbm9vcGVuZXJcIiB0YXJnZXQ9XCJfYmxhbmtcIiByb2xlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCIwXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPXtyb290TW9kdWxlMS5jb25uZWN0ZWRBY2NvdW50T3Blbkljb259IHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk0xMCA1VjNINS4zNzVDNC4wNjUxOSAzIDMgNC4wNjUxOSAzIDUuMzc1VjE4LjYyNUMzIDE5LjkzNiA0LjA2NTE5IDIxIDUuMzc1IDIxSDE4LjYyNUMxOS45MzYgMjEgMjEgMTkuOTM2IDIxIDE4LjYyNVYxNEgxOVYxOUg1VjVIMTBaXCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTIxIDIuOTk5MDJIMTRWNC45OTkwMkgxNy41ODZMOS4yOTI5NyAxMy4yOTJMMTAuNzA3IDE0LjcwNkwxOSA2LjQxMzAyVjkuOTk5MDJIMjFWMi45OTkwMlpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgQmFkZ2VzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCB1c2VyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgICAgIGxldCByb290TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUudG9wU2VjdGlvblN0cmVhbWluZylbMF1cclxuICAgICAgICBsZXQgVXNlckZsYWdzID0gQkRNb2R1bGVzLmdldChlID0+IGUuVXNlckZsYWdzKVswXS5Vc2VyRmxhZ3NcclxuICAgICAgICBsZXQgYmFkZ2VzID0gW11cclxuICAgICAgICBsZXQgc2VyaWFsaXplZCA9IFtdXHJcblxyXG4gICAgICAgIGZvcihsZXQgZmxhZ05hbWUgaW4gVXNlckZsYWdzKXtcclxuICAgICAgICAgICAgaWYodXNlci5oYXNGbGFnKFVzZXJGbGFnc1tmbGFnTmFtZV0pKXNlcmlhbGl6ZWQucHVzaChmbGFnTmFtZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvcihsZXQgZmxhZ05hbWUgb2Ygc2VyaWFsaXplZCl7XHJcbiAgICAgICAgICAgIGxldCBzZWFyY2hhYmxlID0gYHByb2ZpbGVCYWRnZSR7ZmxhZ05hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csIFwiIFwiKS5zcGxpdChcIiBcIikubWFwKGUgPT4gZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSkpLmpvaW4oXCJcIil9YFxyXG4gICAgICAgICAgICBzZWFyY2hhYmxlID0gc2VhcmNoYWJsZS5yZXBsYWNlKFwiSHlwZXNxdWFkT25saW5lXCIsIFwiSHlwZVNxdWFkT25saW5lXCIpXHJcbiAgICAgICAgICAgIGlmKCFyb290TW9kdWxlW3NlYXJjaGFibGVdKWNvbnRpbnVlXHJcbiAgICAgICAgICAgIGJhZGdlcy5wdXNoKDxCYWRnZSBuYW1lPXtzZWFyY2hhYmxlfS8+KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYodXNlci5oYXNQcmVtaXVtU3Vic2NyaXB0aW9uKXtcclxuICAgICAgICAgICAgYmFkZ2VzLnB1c2goPEJhZGdlIG5hbWU9XCJwcm9maWxlQmFkZ2VQcmVtaXVtXCIgLz4pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBiYWRnZXNcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgQmFkZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHJvb3RNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUudG9wU2VjdGlvblN0cmVhbWluZylbMF1cclxuXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5wcm9maWxlQmFkZ2VXcmFwcGVyfT5cclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIiByb2xlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCIwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7cm9vdE1vZHVsZTEucHJvZmlsZUJhZGdlfSAke3Jvb3RNb2R1bGUxW3RoaXMucHJvcHMubmFtZV19YH0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgVGltZXN0YW1wIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17dGltZXN0YW1wQ2xhc3N9PlxyXG4gICAgICAgICAgICB7dGhpcy5wcm9wcy5tZXNzYWdlfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi4vLi4vbW9kdWxlcy9kb210b29sc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0xheWVyIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5rZXl1cExpc3RlbmVyID0gdGhpcy5rZXl1cExpc3RlbmVyLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAga2V5dXBMaXN0ZW5lcihlKSB7XHJcbiAgICAgICAgaWYgKGUud2hpY2ggPT09IDI3KSB7XHJcbiAgICAgICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZSh0aGlzLnJlZnMucm9vdC5wYXJlbnROb2RlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCB0aGlzLmtleXVwTGlzdGVuZXIpO1xyXG5cclxuICAgICAgICBjb25zdCB0aGlzTm9kZSA9IERPTS5xdWVyeShgIyR7dGhpcy5wcm9wcy5pZH1gKTtcclxuICAgICAgICBET00uYW5pbWF0ZSh7XHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAyMDAsXHJcbiAgICAgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24ocHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgICAgIHRoaXNOb2RlLnN0eWxlLnRyYW5zZm9ybSA9IGBzY2FsZSgkezEuMSAtIDAuMSAqIHByb2dyZXNzfSkgdHJhbnNsYXRlWigwcHgpYDtcclxuICAgICAgICAgICAgICAgIHRoaXNOb2RlLnN0eWxlLm9wYWNpdHkgPSBwcm9ncmVzcztcclxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzcyA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc05vZGUuc3R5bGUudHJhbnNmb3JtID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc05vZGUuc3R5bGUub3BhY2l0eSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcclxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIHRoaXMua2V5dXBMaXN0ZW5lcik7XHJcblxyXG4gICAgICAgIGNvbnN0IHRoaXNOb2RlID0gRE9NLnF1ZXJ5KGAjJHt0aGlzLnByb3BzLmlkfWApO1xyXG4gICAgICAgIERPTS5hbmltYXRlKHtcclxuICAgICAgICAgICAgZHVyYXRpb246IDIwMCxcclxuICAgICAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgdGhpc05vZGUuc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7MS4xIC0gMC4xICogKDEgLSBwcm9ncmVzcyl9KSB0cmFuc2xhdGVaKDBweClgO1xyXG4gICAgICAgICAgICAgICAgdGhpc05vZGUuc3R5bGUub3BhY2l0eSA9IDEgLSBwcm9ncmVzcztcclxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzcyA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc05vZGUucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgbGF5ZXIgPSBET00ucXVlcnkoXCIucHVibGljU2VydmVyc09wZW5cIik7XHJcbiAgICAgICAgbGF5ZXIuY2xhc3NMaXN0LnJlbW92ZShcInB1YmxpY1NlcnZlcnNPcGVuXCIpO1xyXG4gICAgICAgIERPTS5hbmltYXRlKHtcclxuICAgICAgICAgICAgZHVyYXRpb246IDIwMCxcclxuICAgICAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgbGF5ZXIuc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7MC4wNyAqIHByb2dyZXNzICsgMC45M30pIHRyYW5zbGF0ZVooMHB4KWA7XHJcbiAgICAgICAgICAgICAgICBsYXllci5zdHlsZS5vcGFjaXR5ID0gcHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3MgPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnN0eWxlLnRyYW5zZm9ybSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnN0eWxlLm9wYWNpdHkgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbE1vdW50KCkge1xyXG4gICAgICAgIGNvbnN0IGxheWVyID0gRE9NLnF1ZXJ5KFwiW2NsYXNzKj1cXFwibGF5ZXItXFxcIl1cIik7XHJcbiAgICAgICAgbGF5ZXIuY2xhc3NMaXN0LmFkZChcInB1YmxpY1NlcnZlcnNPcGVuXCIpO1xyXG4gICAgICAgIERPTS5hbmltYXRlKHtcclxuICAgICAgICAgICAgZHVyYXRpb246IDIwMCxcclxuICAgICAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgbGF5ZXIuc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7MC4wNyAqICgxIC0gcHJvZ3Jlc3MpICsgMC45M30pIHRyYW5zbGF0ZVooMHB4KWA7XHJcbiAgICAgICAgICAgICAgICBsYXllci5zdHlsZS5vcGFjaXR5ID0gMSAtIHByb2dyZXNzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwibGF5ZXIgYmQtbGF5ZXIgXCIrQkRNb2R1bGVzLmdldChlID0+IGUubGF5ZXIgJiYgZS5hbmltYXRpbmcpWzBdLmxheWVyLCBpZDogdGhpcy5wcm9wcy5pZCwgcmVmOiBcInJvb3RcIiwgc3R5bGU6IHtvcGFjaXR5OiAwLCB0cmFuc2Zvcm06IFwic2NhbGUoMS4xKSB0cmFuc2xhdGVaKDBweClcIn19LFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLmNoaWxkcmVuXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5pbXBvcnQgVG9vbHMgZnJvbSBcIi4uL3Rvb2xzXCI7XHJcbmltcG9ydCBTZXR0aW5nc1RpdGxlIGZyb20gXCIuLi9zZXR0aW5nc1RpdGxlXCI7XHJcbmltcG9ydCBUYWJCYXJTZXBhcmF0b3IgZnJvbSBcIi4uL3RhYkJhclNlcGFyYXRvclwiO1xyXG5pbXBvcnQgVGFiQmFySGVhZGVyIGZyb20gXCIuLi90YWJCYXJIZWFkZXJcIjtcclxuaW1wb3J0IFRhYkJhckl0ZW0gZnJvbSBcIi4uL3RhYkJhckl0ZW1cIjtcclxuXHJcbmltcG9ydCBTZXJ2ZXJDYXJkIGZyb20gXCIuL3NlcnZlckNhcmRcIjtcclxuaW1wb3J0IFNpZGViYXJWaWV3IGZyb20gXCIuL3NpZGViYXJWaWV3XCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfUHVibGljU2VydmVycyBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbFN0YXRlKCk7XHJcbiAgICAgICAgdGhpcy5jbG9zZSA9IHRoaXMuY2xvc2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmNoYW5nZUNhdGVnb3J5ID0gdGhpcy5jaGFuZ2VDYXRlZ29yeS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoID0gdGhpcy5zZWFyY2guYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNlYXJjaEtleURvd24gPSB0aGlzLnNlYXJjaEtleURvd24uYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmNoZWNrQ29ubmVjdGlvbiA9IHRoaXMuY2hlY2tDb25uZWN0aW9uLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5qb2luID0gdGhpcy5qb2luLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0ID0gdGhpcy5jb25uZWN0LmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuR3VpbGRTdG9yZSA9IEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJnZXRHdWlsZHNcIl0pO1xyXG4gICAgICAgIHRoaXMuQXZhdGFyRGVmYXVsdHMgPSBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZ2V0VXNlckF2YXRhclVSTFwiLCBcIkRFRkFVTFRfQVZBVEFSU1wiXSk7XHJcbiAgICAgICAgdGhpcy5JbnZpdGVBY3Rpb25zID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImFjY2VwdEludml0ZVwiXSk7XHJcbiAgICAgICAgdGhpcy5Tb3J0ZWRHdWlsZFN0b3JlID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldFNvcnRlZEd1aWxkc1wiXSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0Nvbm5lY3Rpb24oKTtcclxuICAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IC0xLFxyXG4gICAgICAgICAgICB0aXRsZTogXCJMb2FkaW5nLi4uXCIsXHJcbiAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXHJcbiAgICAgICAgICAgIHNlcnZlcnM6IFtdLFxyXG4gICAgICAgICAgICBuZXh0OiBudWxsLFxyXG4gICAgICAgICAgICBjb25uZWN0aW9uOiB7XHJcbiAgICAgICAgICAgICAgICBzdGF0ZTogMCxcclxuICAgICAgICAgICAgICAgIHVzZXI6IG51bGxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2UoKSB7XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS51bm1vdW50Q29tcG9uZW50QXROb2RlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucHJvcHMucm9vdElkKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VhcmNoKHF1ZXJ5LCBjbGVhcikge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGZldGNoKGAke3NlbGYuZW5kUG9pbnR9JHtxdWVyeX0ke3F1ZXJ5ID8gXCImc2NoZW1hPW5ld1wiIDogXCI/c2NoZW1hPW5ld1wifWAsIHtcclxuICAgICAgICAgICAgbWV0aG9kOiBcImdldFwiXHJcbiAgICAgICAgfSkudGhlbihhc3luYyByZXMgPT4ge1xyXG4gICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApdGhyb3cgYXdhaXQgcmVzLnRleHQoKVxyXG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHJlcy5qc29uKClcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCBzZXJ2ZXJzID0gZGF0YS5yZXN1bHRzLnJlZHVjZSgoYXJyLCBzZXJ2ZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIHNlcnZlci5qb2luZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGFyci5wdXNoKHNlcnZlcik7XHJcbiAgICAgICAgICAgICAgICAvLyBhcnIucHVzaCg8U2VydmVyQ2FyZCBzZXJ2ZXI9e3NlcnZlcn0gam9pbj17c2VsZi5qb2lufS8+KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhcnI7XHJcbiAgICAgICAgICAgIH0sIFtdKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghY2xlYXIpIHtcclxuICAgICAgICAgICAgICAgIHNlcnZlcnMgPSBzZWxmLnN0YXRlLnNlcnZlcnMuY29uY2F0KHNlcnZlcnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9zZXJ2ZXJzLnVuc2hpZnQoc2VsZi5iZFNlcnZlcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBlbmQgPSBkYXRhLnNpemUgKyBkYXRhLmZyb207XHJcbiAgICAgICAgICAgIGRhdGEubmV4dCA9IGA/ZnJvbT0ke2VuZH1gO1xyXG4gICAgICAgICAgICBpZiAoc2VsZi5zdGF0ZS50ZXJtKSBkYXRhLm5leHQgKz0gYCZ0ZXJtPSR7c2VsZi5zdGF0ZS50ZXJtfWA7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnkpIGRhdGEubmV4dCArPSBgJmNhdGVnb3J5PSR7c2VsZi5jYXRlZ29yeUJ1dHRvbnNbc2VsZi5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5XX1gO1xyXG4gICAgICAgICAgICBpZiAoZW5kID49IGRhdGEudG90YWwpIHtcclxuICAgICAgICAgICAgICAgIGVuZCA9IGRhdGEudG90YWw7XHJcbiAgICAgICAgICAgICAgICBkYXRhLm5leHQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSBgU2hvd2luZyAxLSR7ZW5kfSBvZiAke2RhdGEudG90YWx9IHJlc3VsdHMgaW4gJHtzZWxmLmNhdGVnb3J5QnV0dG9uc1tzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnldfWA7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLnN0YXRlLnRlcm0pIHRpdGxlICs9IGAgZm9yICR7c2VsZi5zdGF0ZS50ZXJtfWA7XHJcblxyXG4gICAgICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxyXG4gICAgICAgICAgICAgICAgc2VydmVyczogc2VydmVycyxcclxuICAgICAgICAgICAgICAgIG5leHQ6IGRhdGEubmV4dFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjbGVhcikge1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhzZWxmKTtcclxuICAgICAgICAgICAgICAgIHNlbGYucmVmcy5zYnYucmVmcy5jb250ZW50U2Nyb2xsZXIuc2Nyb2xsVG9wID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgIHJldHVybiBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6IFwiRmFpbGVkIHRvIGxvYWQgc2VydmVycy4gQ2hlY2sgY29uc29sZSBmb3IgZGV0YWlsc1wiXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgam9pbihzZXJ2ZXJDYXJkKSB7XHJcbiAgICAgICAgaWYgKHNlcnZlckNhcmQucHJvcHMucGlubmVkKSByZXR1cm4gdGhpcy5JbnZpdGVBY3Rpb25zLmFjY2VwdEludml0ZShzZXJ2ZXJDYXJkLnByb3BzLmludml0ZV9jb2RlKTtcclxuXHJcbiAgICAgICAgYXdhaXQgZmV0Y2goYCR7dGhpcy5qb2luRW5kUG9pbnR9LyR7c2VydmVyQ2FyZC5wcm9wcy5zZXJ2ZXIuaWRlbnRpZmllcn1gLHtcclxuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgICAgICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXHJcbiAgICAgICAgICAgIG1vZGU6IFwiY29yc1wiLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc2VydmVyQ2FyZC5zZXRTdGF0ZSh7am9pbmVkOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29ubmVjdCgpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gc2VsZi53aW5kb3dPcHRpb25zO1xyXG4gICAgICAgIG9wdGlvbnMueCA9IE1hdGgucm91bmQod2luZG93LnNjcmVlblggKyB3aW5kb3cuaW5uZXJXaWR0aCAvIDIgLSBvcHRpb25zLndpZHRoIC8gMik7XHJcbiAgICAgICAgb3B0aW9ucy55ID0gTWF0aC5yb3VuZCh3aW5kb3cuc2NyZWVuWSArIHdpbmRvdy5pbm5lckhlaWdodCAvIDIgLSBvcHRpb25zLmhlaWdodCAvIDIpO1xyXG5cclxuICAgICAgICBzZWxmLmpvaW5XaW5kb3cgPSBuZXcgKHdpbmRvdy5yZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLkJyb3dzZXJXaW5kb3cpKG9wdGlvbnMpO1xyXG4gICAgICAgIGNvbnN0IHVybCA9IFwiaHR0cHM6Ly9hdXRoLmRpc2NvcmRzZXJ2ZXJzLmNvbS9jb25uZWN0P3Njb3Blcz1ndWlsZHMuam9pbiZwcmV2aW91c1VybD1odHRwczovL2F1dGguZGlzY29yZHNlcnZlcnMuY29tL2luZm9cIjtcclxuICAgICAgICBzZWxmLmpvaW5XaW5kb3cud2ViQ29udGVudHMub24oXCJkaWQtbmF2aWdhdGVcIiwgKGV2ZW50LCB1cmwpID0+IHtcclxuICAgICAgICAgICAgaWYgKHVybCAhPSBcImh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vaW5mb1wiKSByZXR1cm47XHJcbiAgICAgICAgICAgIHNlbGYuam9pbldpbmRvdy5jbG9zZSgpO1xyXG4gICAgICAgICAgICBzZWxmLmNoZWNrQ29ubmVjdGlvbigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHNlbGYuam9pbldpbmRvdy5sb2FkVVJMKHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHdpbmRvd09wdGlvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgd2lkdGg6IDUwMCxcclxuICAgICAgICAgICAgaGVpZ2h0OiA1NTAsXHJcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjMjgyYjMwXCIsXHJcbiAgICAgICAgICAgIHNob3c6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc2l6YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIG1heGltaXphYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgbWluaW1pemFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBhbHdheXNPblRvcDogdHJ1ZSxcclxuICAgICAgICAgICAgZnJhbWU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjZW50ZXI6IGZhbHNlLFxyXG4gICAgICAgICAgICB3ZWJQcmVmZXJlbmNlczoge1xyXG4gICAgICAgICAgICAgICAgbm9kZUludGVncmF0aW9uOiBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgYmRTZXJ2ZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VydmVyID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBcIkJldHRlckRpc2NvcmRcIixcclxuICAgICAgICAgICAgb25saW5lOiBcIjc1MDArXCIsXHJcbiAgICAgICAgICAgIG1lbWJlcnM6IFwiMjAwMDArXCIsXHJcbiAgICAgICAgICAgIGNhdGVnb3JpZXM6IFtcImNvbW11bml0eVwiLCBcInByb2dyYW1taW5nXCIsIFwic3VwcG9ydFwiXSxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiT2ZmaWNpYWwgQmV0dGVyRGlzY29yZCBzZXJ2ZXIgZm9yIHN1cHBvcnQgZXRjXCIsXHJcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IFwiODYwMDQ3NDQ5NjY5MTQwNDhcIixcclxuICAgICAgICAgICAgaWNvblVybDogXCJodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9pY29ucy84NjAwNDc0NDk2NjkxNDA0OC8yOTJlN2Y2YmZmZjJiNzFkZmQxM2U1MDhhODU5YWVkZC53ZWJwXCIsXHJcbiAgICAgICAgICAgIG5hdGl2ZWpvaW46IHRydWUsXHJcbiAgICAgICAgICAgIGludml0ZV9jb2RlOiBcIjBUbWZvNVpiT1JDUnFiQWRcIixcclxuICAgICAgICAgICAgcGlubmVkOiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBzZXJ2ZXIyID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBcIkxpZ2h0Y29yZFwiLFxyXG4gICAgICAgICAgICBvbmxpbmU6IFwiMzArXCIsXHJcbiAgICAgICAgICAgIG1lbWJlcnM6IFwiNTArXCIsXHJcbiAgICAgICAgICAgIGNhdGVnb3JpZXM6IFtcImNvbW11bml0eVwiLCBcInByb2dyYW1taW5nXCIsIFwic3VwcG9ydFwiXSxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiT2ZmaWNpYWwgTGlnaHRjb3JkIHNlcnZlciBmb3Igc3VwcG9ydCBldGNcIixcclxuICAgICAgICAgICAgaWRlbnRpZmllcjogXCI4NjAwNDc0NDk2NjkxNDA0OFwiLFxyXG4gICAgICAgICAgICBpY29uVXJsOiBcImh0dHBzOi8vYXZhdGFyczMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNjU2OTAwNTg/cz0yMDAmdj00XCIsXHJcbiAgICAgICAgICAgIG5hdGl2ZWpvaW46IHRydWUsXHJcbiAgICAgICAgICAgIGludml0ZV9jb2RlOiBcIjdlRmZmMkFcIixcclxuICAgICAgICAgICAgcGlubmVkOiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBndWlsZExpc3QgPSB0aGlzLlNvcnRlZEd1aWxkU3RvcmUuZ2V0RmxhdHRlbmVkR3VpbGRJZHMoKTtcclxuICAgICAgICBjb25zdCBkZWZhdWx0TGlzdCA9IHRoaXMuQXZhdGFyRGVmYXVsdHMuREVGQVVMVF9BVkFUQVJTO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXJ2ZXJDYXJkLCB7c2VydmVyOiBzZXJ2ZXIyLCBwaW5uZWQ6IHRydWUsIGpvaW46IHRoaXMuam9pbiwgZ3VpbGRMaXN0OiBndWlsZExpc3QsIGZhbGxiYWNrOiBkZWZhdWx0TGlzdFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1KV19KSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNlcnZlckNhcmQsIHtzZXJ2ZXI6IHNlcnZlciwgcGlubmVkOiB0cnVlLCBqb2luOiB0aGlzLmpvaW4sIGd1aWxkTGlzdDogZ3VpbGRMaXN0LCBmYWxsYmFjazogZGVmYXVsdExpc3RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNSldfSlcclxuICAgICAgICBdXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGVuZFBvaW50KCkge1xyXG4gICAgICAgIHJldHVybiBcImh0dHBzOi8vc2VhcmNoLmRpc2NvcmRzZXJ2ZXJzLmNvbVwiO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBqb2luRW5kUG9pbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiaHR0cHM6Ly9qLmRpc2NvcmRzZXJ2ZXJzLmNvbVwiO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb25uZWN0RW5kUG9pbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiaHR0cHM6Ly9qb2luLmRpc2NvcmRzZXJ2ZXJzLmNvbS9jb25uZWN0XCI7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY2hlY2tDb25uZWN0aW9uKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vaW5mb2Ase1xyXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgICAgICAgICAgICAgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiLFxyXG4gICAgICAgICAgICAgICAgbW9kZTogXCJjb3JzXCIsXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRDYXRlZ29yeTogMCxcclxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IHtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogMixcclxuICAgICAgICAgICAgICAgICAgICB1c2VyOiBkYXRhXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBzZWxmLnNlYXJjaChcIlwiLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXHJcbiAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6IFwiTm90IGNvbm5lY3RlZCB0byBkaXNjb3Jkc2VydmVycy5jb20hXCIsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRDYXRlZ29yeTogLTEsXHJcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcjogbnVsbFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2lkZWJhclZpZXcsIHtyZWY6IFwic2J2XCJ9LCB0aGlzLmNvbXBvbmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBzaWRlYmFyOiB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMuc2lkZWJhclxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjb250ZW50OiB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMuY29udGVudFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0b29sczoge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHMsIHtrZXk6IFwicHRcIiwgcmVmOiBcInRvb2xzXCIsIG9uQ2xpY2s6IHRoaXMuY2xvc2V9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2lkZWJhcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInNpZGViYXJcIiwga2V5OiBcInBzXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS10YWItYmFyIFNJREVcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLXRhYi1iYXItaGVhZGVyXCIsIHN0eWxlOiB7Zm9udFNpemU6IFwiMTZweFwifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgXCJQdWJsaWMgU2VydmVyc1wiXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhclNlcGFyYXRvciwgbnVsbCksXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhclNlcGFyYXRvciwgbnVsbCksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFySGVhZGVyLCB7dGV4dDogXCJDYXRlZ29yaWVzXCJ9KSxcclxuICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlCdXR0b25zLm1hcCgodmFsdWUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJJdGVtLCB7aWQ6IGluZGV4LCBvbkNsaWNrOiB0aGlzLmNoYW5nZUNhdGVnb3J5LCBrZXk6IGluZGV4LCB0ZXh0OiB2YWx1ZSwgc2VsZWN0ZWQ6IHRoaXMuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeSA9PT0gaW5kZXh9KTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhclNlcGFyYXRvciwgbnVsbCksXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvb3RlcixcclxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2VhcmNoSW5wdXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1mb3JtLWl0ZW1cIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLXRleHQtaW5wdXQgZmxleC12ZXJ0aWNhbFwiLCBzdHlsZToge3dpZHRoOiBcIjE3MnB4XCIsIG1hcmdpbkxlZnQ6IFwiMTBweFwifX0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCB7cmVmOiBcInNlYXJjaGlucHV0XCIsIG9uS2V5RG93bjogdGhpcy5zZWFyY2hLZXlEb3duLCBvbkNoYW5nZTogKCkgPT4ge30sIHR5cGU6IFwidGV4dFwiLCBjbGFzc05hbWU6IFwiaW5wdXQgZGVmYXVsdFwiLCBwbGFjZWhvbGRlcjogXCJTZWFyY2guLi5cIiwgbWF4TGVuZ3RoOiBcIjUwXCJ9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBzZWFyY2hLZXlEb3duKGUpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBpZiAoc2VsZi5zdGF0ZS5sb2FkaW5nIHx8IGUud2hpY2ggIT09IDEzKSByZXR1cm47XHJcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXHJcbiAgICAgICAgICAgIHRpdGxlOiBcIkxvYWRpbmcuLi5cIixcclxuICAgICAgICAgICAgdGVybTogZS50YXJnZXQudmFsdWVcclxuICAgICAgICB9KTtcclxuICAgICAgICBsZXQgcXVlcnkgPSBgP3Rlcm09JHtlLnRhcmdldC52YWx1ZX1gO1xyXG4gICAgICAgIGlmIChzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnkgIT09IDApIHtcclxuICAgICAgICAgICAgcXVlcnkgKz0gYCZjYXRlZ29yeT0ke3NlbGYuY2F0ZWdvcnlCdXR0b25zW3NlbGYuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeV19YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2VsZi5zZWFyY2gocXVlcnksIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjYXRlZ29yeUJ1dHRvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIFtcIkFsbFwiLCBcIkZQUyBHYW1lc1wiLCBcIk1NTyBHYW1lc1wiLCBcIlN0cmF0ZWd5IEdhbWVzXCIsIFwiTU9CQSBHYW1lc1wiLCBcIlJQRyBHYW1lc1wiLCBcIlRhYmxldG9wIEdhbWVzXCIsIFwiU2FuZGJveCBHYW1lc1wiLCBcIlNpbXVsYXRpb24gR2FtZXNcIiwgXCJNdXNpY1wiLCBcIkNvbW11bml0eVwiLCBcIkxhbmd1YWdlXCIsIFwiUHJvZ3JhbW1pbmdcIiwgXCJPdGhlclwiXTtcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VDYXRlZ29yeShpZCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGlmIChzZWxmLnN0YXRlLmxvYWRpbmcpIHJldHVybjtcclxuICAgICAgICBzZWxmLnJlZnMuc2VhcmNoaW5wdXQudmFsdWUgPSBcIlwiO1xyXG4gICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICBzZWxlY3RlZENhdGVnb3J5OiBpZCxcclxuICAgICAgICAgICAgdGl0bGU6IFwiTG9hZGluZy4uLlwiLFxyXG4gICAgICAgICAgICB0ZXJtOiBudWxsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGlkID09PSAwKSB7XHJcbiAgICAgICAgICAgIHNlbGYuc2VhcmNoKFwiXCIsIHRydWUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNlbGYuc2VhcmNoKGA/Y2F0ZWdvcnk9JHtzZWxmLmNhdGVnb3J5QnV0dG9uc1tpZF19YCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbnRlbnQoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgY29uc3QgZ3VpbGRMaXN0ID0gdGhpcy5Tb3J0ZWRHdWlsZFN0b3JlLmdldEZsYXR0ZW5lZEd1aWxkSWRzKCk7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdExpc3QgPSB0aGlzLkF2YXRhckRlZmF1bHRzLkRFRkFVTFRfQVZBVEFSUztcclxuICAgICAgICBpZiAoc2VsZi5zdGF0ZS5jb25uZWN0aW9uLnN0YXRlID09PSAxKSByZXR1cm4gc2VsZi5ub3RDb25uZWN0ZWQ7XHJcbiAgICAgICAgbGV0IGNvbHVtbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW5EZWZhdWx0KVswXVxyXG4gICAgICAgIHJldHVybiBbQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7cmVmOiBcImNvbnRlbnRcIiwga2V5OiBcInBjXCIsIGNsYXNzTmFtZTogY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgXCIrY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiBzZWxmLnN0YXRlLnRpdGxlfSksXHJcbiAgICAgICAgICAgIHNlbGYuYmRTZXJ2ZXIsXHJcbiAgICAgICAgICAgIHNlbGYuc3RhdGUuc2VydmVycy5tYXAoKHNlcnZlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXJ2ZXJDYXJkLCB7a2V5OiBzZXJ2ZXIuaWRlbnRpZmllciwgc2VydmVyOiBzZXJ2ZXIsIGpvaW46IHNlbGYuam9pbiwgZ3VpbGRMaXN0OiBndWlsZExpc3QsIGZhbGxiYWNrOiBkZWZhdWx0TGlzdFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1KV19KTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHNlbGYuc3RhdGUubmV4dCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAge3R5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuc3RhdGUubG9hZGluZykgcmV0dXJuO3NlbGYuc2V0U3RhdGUoe2xvYWRpbmc6IHRydWV9KTsgc2VsZi5zZWFyY2goc2VsZi5zdGF0ZS5uZXh0LCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgY2xhc3NOYW1lOiBcInVpLWJ1dHRvbiBmaWxsZWQgYnJhbmQgc21hbGwgZ3Jvd1wiLCBzdHlsZToge3dpZHRoOiBcIjEwMCVcIiwgbWFyZ2luVG9wOiBcIjEwcHhcIiwgbWFyZ2luQm90dG9tOiBcIjEwcHhcIn19LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZS5sb2FkaW5nID8gXCJMb2FkaW5nXCIgOiBcIkxvYWQgTW9yZVwiXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHNlbGYuc3RhdGUuc2VydmVycy5sZW5ndGggPiAwICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogc2VsZi5zdGF0ZS50aXRsZX0pXHJcbiAgICAgICAgKV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG5vdENvbm5lY3RlZCgpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICAvL3JldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwgeyB0ZXh0OiBzZWxmLnN0YXRlLnRpdGxlIH0pO1xyXG4gICAgICAgIGxldCBjb2x1bW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250ZW50Q29sdW1uRGVmYXVsdClbMF1cclxuICAgICAgICByZXR1cm4gW0JEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2tleTogXCJuY2NcIiwgcmVmOiBcImNvbnRlbnRcIiwgY2xhc3NOYW1lOiBjb2x1bW5Nb2R1bGUuY29udGVudENvbHVtbitcIiBcIitjb2x1bW5Nb2R1bGUuY29udGVudENvbHVtbitcIiBjb250ZW50LWNvbHVtbiBkZWZhdWx0XCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImgyXCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGl0bGUgaDIgbWFyZ2luLXJlc2V0IG1hcmdpbi1ib3R0b20tMjBcIn0sXHJcbiAgICAgICAgICAgICAgICBcIk5vdCBjb25uZWN0ZWQgdG8gZGlzY29yZHNlcnZlcnMuY29tIVwiLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBzZWxmLmNvbm5lY3QsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJ1aS1idXR0b24gZmlsbGVkIGJyYW5kIHNtYWxsIGdyb3dcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5IZWlnaHQ6IFwiMThweFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luTGVmdDogXCIxMHB4XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lSGVpZ2h0OiBcIjE0cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNvbm5lY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKSwgc2VsZi5iZFNlcnZlclxyXG4gICAgICAgICldO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBmb290ZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS10YWItYmFyLWhlYWRlclwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJhXCIsXHJcbiAgICAgICAgICAgICAgICB7aHJlZjogXCJodHRwczovL2Rpc2NvcmRzZXJ2ZXJzLmNvbVwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgXCJEaXNjb3Jkc2VydmVycy5jb21cIlxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29ubmVjdGlvbigpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBjb25zdCB7Y29ubmVjdGlvbn0gPSBzZWxmLnN0YXRlO1xyXG4gICAgICAgIGlmIChjb25uZWN0aW9uLnN0YXRlICE9PSAyKSByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJzcGFuXCIsXHJcbiAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJTZXBhcmF0b3IsIG51bGwpLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcInNwYW5cIixcclxuICAgICAgICAgICAgICAgIHtzdHlsZToge2NvbG9yOiBcIiNiOWJiYmVcIiwgZm9udFNpemU6IFwiMTBweFwiLCBtYXJnaW5MZWZ0OiBcIjEwcHhcIn19LFxyXG4gICAgICAgICAgICAgICAgXCJDb25uZWN0ZWQgYXM6IFwiLFxyXG4gICAgICAgICAgICAgICAgYCR7Y29ubmVjdGlvbi51c2VyLnVzZXJuYW1lfSMke2Nvbm5lY3Rpb24udXNlci5kaXNjcmltaW5hdG9yfWBcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtzdHlsZToge3BhZGRpbmc6IFwiNXB4IDEwcHggMCAxMHB4XCJ9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtzdHlsZToge3dpZHRoOiBcIjEwMCVcIiwgbWluSGVpZ2h0OiBcIjIwcHhcIn0sIHR5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJ1aS1idXR0b24gZmlsbGVkIGJyYW5kIHNtYWxsIGdyb3dcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wiLCBvbkNsaWNrOiBzZWxmLmNvbm5lY3R9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlJlY29ubmVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxufVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19TZXJ2ZXJDYXJkIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICBpZiAoIXRoaXMucHJvcHMuc2VydmVyLmljb25VcmwpIHRoaXMucHJvcHMuc2VydmVyLmljb25VcmwgPSB0aGlzLnByb3BzLmZhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGltYWdlRXJyb3I6IGZhbHNlLFxyXG4gICAgICAgICAgICBqb2luZWQ6IHRoaXMucHJvcHMuZ3VpbGRMaXN0LmluY2x1ZGVzKHRoaXMucHJvcHMuc2VydmVyLmlkZW50aWZpZXIpXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge3NlcnZlcn0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIGxldCBjYXJkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY2FyZCAmJiBlLmNhcmRQcmltYXJ5KVswXVxyXG4gICAgICAgIGxldCBmbGV4TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZmxleENoaWxkICYmIGUuX2hvcml6b250YWxSZXZlcnNlKVswXVxyXG4gICAgICAgIGxldCB3cmFwTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubm9XcmFwICYmICFlLnN0cmVhbWVyTW9kZUVuYWJsZWQpWzBdXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIiwgLy8gY2FyZFByaW1hcnktMUh2LXRvXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IGAke2NhcmRNb2R1bGUuY2FyZH0gJHtjYXJkTW9kdWxlLmNhcmRQcmltYXJ5fSAke0JETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTgpWzBdLm1hcmdpbkJvdHRvbTh9IGJkLXNlcnZlci1jYXJkJHtzZXJ2ZXIucGlubmVkID8gXCIgYmQtc2VydmVyLWNhcmQtcGlubmVkXCIgOiBcIlwifWB9LFxyXG4gICAgICAgICAgICAvLyBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAvLyBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgLy8geyBjbGFzc05hbWU6IFwiZmxleC0xeE1RZzUgZmxleC0xTzFHS1kgaG9yaXpvbnRhbC0xYWU5Y2kgaG9yaXpvbnRhbC0yRUVFblkgZmxleC0xTzFHS1kgZGlyZWN0aW9uUm93LTN2M3RmRyBqdXN0aWZ5U3RhcnQtMnlJWm8wIGFsaWduU3RyZXRjaC0xaHd4TWEgbm9XcmFwLTNqeW52NlwiIH0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwge3JlZjogXCJpbWdcIiwgY2xhc3NOYW1lOiBcImJkLXNlcnZlci1pbWFnZVwiLCBzcmM6IHNlcnZlci5pY29uVXJsLCBvbkVycm9yOiB0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcyksIGRyYWdnYWJsZTogZmFsc2V9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IGZsZXhNb2R1bGUuZmxleENoaWxkK1wiIGJkLXNlcnZlci1jb250ZW50XCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogZmxleE1vZHVsZS5ob3Jpem9udGFsK1wiIFwiK3dyYXBNb2R1bGUubm9XcmFwK1wiIGJkLXNlcnZlci1oZWFkZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiaDVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiaDUtMThfMW5kIGRlZmF1bHRDb2xvci0xX2FqWDAgbWFyZ2luLXJlc2V0IGJkLXNlcnZlci1uYW1lXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLm5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJoNVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJoNS0xOF8xbmQgZGVmYXVsdENvbG9yLTFfYWpYMCBtYXJnaW4tcmVzZXQgYmQtc2VydmVyLW1lbWJlci1jb3VudFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5tZW1iZXJzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgTWVtYmVyc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogZmxleE1vZHVsZS5ob3Jpem9udGFsK1wiIFwiK3dyYXBNb2R1bGUubm9XcmFwfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwic2Nyb2xsZXJXcmFwLTJsSkVrZCBzY3JvbGxlclRoZW1lZC0yb2VudXMgdGhlbWVHaG9zdEhhaXJsaW5lLURCRC0yZCBzY3JvbGxlckZhZGUtMUlqdzV5IGJkLXNlcnZlci1kZXNjcmlwdGlvbi1jb250YWluZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInNjcm9sbGVyLTJGS0ZQRyBzY3JvbGxlciBiZC1zZXJ2ZXItZGVzY3JpcHRpb25cIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5kZXNjcmlwdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiZmxleC0xeE1RZzUgZmxleC0xTzFHS1kgaG9yaXpvbnRhbC0xYWU5Y2kgaG9yaXpvbnRhbC0yRUVFblkgZGlyZWN0aW9uUm93LTN2M3RmRyBub1dyYXAtM2p5bnY2IGJkLXNlcnZlci1mb290ZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImZsZXhDaGlsZC1mYW9WVzMgYmQtc2VydmVyLXRhZ3NcIiwgc3R5bGU6IHtmbGV4OiBcIjEgMSBhdXRvXCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5jYXRlZ29yaWVzLmpvaW4oXCIsIFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmpvaW5lZCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3R5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJidXR0b24tMzhhU2NyIGxvb2tGaWxsZWQtMUd4MDBQIGNvbG9yQnJhbmQtM3BYcjkxIHNpemVNaW4tMW1KZDF4IGdyb3ctcTc3T05OIGNvbG9yR3JlZW4tMjlpQUtZXCIsIHN0eWxlOiB7bWluSGVpZ2h0OiBcIjEycHhcIiwgbWFyZ2luVG9wOiBcIjRweFwiLCBiYWNrZ3JvdW5kQ29sb3I6IFwiIzNhYzE1Y1wifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkpvaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5lcnJvciAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3R5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJidXR0b24tMzhhU2NyIGxvb2tGaWxsZWQtMUd4MDBQIGNvbG9yQnJhbmQtM3BYcjkxIHNpemVNaW4tMW1KZDF4IGdyb3ctcTc3T05OIGRpc2FibGVkLTlhRjJ1Z1wiLCBzdHlsZToge21pbkhlaWdodDogXCIxMnB4XCIsIG1hcmdpblRvcDogXCI0cHhcIiwgYmFja2dyb3VuZENvbG9yOiBcIiNjMTNhM2FcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJFcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICFzZXJ2ZXIuZXJyb3IgJiYgIXRoaXMuc3RhdGUuam9pbmVkICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dHlwZTogXCJidXR0b25cIiwgY2xhc3NOYW1lOiBcImJ1dHRvbi0zOGFTY3IgbG9va0ZpbGxlZC0xR3gwMFAgY29sb3JCcmFuZC0zcFhyOTEgc2l6ZU1pbi0xbUpkMXggZ3Jvdy1xNzdPTk5cIiwgc3R5bGU6IHttaW5IZWlnaHQ6IFwiMTJweFwiLCBtYXJnaW5Ub3A6IFwiNHB4XCJ9LCBvbkNsaWNrOiAoKSA9PiB7dGhpcy5qb2luKCk7fX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkpvaW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAvLyApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVFcnJvcigpIHtcclxuICAgICAgICB0aGlzLnByb3BzLnNlcnZlci5pY29uVXJsID0gdGhpcy5wcm9wcy5mYWxsYmFjaztcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtpbWFnZUVycm9yOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgam9pbigpIHtcclxuICAgICAgICB0aGlzLnByb3BzLmpvaW4odGhpcyk7XHJcbiAgICAgICAgLy90aGlzLnNldFN0YXRlKHtqb2luZWQ6IHRydWV9KTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5pbXBvcnQgU2Nyb2xsZXIgZnJvbSBcIi4uL3Njcm9sbGVyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2lkZWJhclZpZXcgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge3NpZGViYXIsIGNvbnRlbnQsIHRvb2xzfSA9IHRoaXMucHJvcHMuY2hpbGRyZW47XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJzdGFuZGFyZFNpZGViYXJWaWV3LTNGMUk3aSB1aS1zdGFuZGFyZC1zaWRlYmFyLXZpZXdcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInNpZGViYXJSZWdpb24tVkZUVWtOIHNpZGViYXItcmVnaW9uXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbGVyLCB7a2V5OiBcInNpZGViYXJTY3JvbGxlclwiLCByZWY6IFwic2lkZWJhclNjcm9sbGVyXCIsIHNpZGViYXI6IHRydWUsIGZhZGU6IHNpZGViYXIuZmFkZSB8fCB0cnVlLCBkYXJrOiBzaWRlYmFyLmRhcmsgfHwgdHJ1ZX0sIHNpZGViYXIuY29tcG9uZW50KVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJjb250ZW50UmVnaW9uLTNuRHVZeSBjb250ZW50LXJlZ2lvblwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImNvbnRlbnRUcmFuc2l0aW9uV3JhcC0zaHFPRVcgY29udGVudC10cmFuc2l0aW9uLXdyYXBcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwic2Nyb2xsZXJXcmFwLTJsSkVrZCBmaXJlZm94Rml4U2Nyb2xsRmxleC1jbkkyaXggY29udGVudFJlZ2lvblNjcm9sbGVyV3JhcC0zWVpYZG0gY29udGVudC1yZWdpb24tc2Nyb2xsZXItd3JhcCBzY3JvbGxlclRoZW1lZC0yb2VudXMgdGhlbWVHaG9zdC0yOE1TbjAgc2Nyb2xsZXJUcmFjay0xWklwc3ZcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInNjcm9sbGVyLTJGS0ZQRyBmaXJlZm94Rml4U2Nyb2xsRmxleC1jbkkyaXggY29udGVudFJlZ2lvblNjcm9sbGVyLTI2bmMxZSBjb250ZW50LXJlZ2lvbi1zY3JvbGxlciBzY3JvbGxlclwiLCByZWY6IFwiY29udGVudFNjcm9sbGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiY29udGVudENvbHVtbi0yaHJJWUggY29udGVudENvbHVtbkRlZmF1bHQtMVZRa0dNIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIn0sIGNvbnRlbnQuY29tcG9uZW50KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xzLmNvbXBvbmVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfUmVsb2FkSWNvbiBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xyXG4gICAgICAgICAgICAgICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcclxuICAgICAgICAgICAgICAgIHZpZXdCb3g6IFwiMCAwIDI0IDI0XCIsXHJcbiAgICAgICAgICAgICAgICBmaWxsOiBcIiNkY2RkZGVcIixcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1yZWxvYWQgXCIgKyB0aGlzLnByb3BzLmNsYXNzTmFtZSxcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6IHRoaXMucHJvcHMub25DbGljayxcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7d2lkdGg6IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjI0cHhcIiwgaGVpZ2h0OiB0aGlzLnByb3BzLnNpemUgfHwgXCIyNHB4XCJ9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2Q6IFwiTTE3LjY1IDYuMzVDMTYuMiA0LjkgMTQuMjEgNCAxMiA0Yy00LjQyIDAtNy45OSAzLjU4LTcuOTkgOHMzLjU3IDggNy45OSA4YzMuNzMgMCA2Ljg0LTIuNTUgNy43My02aC0yLjA4Yy0uODIgMi4zMy0zLjA0IDQtNS42NSA0LTMuMzEgMC02LTIuNjktNi02czIuNjktNiA2LTZjMS42NiAwIDMuMTQuNjkgNC4yMiAxLjc4TDEzIDExaDdWNGwtMi4zNSAyLjM1elwifSksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6IFwibm9uZVwiLCBkOiBcIk0wIDBoMjR2MjRIMHpcIn0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2Nyb2xsZXIgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgLy9zY3JvbGxlcldyYXAtMmxKRWtkIHNjcm9sbGVyVGhlbWVkLTJvZW51cyB0aGVtZUdob3N0SGFpcmxpbmUtREJELTJkIHNjcm9sbGVyRmFkZS0xSWp3NXlcclxuICAgICAgICBsZXQgc2Nyb2xsZXJNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsZXJIb3Jpem9udGFsKVswXVxyXG4gICAgICAgIGxldCBzY3JvbGxlck1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaWRlYmFyUmVnaW9uU2Nyb2xsZXIpWzBdXHJcbiAgICAgICAgbGV0IHdyYXBwZXJDbGFzcyA9IGAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcldyYXB9ICR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyVGhlbWVkfSAke3Njcm9sbGVyTW9kdWxlMS50aGVtZUdob3N0SGFpcmxpbmV9JHt0aGlzLnByb3BzLmZhZGUgPyBcIiBcIitzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJGYWRlIDogXCJcIn1gO1xyXG4gICAgICAgIGxldCBzY3JvbGxlckNsYXNzID0gc2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyK1wiIHNjcm9sbGVyXCI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVjayAqL1xyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLnNpZGViYXIpIHNjcm9sbGVyQ2xhc3MgKz0gYCAke3Njcm9sbGVyTW9kdWxlMi5zaWRlYmFyUmVnaW9uU2Nyb2xsZXJ9IHNpZGViYXItcmVnaW9uLXNjcm9sbGVyYFxyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLmNvbnRlbnRDb2x1bW4pIHtcclxuICAgICAgICAgICAgc2Nyb2xsZXJDbGFzcyArPSBcIiBcIitzY3JvbGxlck1vZHVsZTIuY29udGVudFJlZ2lvblNjcm9sbGVyK1wiIGNvbnRlbnQtcmVnaW9uLXNjcm9sbGVyXCI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWNrICovXHJcbiAgICAgICAgICAgIHdyYXBwZXJDbGFzcyA9IGAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcldyYXB9ICR7c2Nyb2xsZXJNb2R1bGUyLmNvbnRlbnRSZWdpb25TY3JvbGxlcldyYXB9IGNvbnRlbnQtcmVnaW9uLXNjcm9sbGVyLXdyYXAgICR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyVGhlbWVkfSAke3Njcm9sbGVyTW9kdWxlMS50aGVtZUdob3N0fSAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlclRyYWNrfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHtjaGlsZHJlbn0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtrZXk6IFwic2Nyb2xsZXJ3cmFwXCIsIGNsYXNzTmFtZTogd3JhcHBlckNsYXNzfSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtrZXk6IFwic2Nyb2xsZXJcIiwgcmVmOiBcInNjcm9sbGVyXCIsIGNsYXNzTmFtZTogc2Nyb2xsZXJDbGFzc30sXHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlblxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5pbXBvcnQgU2V0dGluZ3NHcm91cCBmcm9tIFwiLi9zZXR0aW5nc0dyb3VwXCI7XHJcbmltcG9ydCBNYXJnaW5Ub3AgZnJvbSBcIi4vbWFyZ2ludG9wXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2VjdGlvbmVkU2V0dGluZ3NQYW5lbCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5zZWN0aW9ucy5tYXAoKHNlY3Rpb24sIGkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgICAgIGkgIT09IDAgPyBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoTWFyZ2luVG9wLCB7fSkgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzR3JvdXAsIE9iamVjdC5hc3NpZ24oe30sIHNlY3Rpb24sIHtvbkNoYW5nZTogdGhpcy5wcm9wcy5vbkNoYW5nZX0pKVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxufSIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuaW1wb3J0IFNldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xyXG5pbXBvcnQgU3dpdGNoIGZyb20gXCIuL3N3aXRjaFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1NldHRpbmdzR3JvdXAgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge3RpdGxlLCBzZXR0aW5ncywgYnV0dG9ufSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgY29uc3QgYnV0dG9uQ29tcG9uZW50ID0gYnV0dG9uID8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtrZXk6IFwidGl0bGUtYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJiZC1wZmJ0blwiLCBvbkNsaWNrOiBidXR0b24ub25DbGlja30sIGJ1dHRvbi50aXRsZSkgOiBudWxsO1xyXG4gICAgICAgIHJldHVybiBbQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiB0aXRsZX0pLFxyXG4gICAgICAgICAgICAgICAgYnV0dG9uQ29tcG9uZW50LFxyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3MubWFwKHNldHRpbmcgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU3dpdGNoLCB7aWQ6IHNldHRpbmcuaWQsIGtleTogc2V0dGluZy5pZCwgZGF0YTogc2V0dGluZywgY2hlY2tlZDogc2V0dGluZ3NDb29raWVbc2V0dGluZy5pZF0sIG9uQ2hhbmdlOiAoaWQsIGNoZWNrZWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZShpZCwgY2hlY2tlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfX0pO1xyXG4gICAgICAgICAgICAgICAgfSldO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19TZXR0aW5nc1RpdGxlIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuLy9oMi0yZ1dFLW8gdGl0bGUtM3NaV1lRIHNpemUxNi0xNGNHejUgaGVpZ2h0MjAtbU8yZUlOIHdlaWdodFNlbWlCb2xkLU5KZXh6aSBkYS1oMiBkYS10aXRsZSBkYS1zaXplMTYgZGEtaGVpZ2h0MjAgZGEtd2VpZ2h0U2VtaUJvbGQgZGVmYXVsdENvbG9yLTFfYWpYMCBkYS1kZWZhdWx0Q29sb3IgbWFyZ2luVG9wNjAtM1BHYnRLIGRhLW1hcmdpblRvcDYwIG1hcmdpbkJvdHRvbTIwLTMycUlENyBkYS1tYXJnaW5Cb3R0b20yMFxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiaDJcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRpdGxlIGgyIG1hcmdpbi1yZXNldCBtYXJnaW4tYm90dG9tLTIwXCJ9LFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLnRleHRcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi9jb21wb25lbnRzL3N3aXRjaFwiO1xyXG5cclxubGV0IGNsYXNzbmFtZXMgPSBbXVxyXG5mdW5jdGlvbiBnZXRDbGFzc05hbWUobmFtZSl7XHJcbiAgICBsZXQgY2xhc3NOYW1lID0gY2xhc3NuYW1lcy5maW5kKGUgPT4gZS5zdGFydHNXaXRoKG5hbWUrXCItXCIpKVxyXG4gICAgaWYoY2xhc3NOYW1lKXJldHVybiBjbGFzc05hbWVcclxuICAgIGNsYXNzTmFtZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm5hbWUpWzBdXHJcbiAgICBjbGFzc25hbWVzLnB1c2goY2xhc3NOYW1lKVxyXG4gICAgcmV0dXJuIGNsYXNzTmFtZVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTd2l0Y2hJdGVtIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZSgpIHtcclxuICAgICAgICB0aGlzLnByb3BzLmNoZWNrZWQgPSAhdGhpcy5wcm9wcy5jaGVja2VkO1xyXG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UodGhpcy5wcm9wcy5pZCwgdGhpcy5wcm9wcy5jaGVja2VkKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgbGV0IHt0ZXh0LCBpbmZvfSA9IHRoaXMucHJvcHMuZGF0YTtcclxuICAgICAgICBpZighY2xhc3NuYW1lcy5maW5kKGUgPT4gZS5zdGFydHNXaXRoKFwiYmV0YS1cIikpKXtcclxuICAgICAgICAgICAgY2xhc3NuYW1lcy5wdXNoKEJETW9kdWxlcy5nZXQoZSA9PiBlLmJldGEgJiYgKCFlLmNvbnRhaW5lciAmJiAhZS51c2VyU2V0dGluZ3NWb2ljZSkpWzBdLmJldGEpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHRoaXMucHJvcHMuZGF0YS5leHBlcmltZW50YWwpe1xyXG4gICAgICAgICAgICBpbmZvID0gW1xyXG4gICAgICAgICAgICAgICAgaW5mbyxcclxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdXBcIiwge2NsYXNzTmFtZTogZ2V0Q2xhc3NOYW1lKFwiYmV0YVwiKX0sIFwiKEVYUEVSSU1FTlRBTClcIilcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidWktZmxleCBmbGV4LXZlcnRpY2FsIGZsZXgtanVzdGlmeS1zdGFydCBmbGV4LWFsaWduLXN0cmV0Y2ggZmxleC1ub3dyYXAgdWktc3dpdGNoLWl0ZW1cIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZsZXggZmxleC1ob3Jpem9udGFsIGZsZXgtanVzdGlmeS1zdGFydCBmbGV4LWFsaWduLXN0cmV0Y2ggZmxleC1ub3dyYXBcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoM1wiLCB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGl0bGUgaDMgbWFyZ2luLXJlc2V0IG1hcmdpbi1yZXNldCB1aS1mbGV4LWNoaWxkXCJ9LCB0ZXh0KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTd2l0Y2gsIHtvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgY2hlY2tlZDogdGhpcy5wcm9wcy5jaGVja2VkfSlcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidWktZm9ybS10ZXh0IHN0eWxlLWRlc2NyaXB0aW9uIG1hcmdpbi10b3AtNFwiLCBzdHlsZToge2ZsZXg6IFwiMSAxIGF1dG9cIn19LCBpbmZvKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1RhYkJhckhlYWRlciBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOiBcInVpLXRhYi1iYXItaGVhZGVyXCJ9LCB0aGlzLnByb3BzLnRleHQsIHRoaXMucHJvcHMuYnV0dG9uKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfVGFiQmFySXRlbSBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbFN0YXRlKCk7XHJcbiAgICAgICAgdGhpcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0aGlzLnByb3BzLnNlbGVjdGVkIHx8IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogYHVpLXRhYi1iYXItaXRlbSR7dGhpcy5wcm9wcy5zZWxlY3RlZCA/IFwiIHNlbGVjdGVkXCIgOiBcIlwifWAsIG9uQ2xpY2s6IHRoaXMub25DbGlja30sXHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMudGV4dFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljaygpIHtcclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkNsaWNrKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25DbGljayh0aGlzLnByb3BzLmlkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1RhYkJhclNlcGFyYXRvciBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJ1aS10YWItYmFyLXNlcGFyYXRvciBtYXJnaW4tdG9wLTggbWFyZ2luLWJvdHRvbS04XCJ9KTtcclxuICAgIH1cclxufSIsIlwidXNlIHN0cmljdFwiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5yZWFjdFxyXG5cclxuY29uc3QgaW50ZXJ2YWxNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuSW50ZXJ2YWwpWzBdXHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29tcG9uZW50LCBNZXNzYWdlcykge1xyXG4gICAgY2xhc3MgVGltZVJlbmRlciBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xyXG4gICAgICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICAgICAgc3VwZXIocHJvcHMpXHJcbiAgICAgICAgICAgIHRoaXMuX2ludGVydmFsID0gbmV3IGludGVydmFsTW9kdWxlMS5JbnRlcnZhbCgpXHJcblxyXG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5nZXRVcGRhdGVkVGltZSgpKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29tcG9uZW50RGlkTW91bnQoKXtcclxuICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICAgICB0aGlzLl9pbnRlcnZhbC5zdGFydCgxZTMsIChmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnNldFN0YXRlKHNlbGYuZ2V0VXBkYXRlZFRpbWUoKSlcclxuICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpe1xyXG4gICAgICAgICAgICB0aGlzLl9pbnRlcnZhbC5zdG9wKClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbXBvbmVudERpZFVwZGF0ZShhY3Rpdml0eSl7XHJcbiAgICAgICAgICAgIGlmKGFjdGl2aXR5LnRpbWVzdGFtcHMuZW5kID09PSB0aGlzLnByb3BzLnRpbWVzdGFtcHMuZW5kICYmIGFjdGl2aXR5LnRpbWVzdGFtcHMuc3RhcnQgPT09IHRoaXMucHJvcHMudGltZXN0YW1wcy5zdGFydClyZXR1cm5cclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh0aGlzLmdldFVwZGF0ZWRUaW1lKCkpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnZXRVcGRhdGVkVGltZSgpe1xyXG4gICAgICAgICAgICBsZXQgdGltZXN0YW1wcyA9IHRoaXMucHJvcHMudGltZXN0YW1wc1xyXG4gICAgICAgICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKSAvIDFlMztcclxuICAgICAgICAgICAgaWYobnVsbCAhPSB0aW1lc3RhbXBzLmVuZCl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXREaWZmKG5vdywgY2hlY2tVbml4KHRpbWVzdGFtcHMuZW5kKSAvIDFlMylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihudWxsICE9IHRpbWVzdGFtcHMuc3RhcnQpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGlmZihjaGVja1VuaXgodGltZXN0YW1wcy5zdGFydCkgLyAxZTMsIG5vdylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgaG91cnM6IDAsXHJcbiAgICAgICAgICAgICAgICBtaW51dGVzOiAwLFxyXG4gICAgICAgICAgICAgICAgc2Vjb25kczogMFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZW5kZXJUaW1lKG51bWJlciwgcmVtb3ZlWmVybyl7XHJcbiAgICAgICAgICAgIGlmKHJlbW92ZVplcm8gPT09IHVuZGVmaW5lZClyZW1vdmVaZXJvID0gZmFsc2VcclxuICAgICAgICAgICAgaWYocmVtb3ZlWmVybyAmJiBudW1iZXIgPD0gMClyZXR1cm4gLTFcclxuICAgICAgICAgICAgaWYobnVtYmVyIDwgMTApcmV0dXJuIFwiMFwiK251bWJlclxyXG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnZXREaWZmKHRpbWVzdGFtcCwgbm93KXtcclxuICAgICAgICAgICAgbGV0IGhvdXJzID0gTWF0aC5tYXgobm93IC0gdGltZXN0YW1wLCAwKVxyXG4gICAgICAgICAgICBsZXQgc2Vjb25kcyA9IE1hdGguZmxvb3IoaG91cnMpICUgNjBcclxuICAgICAgICAgICAgbGV0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKGhvdXJzIC8gNjApICUgNjBcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGhvdXJzOiBNYXRoLmZsb29yKGhvdXJzIC8gMzYwMCkgJSAyNCxcclxuICAgICAgICAgICAgICAgIG1pbnV0ZXMsXHJcbiAgICAgICAgICAgICAgICBzZWNvbmRzXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlbmRlcigpe1xyXG4gICAgICAgICAgICBsZXQgcHJvcHMgPSB0aGlzLnByb3BzXHJcbiAgICAgICAgICAgIGxldCB0aW1lc3RhbXBzID0gcHJvcHMudGltZXN0YW1wc1xyXG5cclxuICAgICAgICAgICAgbGV0IHVzZWRQcm9wcyA9IGZ1bmN0aW9uKHByb3BzLCBpdGVtcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gcHJvcHMpIHJldHVybiB7fTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgdGltZXN0YW1wcyA9IHt9XHJcbiAgICAgICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHByb3BzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBrZXkgPSBrZXlzW2ldXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIWl0ZW1zLmluZGV4T2Yoa2V5KSA+PSAwKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wc1trZXldID0gcHJvcHNba2V5XVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGltZXN0YW1wc1xyXG4gICAgICAgICAgICB9KHByb3BzLCBbXCJ0aW1lc3RhbXBzXCJdKVxyXG5cclxuICAgICAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZVxyXG4gICAgICAgICAgICBsZXQgaG91cnMgPSBzdGF0ZS5ob3Vyc1xyXG4gICAgICAgICAgICBsZXQgbWludXRlcyA9IHN0YXRlLm1pbnV0ZXNcclxuICAgICAgICAgICAgbGV0IHNlY29uZHMgPSBzdGF0ZS5zZWNvbmRzXHJcbiAgICAgICAgICAgIGxldCBkYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgaG91cnM6IHRoaXMucmVuZGVyVGltZShob3VycywgITApLFxyXG4gICAgICAgICAgICAgICAgbWludXRlczogdGhpcy5yZW5kZXJUaW1lKG1pbnV0ZXMpLFxyXG4gICAgICAgICAgICAgICAgc2Vjb25kczogdGhpcy5yZW5kZXJUaW1lKHNlY29uZHMpXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmKHRpbWVzdGFtcHMuZW5kICE9PSBudWxsKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGNvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7fSwgdXNlZFByb3BzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogTWVzc2FnZXMuVVNFUl9BQ1RJVklUWV9USU1FU1RBTVBfRU5ELmZvcm1hdChkYXRhKVxyXG4gICAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYodGltZXN0YW1wcy5zdGFydCAhPT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChjb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe30sIHVzZWRQcm9wcywge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IE1lc3NhZ2VzLlVTRVJfQUNUSVZJVFlfVElNRVNUQU1QX1NUQVJULmZvcm1hdChkYXRhKVxyXG4gICAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG51bGxcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVGltZVJlbmRlclxyXG59O1xyXG5cclxuZnVuY3Rpb24gY2hlY2tVbml4KGUpIHtcclxuICAgIHJldHVybiAoXCJcIiArIGUpLmxlbmd0aCA8IDEzID8gMWUzICogZSA6IGVcclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5pbXBvcnQgWFN2ZyBmcm9tIFwiLi94U3ZnXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfVG9vbHMgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLm9uQ2xpY2sgPSB0aGlzLm9uQ2xpY2suYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgbGV0IHRvb2xzTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUudG9vbHNDb250YWluZXIpWzBdXHJcbiAgICAgICAgbGV0IGNvbnRhaW5lck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRhaW5lciAmJiBlLmNsb3NlQnV0dG9uICYmIGUuY2xvc2VCdXR0b25Cb2xkKVswXVxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJ0b29scy1jb250YWluZXIgXCIrdG9vbHNNb2R1bGUudG9vbHNDb250YWluZXJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJ0b29scyBcIit0b29sc01vZHVsZS50b29sc30sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogY29udGFpbmVyTW9kdWxlLmNvbnRhaW5lcn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiYnRuLWNsb3NlIFwiK2NvbnRhaW5lck1vZHVsZS5jbG9zZUJ1dHRvbiwgb25DbGljazogdGhpcy5vbkNsaWNrfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFhTdmcsIG51bGwpXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiZXNjLXRleHQgXCIrY29udGFpbmVyTW9kdWxlLmtleWJpbmR9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkVTQ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uQ2xpY2spIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNsaWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNsb3NlQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5cIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jbG9zZUJ1dHRvbiAmJiBlLmtleWJpbmRCb2xkKVswXS5jbG9zZUJ1dHRvbi5zcGxpdChcIiBcIilbMF0pO1xyXG4gICAgICAgIGlmIChjbG9zZUJ1dHRvbikgY2xvc2VCdXR0b24uY2xpY2soKTtcclxuICAgIH1cclxufSIsIi8qKlxyXG4gKiBUb29sdGlwIHRoYXQgYXV0b21hdGljYWxseSBzaG93IGFuZCBoaWRlIHRoZW1zZWx2ZXMgb24gbW91c2VlbnRlciBhbmQgbW91c2VsZWF2ZSBldmVudHMuXHJcbiAqIFdpbGwgYWxzbyByZW1vdmUgdGhlbXNlbHZlcyBpZiB0aGUgbm9kZSB0byB3YXRjaCBpcyByZW1vdmVkIGZyb20gRE9NIHRocm91Z2hcclxuICogYSBNdXRhdGlvbk9ic2VydmVyLlxyXG4gKlxyXG4gKiBOb3RlIHRoaXMgaXMgbm90IHVzaW5nIERpc2NvcmQncyBpbnRlcm5hbHMgYnV0IG5vcm1hbCBET00gbWFuaXB1bGF0aW9uIGFuZCBlbXVsYXRlc1xyXG4gKiBEaXNjb3JkJ3Mgb3duIHRvb2x0aXBzIGFzIGNsb3NlbHkgYXMgcG9zc2libGUuXHJcbiAqXHJcbiAqIEBtb2R1bGUgRW11bGF0ZWRUb29sdGlwXHJcbiAqIEB2ZXJzaW9uIDAuMC4xXHJcbiAqL1xyXG5cclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi9tb2R1bGVzL3V0aWxzXCI7XHJcbmltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi4vbW9kdWxlcy93ZWJwYWNrTW9kdWxlc1wiO1xyXG5cclxuLy88ZGl2IGNsYXNzPVwibGF5ZXItdjlIeVljIGRpc2FibGVkUG9pbnRlckV2ZW50cy0xcHRnVEJcIiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMjM3cHg7IGJvdHRvbTogNTFweDtcIj5cclxuLy9cdDxkaXYgY2xhc3M9XCJ0b29sdGlwLTJRZkx0YyB0b29sdGlwVG9wLVhERFN4eCB0b29sdGlwQmxhY2stUFBHNDd6IHRvb2x0aXBEaXNhYmxlUG9pbnRlckV2ZW50cy0zZWFCR05cIiBzdHlsZT1cIm9wYWNpdHk6IDE7IHRyYW5zZm9ybTogbm9uZTtcIj5cclxuLy9cdFx0PGRpdiBjbGFzcz1cInRvb2x0aXBQb2ludGVyLTNaZmlyS1wiPjwvZGl2PlxyXG4vL1x0XHQ8ZGl2IGNsYXNzPVwidG9vbHRpcENvbnRlbnQtYnFWTFdLXCI+VXNlciBTZXR0aW5nczwvZGl2PlxyXG4vL1x0PC9kaXY+XHJcbi8vPC9kaXY+XHJcblxyXG4vLzxkaXYgY2xhc3M9XCJsYXllci12OUh5WWNcIiBzdHlsZT1cInRvcDogODYwcHg7IGxlZnQ6IDYzMi41cHg7XCI+XHJcbi8vXHQ8ZGl2IGNsYXNzPVwidG9vbHRpcC0yUWZMdGMgdG9vbHRpcEJsYWNrLVBQRzQ3eiB0b29sdGlwVG9wLVhERFN4eFwiPlxyXG4vL1x0XHQ8ZGl2IGNsYXNzPVwidG9vbHRpcFBvaW50ZXItM1pmaXJLXCI+PC9kaXY+XHJcbi8vXHRcdENoYW5nZWxvZ1xyXG4vL1x0PC9kaXY+XHJcbi8vPC9kaXY+XHJcbmxldCBUb29sdGlwQ2xhc3Nlc1xyXG5mdW5jdGlvbiBnZXRUb29sdGlwQ2xhc3Nlcygpe1xyXG5cdGlmKFRvb2x0aXBDbGFzc2VzKXJldHVybiBUb29sdGlwQ2xhc3Nlc1xyXG5cdHJldHVybiBUb29sdGlwQ2xhc3NlcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwidG9vbHRpcFwiLCBcInRvb2x0aXBCbGFja1wiKTtcclxufVxyXG5sZXQgVG9vbHRpcExheWVyc1xyXG5mdW5jdGlvbiBnZXRUb29sdGlwTGF5ZXJzKCl7XHJcblx0aWYoVG9vbHRpcExheWVycylyZXR1cm4gVG9vbHRpcExheWVyc1xyXG5cdHJldHVybiBUb29sdGlwTGF5ZXJzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJsYXllclwiLCBcImxheWVyQ29udGFpbmVyXCIpO1xyXG59XHJcblxyXG5jb25zdCBnZXRDbGFzcyA9IGZ1bmN0aW9uKHNpZGVPckNvbG9yKSB7XHJcbiAgICBjb25zdCB1cHBlckNhc2UgPSBzaWRlT3JDb2xvclswXS50b1VwcGVyQ2FzZSgpICsgc2lkZU9yQ29sb3Iuc2xpY2UoMSk7XHJcbiAgICBjb25zdCB0b29sdGlwQ2xhc3MgPSBnZXRUb29sdGlwQ2xhc3NlcygpW2B0b29sdGlwJHt1cHBlckNhc2V9YF07XHJcbiAgICBpZiAodG9vbHRpcENsYXNzKSByZXR1cm4gdG9vbHRpcENsYXNzO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5jb25zdCBjbGFzc0V4aXN0cyA9IGZ1bmN0aW9uKHNpZGVPckNvbG9yKSB7XHJcbiAgICByZXR1cm4gZ2V0Q2xhc3Moc2lkZU9yQ29sb3IpID8gdHJ1ZSA6IGZhbHNlO1xyXG59O1xyXG5cclxuY29uc3QgdG9QeCA9IGZ1bmN0aW9uKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gYCR7dmFsdWV9cHhgO1xyXG59O1xyXG5cclxuLyogPGRpdiBjbGFzcz1cImxheWVyLXY5SHlZYyBkYS1sYXllclwiIHN0eWxlPVwibGVmdDogMjM0LjVweDsgYm90dG9tOiA1MXB4O1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInRvb2x0aXAtMlFmTHRjIGRhLXRvb2x0aXAgdG9vbHRpcFRvcC1YRERTeHggdG9vbHRpcEJsYWNrLVBQRzQ3elwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0b29sdGlwUG9pbnRlci0zWmZpcksgZGEtdG9vbHRpcFBvaW50ZXJcIj48L2Rpdj5cclxuICAgICAgICBVc2VyIFNldHRpbmdzXHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+ICovXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbXVsYXRlZFRvb2x0aXAge1xyXG5cdC8qKlxyXG5cdCAqXHJcblx0ICogQGNvbnN0cnVjdG9yXHJcblx0ICogQHBhcmFtIHsoSFRNTEVsZW1lbnR8alF1ZXJ5KX0gbm9kZSAtIERPTSBub2RlIHRvIG1vbml0b3IgYW5kIHNob3cgdGhlIHRvb2x0aXAgb25cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGlwIC0gc3RyaW5nIHRvIHNob3cgaW4gdGhlIHRvb2x0aXBcclxuXHQgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIGFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgdGhlIHRvb2x0aXBcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuc3R5bGU9YmxhY2tdIC0gY29ycmVsYXRlcyB0byB0aGUgZGlzY29yZCBzdHlsaW5nL2NvbG9ycyAoYmxhY2ssIGJyYW5kLCBncmVlbiwgZ3JleSwgcmVkLCB5ZWxsb3cpXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNpZGU9dG9wXSAtIGNhbiBiZSBhbnkgb2YgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0XHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5wcmV2ZW50RmxpcD1mYWxzZV0gLSBwcmV2ZW50cyBtb3ZpbmcgdGhlIHRvb2x0aXAgdG8gdGhlIG9wcG9zaXRlIHNpZGUgaWYgaXQgaXMgdG9vIGJpZyBvciBnb2VzIG9mZnNjcmVlblxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kaXNhYmxlZD1mYWxzZV0gLSB3aGV0aGVyIHRoZSB0b29sdGlwIHNob3VsZCBiZSBkaXNhYmxlZCBmcm9tIHNob3dpbmcgb24gaG92ZXJcclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvcihub2RlLCB0ZXh0LCBvcHRpb25zID0ge30pIHtcclxuXHRcdGNvbnN0IHtzdHlsZSA9IFwiYmxhY2tcIiwgc2lkZSA9IFwidG9wXCIsIHByZXZlbnRGbGlwID0gZmFsc2UsIGRpc2FibGVkID0gZmFsc2V9ID0gb3B0aW9ucztcclxuXHRcdHRoaXMubm9kZSA9IG5vZGUgaW5zdGFuY2VvZiBqUXVlcnkgPyBub2RlWzBdIDogbm9kZTtcclxuICAgICAgICB0aGlzLmxhYmVsID0gdGV4dDtcclxuICAgICAgICB0aGlzLnN0eWxlID0gc3R5bGUudG9Mb3dlckNhc2UoKTtcclxuXHRcdHRoaXMuc2lkZSA9IHNpZGUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICB0aGlzLnByZXZlbnRGbGlwID0gcHJldmVudEZsaXA7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkO1xyXG5cclxuICAgICAgICBpZiAoIWNsYXNzRXhpc3RzKHRoaXMuc2lkZSkpIHJldHVybiBVdGlscy5lcnIoXCJFbXVsYXRlZFRvb2x0aXBcIiwgYFNpZGUgJHt0aGlzLnNpZGV9IGRvZXMgbm90IGV4aXN0LmApO1xyXG5cdFx0aWYgKCFjbGFzc0V4aXN0cyh0aGlzLnN0eWxlKSkgcmV0dXJuIFV0aWxzLmVycihcIkVtdWxhdGVkVG9vbHRpcFwiLCBgU3R5bGUgJHt0aGlzLnN0eWxlfSBkb2VzIG5vdCBleGlzdC5gKTtcclxuXHRcdFxyXG5cdFx0dGhpcy5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHRcdHRoaXMuZWxlbWVudC5jbGFzc05hbWUgPSBnZXRUb29sdGlwTGF5ZXJzKCkubGF5ZXIgKyBcIiBcIiArIGdldFRvb2x0aXBMYXllcnMoKS5kaXNhYmxlZFBvaW50ZXJFdmVudHM7XHJcblxyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTmFtZSA9IGAke2dldFRvb2x0aXBDbGFzc2VzKCkudG9vbHRpcH0gJHtnZXRDbGFzcyh0aGlzLnN0eWxlKX1gO1xyXG5cclxuXHRcdHRoaXMubGFiZWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHRcdHRoaXMubGFiZWxFbGVtZW50LmNsYXNzTmFtZSA9IGdldFRvb2x0aXBDbGFzc2VzKCkudG9vbHRpcENvbnRlbnRcclxuXHJcblx0XHRjb25zdCBwb2ludGVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblx0XHRwb2ludGVyRWxlbWVudC5jbGFzc05hbWUgPSBnZXRUb29sdGlwQ2xhc3NlcygpLnRvb2x0aXBQb2ludGVyO1xyXG5cclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuYXBwZW5kKHBvaW50ZXJFbGVtZW50KTtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuYXBwZW5kKHRoaXMubGFiZWxFbGVtZW50KTtcclxuXHRcdHRoaXMuZWxlbWVudC5hcHBlbmQodGhpcy50b29sdGlwRWxlbWVudCk7XHJcblxyXG5cdFx0dGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy5zaG93KCk7XHJcblxyXG5cdFx0XHRjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcclxuXHRcdFx0XHRtdXRhdGlvbnMuZm9yRWFjaCgobXV0YXRpb24pID0+IHtcclxuXHRcdFx0XHRcdGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xyXG5cdFx0XHRcdFx0Y29uc3QgZGlyZWN0TWF0Y2ggPSBub2Rlcy5pbmRleE9mKHRoaXMubm9kZSkgPiAtMTtcclxuXHRcdFx0XHRcdGNvbnN0IHBhcmVudE1hdGNoID0gbm9kZXMuc29tZShwYXJlbnQgPT4gcGFyZW50LmNvbnRhaW5zKHRoaXMubm9kZSkpO1xyXG5cdFx0XHRcdFx0aWYgKGRpcmVjdE1hdGNoIHx8IHBhcmVudE1hdGNoKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuaGlkZSgpO1xyXG5cdFx0XHRcdFx0XHRvYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0b2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7c3VidHJlZTogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlfSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLmhpZGUoKTtcclxuXHRcdH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBDb250YWluZXIgd2hlcmUgdGhlIHRvb2x0aXAgd2lsbCBiZSBhcHBlbmRlZC4gKi9cclxuICAgIGdldCBjb250YWluZXIoKSB7IHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLlwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLnBvcG91dHMpWzBdLnBvcG91dHMuc3BsaXQoXCIgXCIpWzBdK1wiIH4gLlwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmxheWVyQ29udGFpbmVyKVswXS5sYXllckNvbnRhaW5lci5zcGxpdChcIiBcIilbMF0pOyB9XHJcbiAgICAvKiogQm9vbGVhbiByZXByZXNlbnRpbmcgaWYgdGhlIHRvb2x0aXAgd2lsbCBmaXQgb24gc2NyZWVuIGFib3ZlIHRoZSBlbGVtZW50ICovXHJcbiAgICBnZXQgY2FuU2hvd0Fib3ZlKCkgeyByZXR1cm4gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQgPj0gMDsgfVxyXG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiBiZWxvdyB0aGUgZWxlbWVudCAqL1xyXG4gICAgZ2V0IGNhblNob3dCZWxvdygpIHsgcmV0dXJuIHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB0aGlzLm5vZGUub2Zmc2V0SGVpZ2h0ICsgdGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCA8PSBVdGlscy5zY3JlZW5IZWlnaHQ7IH1cclxuICAgIC8qKiBCb29sZWFuIHJlcHJlc2VudGluZyBpZiB0aGUgdG9vbHRpcCB3aWxsIGZpdCBvbiBzY3JlZW4gdG8gdGhlIGxlZnQgb2YgdGhlIGVsZW1lbnQgKi9cclxuICAgIGdldCBjYW5TaG93TGVmdCgpIHsgcmV0dXJuIHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoID49IDA7IH1cclxuICAgIC8qKiBCb29sZWFuIHJlcHJlc2VudGluZyBpZiB0aGUgdG9vbHRpcCB3aWxsIGZpdCBvbiBzY3JlZW4gdG8gdGhlIHJpZ2h0IG9mIHRoZSBlbGVtZW50ICovXHJcblx0Z2V0IGNhblNob3dSaWdodCgpIHsgcmV0dXJuIHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgdGhpcy5ub2RlLm9mZnNldFdpZHRoICsgdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoIDw9IFV0aWxzLnNjcmVlbldpZHRoOyB9XHJcblxyXG4gICAgLyoqIEhpZGVzIHRoZSB0b29sdGlwLiBBdXRvbWF0aWNhbGx5IGNhbGxlZCBvbiBtb3VzZWxlYXZlLiAqL1xyXG5cdGhpZGUoKSB7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgICAgIHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NOYW1lID0gdGhpcy5fY2xhc3NOYW1lO1xyXG5cdH1cclxuXHJcbiAgICAvKiogU2hvd3MgdGhlIHRvb2x0aXAuIEF1dG9tYXRpY2FsbHkgY2FsbGVkIG9uIG1vdXNlZW50ZXIuIFdpbGwgYXR0ZW1wdCB0byBmbGlwIGlmIHBvc2l0aW9uIHdhcyB3cm9uZy4gKi9cclxuXHRzaG93KCkge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NOYW1lID0gYCR7Z2V0VG9vbHRpcENsYXNzZXMoKS50b29sdGlwfSAke2dldENsYXNzKHRoaXMuc3R5bGUpfWA7XHJcblx0XHR0aGlzLmxhYmVsRWxlbWVudC50ZXh0Q29udGVudCA9IHRoaXMubGFiZWw7XHJcblx0XHR0aGlzLmNvbnRhaW5lci5hcHBlbmQodGhpcy5lbGVtZW50KTtcclxuXHJcblx0XHRpZiAodGhpcy5zaWRlID09IFwidG9wXCIpIHtcclxuXHRcdFx0aWYgKHRoaXMuY2FuU2hvd0Fib3ZlIHx8ICghdGhpcy5jYW5TaG93QWJvdmUgJiYgdGhpcy5wcmV2ZW50RmxpcCkpIHRoaXMuc2hvd0Fib3ZlKCk7XHJcblx0XHRcdGVsc2UgdGhpcy5zaG93QmVsb3coKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5zaWRlID09IFwiYm90dG9tXCIpIHtcclxuXHRcdFx0aWYgKHRoaXMuY2FuU2hvd0JlbG93IHx8ICghdGhpcy5jYW5TaG93QmVsb3cgJiYgdGhpcy5wcmV2ZW50RmxpcCkpIHRoaXMuc2hvd0JlbG93KCk7XHJcblx0XHRcdGVsc2UgdGhpcy5zaG93QWJvdmUoKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5zaWRlID09IFwibGVmdFwiKSB7XHJcblx0XHRcdGlmICh0aGlzLmNhblNob3dMZWZ0IHx8ICghdGhpcy5jYW5TaG93TGVmdCAmJiB0aGlzLnByZXZlbnRGbGlwKSkgdGhpcy5zaG93TGVmdCgpO1xyXG5cdFx0XHRlbHNlIHRoaXMuc2hvd1JpZ2h0KCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMuc2lkZSA9PSBcInJpZ2h0XCIpIHtcclxuXHRcdFx0aWYgKHRoaXMuY2FuU2hvd1JpZ2h0IHx8ICghdGhpcy5jYW5TaG93UmlnaHQgJiYgdGhpcy5wcmV2ZW50RmxpcCkpIHRoaXMuc2hvd1JpZ2h0KCk7XHJcblx0XHRcdGVsc2UgdGhpcy5zaG93TGVmdCgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCBhYm92ZSB0aGUgbm9kZS4gKi9cclxuXHRzaG93QWJvdmUoKSB7XHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJ0b3BcIikpO1xyXG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwidG9wXCIsIHRvUHgodGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQgLSAxMCkpO1xyXG5cdFx0dGhpcy5jZW50ZXJIb3Jpem9udGFsbHkoKTtcclxuXHR9XHJcblxyXG4gICAgLyoqIEZvcmNlIHNob3dpbmcgdGhlIHRvb2x0aXAgYmVsb3cgdGhlIG5vZGUuICovXHJcblx0c2hvd0JlbG93KCkge1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5jbGFzc0xpc3QuYWRkKGdldENsYXNzKFwiYm90dG9tXCIpKTtcclxuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcInRvcFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB0aGlzLm5vZGUub2Zmc2V0SGVpZ2h0ICsgMTApKTtcclxuXHRcdHRoaXMuY2VudGVySG9yaXpvbnRhbGx5KCk7XHJcblx0fVxyXG5cclxuICAgIC8qKiBGb3JjZSBzaG93aW5nIHRoZSB0b29sdGlwIHRvIHRoZSBsZWZ0IG9mIHRoZSBub2RlLiAqL1xyXG5cdHNob3dMZWZ0KCkge1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5jbGFzc0xpc3QuYWRkKGdldENsYXNzKFwibGVmdFwiKSk7XHJcblx0XHR0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJsZWZ0XCIsIHRvUHgodGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSB0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggLSAxMCkpO1xyXG5cdFx0dGhpcy5jZW50ZXJWZXJ0aWNhbGx5KCk7XHJcblx0fVxyXG5cclxuICAgIC8qKiBGb3JjZSBzaG93aW5nIHRoZSB0b29sdGlwIHRvIHRoZSByaWdodCBvZiB0aGUgbm9kZS4gKi9cclxuXHRzaG93UmlnaHQoKSB7XHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJyaWdodFwiKSk7XHJcblx0XHR0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJsZWZ0XCIsIHRvUHgodGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyB0aGlzLm5vZGUub2Zmc2V0V2lkdGggKyAxMCkpO1xyXG5cdFx0dGhpcy5jZW50ZXJWZXJ0aWNhbGx5KCk7XHJcblx0fVxyXG5cclxuXHRjZW50ZXJIb3Jpem9udGFsbHkoKSB7XHJcbiAgICAgICAgY29uc3Qgbm9kZWNlbnRlciA9IHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgKHRoaXMubm9kZS5vZmZzZXRXaWR0aCAvIDIpO1xyXG4gICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcImxlZnRcIiwgdG9QeChub2RlY2VudGVyIC0gKHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCAvIDIpKSk7XHJcblx0fVxyXG5cclxuXHRjZW50ZXJWZXJ0aWNhbGx5KCkge1xyXG5cdFx0Y29uc3Qgbm9kZWNlbnRlciA9IHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyAodGhpcy5ub2RlLm9mZnNldEhlaWdodCAvIDIpO1xyXG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwidG9wXCIsIHRvUHgobm9kZWNlbnRlciAtICh0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0IC8gMikpKTtcclxuXHR9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgVG9vbHRpcCBmcm9tIFwiLi90b29sdGlwXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjb21wb25lbnREaWRNb3VudCgpIHtcclxuICAgICAgICBjb25zdCB7c3R5bGUgPSBcImJsYWNrXCIsIHNpZGUgPSBcInRvcFwiLCB0ZXh0ID0gXCJcIn0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIHRoaXMubm9kZSA9IEJEVjIucmVhY3REb20uZmluZERPTU5vZGUodGhpcyk7XHJcbiAgICAgICAgdGhpcy50b29sdGlwID0gbmV3IFRvb2x0aXAodGhpcy5ub2RlLCB0ZXh0LCB7c3R5bGUsIHNpZGV9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcclxuICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLnRvb2x0aXA7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19YU3ZnIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJzdmdcIixcclxuICAgICAgICAgICAge3htbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIHZpZXdCb3g6IFwiMCAwIDEyIDEyXCIsIHN0eWxlOiB7d2lkdGg6IFwiMThweFwiLCBoZWlnaHQ6IFwiMThweFwifX0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZ1wiLFxyXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJiYWNrZ3JvdW5kXCIsIGZpbGw6IFwibm9uZVwiLCBmaWxsUnVsZTogXCJldmVub2RkXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZDogXCJNMCAwaDEydjEySDBcIn0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7Y2xhc3NOYW1lOiBcImZpbGxcIiwgZmlsbDogXCIjZGNkZGRlXCIsIGQ6IFwiTTkuNSAzLjIwNUw4Ljc5NSAyLjUgNiA1LjI5NSAzLjIwNSAyLjVsLS43MDUuNzA1TDUuMjk1IDYgMi41IDguNzk1bC43MDUuNzA1TDYgNi43MDUgOC43OTUgOS41bC43MDUtLjcwNUw2LjcwNSA2XCJ9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNyeXB0b1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVjdHJvblwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJldmVudHNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZnNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibWtkaXJwXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm1vZHVsZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJub2RlLWZldGNoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInBhdGhcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmltcmFmXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInlhdXpsXCIpOyJdLCJzb3VyY2VSb290IjoiIn0= |